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>

ここでは、本体から 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 を呼び出すときに、単一の引数「e」で (InvokeDefault を使用して) 呼び出される関数 (NPObject) を渡します。

次に、「e」をプラグインにしたいですか?その場合は、プラグインの NPObject を NPVariant でラップし、それを InvokeDefault を使用して関数呼び出しの最初のパラメーターとして送信するだけです。


編集:

NPAPI コードを投稿しました。コールバックで次の行を実行しています。

e.onstartEvent = handleEvent();

これをするつもりでしたか?handleEvent を実行し、結果をプラグイン DOM 要素の「onstartEvent」に割り当てています。おそらく「onstartEvent」に関数を割り当てるつもりでしたか?その場合、最後に () を付けるべきではありません。これにより、関数が呼び出されます (および e の有効な値なしで)。

さらに、DOM 要素で「onstartEvent」を呼び出そうとしていますが、GetProperty を使用して関数の NPObject を取得し、次に InvokeDefault を使用する方がはるかに優れています。もちろん、プロパティ GetProperty を取得することは決してないため、呼び出されることはなく、そのためのコードはとにかく実行されません。

ああ、「onstartEvent」の HasProperty から true を返すため、DOM 要素の同じ名前のプロパティに関数を設定することはできません。DOM 要素またはプラグインでプロパティを要求できますが、両方の方法で使用しようとしていますが、これは機能しません。したがって、 SetProperty がないため、関数が引数なしで呼び出された直後に割り当てが失敗します。

それが役立つことを願っています

于 2012-10-10T03:45:25.453 に答える