我有一个使用htmlWindow的应用程序,并希望将其迁移到wx 2.9中的新webview。但是,我了解到没有可用于将JavaScript变量从网页传递回Python代码的内置方法。有一个RunScript方法允许用户将JavaScript发送到页面,但没有方法可以在用户点击或任何其他用户交互中检索元素ID。
我的问题是,这有什么解决方法吗?有没有办法拦截,比如说,警报电话或其他任何东西,并获取数据?如果无法从用户交互中接收数据,则webview显示的价值不大。
答案 0 :(得分:1)
据我所知,从RunScript()获取返回值的唯一方法是使用页面标题hack。
e.g。在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方案时,例如, retrieveata:// 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
或者你可以使用这两个想法的组合并创建一个URL,当访问时调用GetPageTitle()并确保在调用页面之前设置document.title。
答案 1 :(得分:0)
最近有一些关于wx-users邮件列表的讨论以及对此类事情的解决方法的建议。我自己没试过,但你可能觉得它很有用。见https://groups.google.com/d/topic/wx-users/Pdzl7AYPI4I/discussion