提前致谢!!!!!
var pluginObject = null;
function init()
{
var pluginObject = document.getElementById('pluginObj'); //This is object for my Plugin.
pluginObject.onstartevent = handleEvent(); // This is working
//now i am calling one function in plugin that will return NPObject using invoke default
pluginObject.startEvent(function(e) {
e.onstartEvent = handleEvent(); //This is not working ......how to make it work
});
}
function handleEvent(e)
{
if(e)
{
alert(e);
}
}
<body onload = "init()" > </body>
这里我从body调用init函数,然后创建插件对象,然后调用一个属性onstartEvent,我在插件中注意。问题是“e.onstartEvent”如何捕获此对象并在此处调用。我没有得到它。对于PluginObject,我正在使用NPNVPlUGINOBJECT,然后检查属性“onstartEvent”(如果存在),然后检查has方法,最后在PLUGIN对象上调用。
//我的插件代码如下:
bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
char *pFunc = NPN_UTF8FromIdentifier(name);
if(!strcmp("startEvent",pFunc))
{
NPObject * argsVal = args[0].value.objectValue;
NPVariant valueToSend;
NPVariant returnValue;
valueToSend.type = NPVariantType_Object;
valueToSend.value.objectValue = this;
NPN_InvokeDefault(mNpp,argsVal,&valueToSend,1,&returnValue);
return true;
}
return false;
}
现在在HasProperty中检查名为“onstartEvent”的当前类属性
bool ScriptablePluginObject::HasProperty(NPIdentifier name)
{
char *pProp = NPN_UTF8FromIdentifier(name);
//Check which Properties are available
if( !strcmp( "onstartEvent", pProp ) )
{
return true;
}
return false;
}
现在在GetProperty中,我最终检查并将一些整数值返回到// handleEvent函数
bool ScriptablePluginObject::GetProperty(NPIdentifier name, NPVariant *result)
{
VOID_TO_NPVARIANT(*result);
char *pProp = NPN_UTF8FromIdentifier(name);
//onstartEvent
if(!strcmp("onstartEvent", pProp))
{
//Calling e.onstartEvent will come here in GetProperty
NPObject * pluginObj = NULL;
NPN_GetValue(mNpp,NPNVPluginElementNPObject,&pluginObj);
NPIdentifier id = NPN_GetStringIdentifier("onstartEvent");
bool val = NPN_HasMethod(mNpp,pluginObj,id);
NPVariant value;
NPVariant retVal;
value.type = NPVariantType_Int32; //now returning some value if val is true.
value.value.intValue = 20;
if(val==true)
{
//Finally returning value to the handle Event function in JavaScript
NPN_Invoke(mNpp,pluginObj,id,&value,1,&retVal);
}
return true;
}
return true;
}
答案 0 :(得分:1)
我不确定我是否真的按照你要做的去做;但是,从你看来,当你在你的插件上调用方法startEvent时,你传递一个函数(NPObject),它将被调用(使用InvokeDefault)一个参数“e”
然后你希望“e”成为插件?如果是这种情况,那么您需要做的就是将插件的NPObject包装在NPVariant中,并将其作为第一个参数发送到InvokeDefault的函数调用。
编辑:
所以你发布了你的NPAPI代码;你在回调中执行以下行:
e.onstartEvent = handleEvent();
你的意思是这样做的吗?您正在执行handleEvent并将结果分配给插件DOM元素上的“onstartEvent”。你的意思是将函数分配给“onstartEvent”吗?在这种情况下,你最后不应该有();导致函数被调用(并且没有e的有效值)。
此外,您正在尝试在DOM元素上调用“onstartEvent”,但是您最好使用GetProperty获取函数的NPObject,然后使用InvokeDefault;当然,既然你永远不会获得属性,那么GetProperty就不会被调用,因此你的代码就不会运行了。
哦,既然您从HasProperty为“onstartEvent”返回true,则无法在DOM元素的同名属性上设置该函数; DOM元素可以声明属性或你的插件可以,但你试图以两种方式使用它,这是行不通的。因此,由于您没有SetProperty,因此在没有参数调用函数之后,您的赋值将失败。
希望有所帮助