2

我创建了一个 NPAPI 插件,并希望从 Javascript 访问插件中的数组元素。我使用的javascript如下:

var foo_plug = document.getElementById('foo');
var elem = foo_plug.array_p[index];
  1. 调用 NPClass 中的所有方法来访问上面显示的代码的数组元素?
  2. 我将如何返回 NPAPI 插件的数组索引处的值?
  3. 数组索引如何从 Javascript 传递到 NPAPI 插件?

PS:我在访问插件中的变量时调用了 NPClass 的 hasProperty 和 getProperty 方法,并且工作正常。

4

1 回答 1

1

您需要了解的第一件事是调用链。让我们看看有问题的行:

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对所有这些选项都有很好的支持。

于 2012-10-24T05:31:49.767 回答