背景:
自从更新到2.9.4以来,我已经开始将pygtk版本的webkit切换到wxPython附带的新html2 webview。
问题:
从我从文档(http://wxpython.org/Phoenix/docs/html/html2.WebView.html#html2-webview)中可以看到,没有办法(使用python)检测链接何时悬停(例如"hover -over-link"事件http://webkitgtk.org/reference/webkitgtk/stable/webkitgtk-webkitwebview.html#WebKitWebView-hovering-over-link)。
我将不得不诉诸一些javascript黑客来做到这一点,还是有另一个,更好的,解决方案?
所以,直到这得到添加,我只是与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_navigation事件,捕捉任何自定义页面更改并否决页面更改事件,例如
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
...
应该可以添加它。在trac.wxwidgets.org上为它添加一个票
Ross给出的解决方案是有效的,直到我得到一个本地。html文件被IE8不优雅地劫持:res://ieframe.dll/dnserrordiagoff_webOC.htm#file:///
然后我想到了前缀"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部分保持不变),我用"127.0.0.3:87/PROXY/HOVER_EVENT_START/"
代替"PROXY/HOVER_EVENT_START/"
,用"127.0.0.3:87/PROXY/HOVER_EVENT_END/"
代替"PROXY/HOVER_EVENT_END/"
。果不其然。
超链接是因特网和HTML之所以存在être的原因。为什么呢?html2 API没有提供简单的方法来处理它们,这对我来说是一个谜。