背景:
自从更新到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来做这件事,还是有其他更好的解决方案?
答案 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没有提供简单的方法来处理它们,这对我来说是一个谜。