我正在开发一个需要接收来自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中是不可能的?
提前谢谢。
答案 0 :(得分:4)
基本上你需要做的是提供一个实现InvokeDefault的NPObject;你将它传回给页面以响应一些Invoke或GetProperty调用,然后javascript可以随时用你想要的任何参数调用它作为函数。
有关NPObjects的更多信息,请参阅http://npapi.com/tutorial3
FireBreath抽象所有这些,以便90%的繁重工作为你完成;如果你还没看过,我高度推荐它。
答案 1 :(得分:1)
我可能完全错了,但在Internet Explorer中,您使用的是window.external
。但是当然MSIE与基于Netscape的NPAPI不同,所以我不能确定。
无论如何,如果您必须在MSIE中执行此操作,您可能会发现此技巧很有用。