我有一个使用 htmlWindow 的应用程序,并希望将其迁移到 wx 2.9 中的新 webview。但是,我了解到没有可用于将 JavaScript 变量从网页传回 Python 代码的内置方法。有一种 RunScript 方法允许将 JavaScript 发送到页面,但没有方法可以在用户单击或任何其他用户交互时检索元素 id。
我的问题是,有什么解决方法吗?有没有办法拦截警报呼叫或其他任何东西并获取数据?如果无法从用户交互中接收数据,那么 webview 显示就没有多大价值。
据我所知,从 RunScript() 获取返回值的唯一方法是使用页面标题 hack。
例如,在 RunScript 中的某处,您将 document.title 设置为您希望检索的值并使用 GetCurrentTitle() 将其输入 python,如果您希望在检索数据后可以重置标题。
所以如果 self.html 是 webview
self.html.RunScript("""
//javascript goes here
// variable we wish to retrieve is called return_value
document.title = return_value
""")
r = self.html.GetCurrentTitle()
如果您想从 webview 中启动它,可以通过覆盖 wxEVT_COMMAND_WEB_VIEW_NAVIGATING 来完成(如 Robin 发布的链接中所建议的那样),以便当它接收到自定义 url 方案时,例如,retrievedata://data/.... 它检索来自 url 的数据并做任何你想做的事,确保你在某个时候调用 evt.Veto()。然后,您可以通过简单地从 javascript 中调用合适的 url 来传递您希望的任何数据。
下面完全未经测试的代码(只是为了让您了解它是如何完成的)
def OnPageNavigation(self, evt):
url = evt.GetUrl()
if url.startswith("retrievedata://data/"):
data = url[len("retrievedata://data/"):]
evt.Veto()
// Do whatever you want with the data
或者,您可以结合使用这两种想法并创建一个在访问时调用 GetPageTitle() 的 url,并确保在调用页面之前设置 document.title。
最近有一些关于 wx-users 邮件列表的讨论,以及针对此类问题的解决方法的建议。我自己没有尝试过,但您可能会发现它很有用。见https://groups.google.com/d/topic/wx-users/Pdzl7AYPI4I/discussion