1

Javaスクリプトから配列を処理したい。(つまり、htmlページからプラグインコードへ。htmlコードからプラグイン内の変数への値を取得して、コード内で値を変更し、他の目的で処理できるようにします。)

しかし、私はこれで問題に直面しています。内部的には、配列がNPObjectとして処理されることを知っています。このNPObjectから配列の長さと配列の要素を取得しようとしていますが、配列の長さがゼロ以外であっても、返される配列の長さはゼロです。

どんな提案も歓迎します...。

配列を持つhtmlページがあります。HTMLページは次のとおりです。

<html>
<script type="text/javascript">
var arrayData = [9,1,2,3,4,5,6,7,8,9];
function handleEvent(e) {
    if (e.keyCode == 55) {
        document.getElementById('arrayint_ele_disp').innerHTML = arrayData;
        process_intarray(arrayData);
    }
}
function  process_intarray(arrayData){
    obj = document.getElementById("Obj");
    if(obj){
        obj.process_array_intval(arrayData); 
    }
}
</script>

<body onload="init()" onkeydown="handleEvent(event)">
<div id ="arrayint_ele_disp" style="position:absolute;left:100px;top:250px"> 
ARRAY_INT VAL </div>
</body>

</html>

配列要素を処理するための私のプラグインコードは次のとおりです。

bool ScriptableObject::process_intarray(const NPVariant* args, uint32_t 
     argCount, NPVariant* result)
{

    //Get the Length of the array
    //NPObject *inobject = args[0].value.objectValue;
    NPObject *inobject = args->value.objectValue;

    bool bRetval = false;
    NPVariant npvlength;
    //NPIdentifier id;

    bRetval = 
   NPN_GetProperty(m_npp,inobject,NPN_GetStringIdentifier("length"),&npvlength);
    printf("\n NPN_GetProperty length type %d value : %d\n"
  ,npvlength.type,npvlength.value.intValue);

    //Get the array elements
    int i = 0;
    for(i = 0; i < npvlength.value.intValue; i++)
    {
        NPVariant CurVal;
        NPN_GetProperty(m_npp,inobject,NPN_GetIntIdentifier(i),&CurVal);
        m_prop_array_intval[i] = CurVal.value.intValue;
    }
    return true;

}

この関数では、NPN_GetProperty(m_npp、inobject、NPN_GetStringIdentifier( "length")、&npvlength); trueを返しています。

しかし、npvlengthの長さをチェックすると、0とそのタイプがNPVariantType_Doubleになります。理由がわかりません。

任意の提案を歓迎します...

4

1 に答える 1

1

Int32またはのいずれかである数字に依存するべきではありませんDouble。数値タイプがvalue.doubleValue長さを取得するために二重に使用されている場合、そうでない場合は予期しない値が取得さvalueれます(aunionであるため、同じメモリdoubleValueを参照しているため)。理想的には、変換のためのヘルパー関数を自分で作成して、どこでも 特定のことを心配する必要がないようにします。intValue
NPVariantType

また、sをキャッシュする必要がありますNPIdentifier。最悪の場合NPN_Get*Identifier()、文字列の比較/ハッシュ/ ...の費用に加えて、プラグインプロセスからブラウザプロセスへの完全なプロセス間ラウンドトリップが発生する可能性があります。

于 2012-07-30T10:44:00.587 に答える