2

背景:

自从更新到 2.9.4 以来,我已经开始将 webkit 的(被入侵的)pygtk 版本切换到 wxPython 附带的新的 html2 webview。

问题:

从我从文档(http://wxpython.org/Phoenix/docs/html/html2.WebView.html#html2-webview)中可以看到,没有办法(使用python)检测链接何时悬停(如“hovering-over-link”事件http://webkitgtk.org/reference/webkitgtk/stable/webkitgtk-webkitwebview.html#WebKitWebView-hovering-over-link)。

我将不得不求助于一些 javascript 黑客来做到这一点,还是有另一个更好的解决方案?

4

3 回答 3

4

因此,在添加此内容之前,我刚刚使用了 javascript 解决方案。为此,我们使用 javascript 创建一个页面更改事件,该事件在 python 代码中被否决。

首先,每次加载页面时,我们都会运行以下 javascript(使用 RunScript)

    function hoverLink(link) { 
        window.location.href = "PROXY/HOVER_EVENT_START/" + link;
    }
    function hoverLinkEnd(link) { 
        window.location.href = "PROXY/HOVER_EVENT_END/" + link;
    }

    function setupHoverLinks(elem) { 
        elem.onmouseover = function() {
            hoverLink(elem.href);
        }
        elem.onmouseout = function() {
            hoverLinkEnd(elem.href);
        }
    }

    // Loop through all links in the document and
    // setup some event listeners.
    links = document.getElementsByTagName("a");

    for (var i = 0; i < links.length; i++) {
            link = links[i].href;
            setupHoverLinks(links[i]);
    }

每次在任何页面链接上发生鼠标移入/移出事件时,这将导致页面更改事件。url 的最后部分包含相关链接。

然后我们挂钩 EVT_WEB_VIEW_NAVIGATING 事件,捕捉我们的任何自定义页面更改并否决页面更改事件,例如

def OnPageNavigation(self, evt):
    ...
    uri = evt.GetURL() # you may need to deal with unicode here

    if "PROXY/HOVER_EVENT_START/" in uri:
        # Simple way to get the link
        link = uri.split("PROXY/HOVER_EVENT_START/")[1]
        ...
        # Run your mouseover code
        ...
        evt.Veto()
        return
    elif "PROXY/HOVER_EVENT_END/" in uri:
        ...
        # Run your mouseout code
        ...
        evt.Veto()
        return
    ...
于 2013-06-08T10:36:02.677 回答
3

应该可以添加它。在 trac.wxwidgets.org 上为它添加一张票。

于 2013-06-06T01:49:14.683 回答
1

罗斯给出的解决方案一直有效,直到我得到一个被 IE8 劫持的本地 .html 文件:res://ieframe.dll/dnserrordiagoff_webOC.htm#file:///

是的,我使用的是 Windows 7 x64。错误首先发生在 IE11 上,但在寻找解决方案失败后,我决定卸载它并将 IE8 重置为其默认设置(包括移回其临时文件夹)。令我沮丧的是,那没有用。

然后我想到在“PROXY/...”字符串前面加上一个有效的 URI,比如“127.0.0.1”。不过还不够。但我终于通过添加一个端口来让它工作:“127.0.0.1:80”。由于本地服务器经常使用此 URI,因此您可以使用其他值,例如“127.0.0.3:87”。用 wx 3.0.2 和 python 2.7.13 测试。

所以,在 javascript 部分(python 部分保持不变),我"PROXY/HOVER_EVENT_START/""127.0.0.3:87/PROXY/HOVER_EVENT_START/""PROXY/HOVER_EVENT_END/"替换了"127.0.0.3:87/PROXY/HOVER_EVENT_END/". 等等瞧。

超链接是 Internet 和 HTML 存在的理由。为什么 wx.html2 API 没有提供简单的方法来处理它们,这对我来说是个谜。

于 2017-09-17T18:05:43.470 回答