0

私のプラグイン コードでは、「デバイス」の配列を作成し、それを JavaScript に返します。配列内のデバイスは NPObject のインスタンスです。配列を正常に作成でき、デバイス インスタンスをプッシュできます。ただし、JavaScript がデバイス オブジェクトのプロパティを呼び出すと、「未定義」の値が返されます。

html コードは次のとおりです。

<html>
<head>
<title>Netscape Core Animation Movie Plug-In</title>
<script language="javascript" type="text/javascript">
function devicelist(){
    var plug=document.getElementById('plugin');
    var devices=plug.getDevice();
    var tab='<table>';

    for(var device in devices){
        tab+='<tr><td>'+device.name+'</td><td>'+device.address+'</td></tr>';
    }

    tab+='</table>';

    document.getElementById('pluginlist').innerHTML=tab;
}

</script>

</head>
<body>
<div>
<embed width="848" height="480" id="plugin" movieurl="http://movies.apple.com/media/us/ipad/2011/tours/apple-ipad2-feature-us-20110302_r848-9cie.mov" type="test/x-netscape-core-animation-movie-plugin"></embed>
<p>JavaScript Controller</p>
<button onclick="devicelist()">Devices </button>
<div id="pluginlist"></div>
</div>
</body>
</html>

プラグイン オブジェクトの「getDevice」メソッドが呼び出されたときに配列を作成します。

static bool mainNPObjectInvoke(NPObject *obj, NPIdentifier identifier, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
    MainNPObject *mainObject = (MainNPObject *)obj;

    if (identifier == methodIdentifiers[METHOD_ID_GET_DEVICES])
    {
        NPObject *windowObj = NULL;
        browser->getvalue(mainObject->npp, NPNVWindowNPObject, &windowObj);

        NPVariant devices;
        NPIdentifier name = browser->getstringidentifier("Array");
        browser->invoke(mainObject->npp, windowObj, name, NULL, 0, &devices);

        for (int i = 0; i < 3; i++)
        {
            Device *device = [[Device alloc] init];
            device.name = [NSString stringWithFormat:@"device%.2d", i];
            device.address = @"127.0.0.1";
            NPObject *deviceObj = createDeviceNPObject(mainObject->npp, device);
            //browser->retainobject(deviceObj);

            NPVariant *arg = browser->memalloc(sizeof(NPVariant));
            OBJECT_TO_NPVARIANT(deviceObj, *arg);

            NPVariant result;
            browser->invoke(mainObject->npp, devices.value.objectValue, browser->getstringidentifier("push"), arg, 1, &result);
        }

        browser->retainobject(devices.value.objectValue);
        OBJECT_TO_NPVARIANT(devices.value.objectValue, *result);

        browser->releaseobject(windowObj);

        return true;
    }

    return false;
}

配列に NPObject のインスタンスがあることを JavaScript に知らせるために何か特別なことはありますか?

4

1 に答える 1

1

forループを悪用しているようです。for ループは、値ではなく、オブジェクト プロトタイプ チェーンのすべてのキーを繰り返します。これは適切な使用法です:

function devicelist(){
    var plug=document.getElementById('plugin');
    var devices=plug.getDevice(), device;
    var tab='<table>';

    for (var prop in devices) {
        if (devices.hasOwnProperty(prop)) {
            device = devices[prop];
            tab += '<tr><td>'+device.name+'</td><td>'+device.address+'</td></tr>';
        }
    }

    tab+='</table>';

    document.getElementById('pluginlist').innerHTML=tab;
}
于 2012-05-06T15:13:15.937 に答える