如何在嵌套的javascript函数NPAPI中获取插件对象

时间:2012-10-09 17:41:48

标签: npapi

提前致谢!!!!!

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;
}

1 个答案:

答案 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,因此在没有参数调用函数之后,您的赋值将失败。

希望有所帮助