如何使用NPAPI从页面上的javascript接收呼叫?

时间:2011-04-06 06:09:45

标签: javascript npapi

我正在开发一个需要接收来自javascript的调用的插件。具体来说,它需要能够为javascript提供回调函数,并且javascript需要能够稍后使用至少一个字符串参数调用该函数。 javascript看起来像这样(理想情况下):

var callback = null;
var setCallback = function(cb) {
  var callback = cb;
};
var input = document.getElementById('my_text_input_field');
input.onkeypress = function(ev) {
  // Did the user press enter?
  if (ev && ev.which == 13) {
    callback(input.value);
    return false;
  }
};

到目前为止,我想象我的C代码看起来像这样:

void SetCallback(void (*callback)(const char*)) {
  NPVariant npCallback;
  OBJECT_TO_NPVARIANT(callback, npCallback);
  NPVariant args[] = { npCallback };
  size_t nargs = 1;
  NPVariant result;
  // gFuncs is an NPNetscapeFuncs pointer
  NPIdentifier method = gFuncs->getstringidentifier("setCallback");
  // gJavaScriptAPI is an NPObject pointer
  gFuncs->invoke(gInstance, gJavaScriptAPI, method, args, nargs, &result);
}

这是一个合理的开始吗?如果是这样,我在回调函数中需要做什么来处理它的调用?如果没有,做这样的事情的正确方法是什么,或者在NPAPI中是不可能的?

提前谢谢。

2 个答案:

答案 0 :(得分:4)

基本上你需要做的是提供一个实现InvokeDefault的NPObject;你将它传回给页面以响应一些Invoke或GetProperty调用,然后javascript可以随时用你想要的任何参数调用它作为函数。

有关NPObjects的更多信息,请参阅http://npapi.com/tutorial3

FireBreath抽象所有这些,以便90%的繁重工作为你完成;如果你还没看过,我高度推荐它。

答案 1 :(得分:1)

我可能完全错了,但在Internet Explorer中,您使用的是window.external。但是当然MSIE与基于Netscape的NPAPI不​​同,所以我不能确定。 无论如何,如果您必须在MSIE中执行此操作,您可能会发现此技巧很有用。