NPAPI标准提供了一套插件与JS的交互机制。
1. javascript调用插件方法: 浏览器首先会调用NPP_GetValue(NPP instance, NPPVariable variable, void* value)取得NPObject对象的地址。Variable参数为NPPVpluginScriptableNPObject。在取得该对象后浏览器就可以调用插件提供的NPClass函数。最主要的函数有下面几个: pluginHasMethod :询问插件是否支持某一js方法。 pluginHasProperty :询问插件是否具有某一属性 pluginInvoke : 当插件支持某一方法时,浏览器将会调用该函数执行插件为js提供的这一方法。那么对于提供的很多方法插件如何在该函数内区分。分析这个函数: pluginInvoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); obj是插件里的NPObject对象地址。 Name表示插件提供方法的名字,通过对比这个参数来区分插件提供的不同方法。 args和argcount分别表示js传来的参数地址和参数个数。 result是函数返回给js的结果。
2. 插件调用js内部的回调函数: Js可以通过2种方式为插件设置回调函数。示例如下: <script language=javascript> Plugin.Onfun = fun;//方式一 通过设置插件属性传入回调函数地址 Plugin.Onfun(fun);//方式二 通过调用插件函数传入回调函数地址 Function fun(){} </script>
在插件内部,当js函数地址传到插件时,浏览器把它封装为一个NPObject对象,里面存有函数地址 方式一: 在插件内部,浏览器会调用pluginHasproperty确认插件是否有该属性。如果有然后浏览器调用pluginSetproperty函数。pluginSetProperty(NPObject *obj, NPIdentifier name, const NPVariant *variant)的第二个参数判断是哪个属性,第三个参数就是NPObject对象地址。
方式二:在插件内部,浏览器会调用pluginHasmethod确定是否支持该方法。然后调用pluginInvoke,这里面的args参数包含了回调函数NPObject地址。 js设置完回调函数后,插件就可以调用该函数了。需要使用NPN_InvokeDefault,示例代码如下: bool bret = gBrowser->invokeDefault(npp, callbackNPObject, &pV, 1, &result);
另外,插件也可以直接调用js中的函数。在插件内部调用浏览器的getUrl函数。具体格式如下: gBrowser->geturl(inst(), “javascript:function()”, "_self"); 如果想传入整数参数,上面函数第二个参数应写成: “javascript:function(“+num+”)”。 如果传入字符串参数,上面函数第二个参数为: “javascript:function(/’“+”string”+”/’)”。如果字符串含有中文,需要进行url encode。
————————————————
版权声明:本文为CSDN博主「Crazy_BigBoy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tgdzsjh/article/details/21447667