我在HTML页面中嵌入了一个NPAPI插件。当我从浏览器的开发者控制台调用一个方法时,一切正常 - 方法调用登陆正确的插件实例并正确执行。无论如何,当我从JS回调调用相同的方法时,例如按钮点击,插件被销毁并再次重新创建,而NPP.pdata
被设置为null。
它能否以某种方式与JS多线程模型相关,如何解决?
答案 0 :(得分:1)
我明白了。这个问题与NPAPI或JS多线程无关。
我在HTML表单中调用NPAPI插件对象上的方法。
<form>
<input id="whatever-button" type="submit" value="Whatever"></input>
</form>
<script type="text/javascript">
$('#whatever-button').click(function(e) {
var plugin = document.getElementById('plugin');
plugin.whatever();
});
</script>
我没有考虑的是页面重新加载 - 这是单击按钮后的默认操作。页面重新加载然后触发插件对象重新创建,它足够快,所以我没有注意到它。只需将e.preventDefault();
添加到回调函数即可解决问题。这就是工作代码的样子。
<embed id="plugin" type="application/my-npapi-plugin" width="640" height="480">
<form>
<input id="whatever-button" type="submit" value="Whatever"></input>
</form>
<script type="text/javascript">
$('#whatever-button').click(function(e) {
e.preventDefault();
var plugin = document.getElementById('plugin');
plugin.whatever();
});
</script>
UPD:实际上,将输入类型设置为button
而不是submit
是解决问题的更简单方法。它也不需要e.preventDefault();
。