我在webview中使用Javascriptcore创建了c ++绑定,因此我的c ++ fns。和对象可以从html访问。 我已按照本教程创建这些绑定。 http://parmanoir.com/Taming_JavascriptCore_within_and_without_WebView
在重新加载页面之前,我没有创建和使用绑定的问题。 我打电话给" location.reload()"在我的html页面中,我丢失了所有绑定。
示例html代码是:
<html>
<head>
<style type="text/css">
body {
background-color: transparent;
}
p {
color: black;
background-color: rgb(255, 0, 255);
position: absolute;
top: 0;
left: 5;
margin: 0;
padding: 0;
}
</style>
<script type="text/javascript" language="JavaScript1.4"><!--
function testDummyModule()
{
if ( window.Dummy )
{
console.log("*** Dummy ID: " + window.Dummy.id);
}
else
{
console.log("[!] Dummy not supported.");
}
}
function init()
{
console.log("Testing Dummy");
testDummyModule();
console.log("Finished testing Dummy");
location.reload();
}
</script>
</head>
<body onload="init();">
<!--<p> This Page is loading without any problems</p>
<br>-->
<div id="test"></div>
<div id="text">Test Page</div>
</body>
</html>
在调用location.reload后重新加载页面时,我收到错误:&#34; Dummy,不支持。&#34;
我尝试重新创建绑定(通过删除创建bindigs的c ++类并再次创建它们),一旦我调用setUrl,但我仍然得到同样的错误。
任何线索,我怎样才能再次使绑定可用
答案 0 :(得分:0)
通过重新加载页面webkit接收新页面的新“全局”上下文,并且必须将绑定添加到此新上下文中。应该不需要删除绑定并重新创建它们,只需将它们添加到这个新的上下文中即可。
我不确定您的C ++代码是什么样的,但是例如我刚刚在我的Javascript绑定类中添加了一个重绑定函数,该类从webkit接收新的上下文并重新绑定“虚拟”对象。
void JsDummy::rebind(JSGlobalContextRef ctx)
{
// m_jsDummyClassRef is a JSClassRef created and stored in the JsDummy class
JSObjectRef JsDummyObjectRef = JSObjectMake(ctx, m_jsDummyClassRef, this);
JSObjectRef globalObjectRef = JSContextGetGlobalObject(ctx);
JSStringRef DummyName = JSStringCreateWithUTF8CString("Dummy");
// Attach the JavaSript object "Dummy" to the new global context
JSObjectSetProperty(ctx, globalObjectRef, DummyName, JsDummyObjectRef, kJSPropertyAttributeDontDelete, 0);
JSStringRelease(DummyName);
}
希望有所帮助。