您需要了解的第一件事是调用链。让我们看看有问题的行:
var elem = foo_plug.array_p[index];
这将首先在 NPObject 上为 foo_plug 调用 NPN_GetProperty,并使用转换为字符串“array_p”的 NPIdentifier。
接下来发生的事情取决于返回的内容;如果您返回一个字符串,则 index 将是该字符串的索引。如果它是一个 int,它会给你一个错误。另一方面,如果它是一个 NPObject,则下一个调用将是该 NPObject 上的 NPN_GetProperty,其 NPIdentifier 将是一个 IntIdentifier(使用 NPN_GetIntIdentifier)或一个带有数字作为字符串的字符串标识符(使用 NPN_IdentifierIsString 来确定哪个) .
现在,如果返回的 NPObject 是一个实际的 javascript 数组,您不必担心;您可以获取窗口的 NPObject 并使用标识符“Array”且没有参数对其调用 Invoke,它将返回一个带有空数组的 NPObject;您可以使用它将东西放入其中并返回它,这将正常工作。
或者,您可以返回一个支持“长度”属性 NPN_Enumerate 的 NPObject,并且可以智能地处理数字字符串标识符或 intidentifier(实际上您需要同时处理这两者,因为某些浏览器使用每种类型)以及它是否足够像javascript 数组,您可能不知道其中的区别。
FireBreath对所有这些选项都有很好的支持。