我在HTML页面中嵌入了NPAPI插件。当我从浏览器的开发人员控制台在其上调用方法时,一切正常-方法调用落在正确的插件实例上并正确执行。无论如何,当我从JS回调调用相同的方法时,例如单击按钮,例如,插件被销毁并再次创建,而NPP.pdata设置为null。

可以和JS多线程模型建立某种联系吗?如何解决?

最佳答案

我想到了。该问题根本与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();

07-25 23:51