我创建了一个NPAPI插件,并希望从Javascript中访问插件中的数组元素。我使用的javascript是以下一个:
var foo_plug = document.getElementById('foo');
var elem = foo_plug.array_p[index];
PS:我在访问插件中的变量时调用了NPClass的hasProperty和getProperty方法并且工作正常。
答案 0 :(得分:1)
您需要了解的第一件事是调用链。让我们来看看有问题的一行:
var elem = foo_plug.array_p[index];
这要做的是首先在NPObject上为foo_plug调用NPN_GetProperty,其NPIdentifier转换为字符串“array_p”。
接下来会发生什么,取决于返回的内容;如果返回一个字符串,index将成为该字符串的索引。如果它是一个int,它会给你一个错误。另一方面,如果它是NPObject,则下一个调用将是该NPObject上的NPN_GetProperty,其NPIdentifier将是IntIdentifier(使用NPN_GetIntIdentifier)或字符串标识符,其数字为字符串(使用NPN_IdentifierIsString来确定哪个)
现在,如果返回的NPObject是一个实际的javascript数组,你不必担心;你可以获得NPObject for window并使用标识符“Array”调用Invoke并且没有参数,它将返回一个空数组的NPObject;你可以使用它来把东西放进去并返回它,这样可以正常工作。
或者,您可以返回支持“length”属性NPN_Enumerate的NPObject,并且可以智能地处理数字字符串标识符或intidentifier(实际上您需要处理这两者,因为某些浏览器使用每种类型)并且如果它起作用就像一个javascript数组,你可能不会知道它的区别。
FireBreath非常支持所有这些选项。