在wxPython的html2-webview中检测链接鼠标悬停事件

时间:2013-06-05 20:30:47

标签: webview wxpython wx.html2

背景:

自从更新到2.9.4后,我开始将一个(经过黑客入侵)的pygtk版本的webkit转换为wxPython附带的新html2 webview。

问题:

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

我是否不得不诉诸一些javascript hackery来做这件事,还是有其他更好的解决方案?

3 个答案:

答案 0 :(得分: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]);
    }

每次在任何页面链接上发生鼠标输入/输出事件时,都会导致页面更改事件。网址的最后部分包含相关链接。

然后我们挂钩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
    ...

答案 1 :(得分:3)

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

答案 2 :(得分:0)

Ross给出的解决方案一直在工作,直到我得到IE8非常劫持的本地.html文件:res://ieframe.dll/dnserrordiagoff_webOC.htm#file:///

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

然后我想到了“PROXY / ...”字符串前缀为“127.0.0.1”之类的有效URI。但是还不够。但我终于通过添加一个端口来实现它:“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/"。 Etvoilà。

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