0

提前致谢 !!!!!

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

1 回答 1

1

我不确定我是否真的遵循您想要做的事情;但是,从事物的外观来看,当您在插件上调用方法 startEvent 时,您会向它传递一个函数(NPObject),该函数将使用单个参数“e”(使用 InvokeDefault)被调用

然后您希望“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,因此您的分配将在您的函数被调用且没有参数的情况下失败。

希望有帮助

于 2012-10-10T03:45:25.453 回答