0

对于使用 UIWebView 的 iPad 应用程序,我在 URL 中将回调函数传递给应用程序:

function query(db, query, callback) {
  var iframe = document.createElement("IFRAME");

  // Filter comments from the callback (as this would break things).
  var callbackstr = "" + callback;
  callbackstr = callbackstr.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, ''); 

  // Put the query + the callback in an url that will be caught by the iOS app. 
  iframe.setAttribute("src", "ios-query:#iOS#" + query +":#iOS#"+ callbackstr);
  document.documentElement.appendChild(iframe);
  iframe.parentNode.removeChild(iframe);
  iframe = null;    
}

应用程序从 URL 解析回调函数,并通过 stringByEvaluatingJavaScriptFromString 插入一些数据来调用回调函数。这一切都很好。

但是,现在我想在回调函数中使用闭包,如下所示:

            var callback = function (problemdata) {
                // Return the 'real' callback.
                return function (tx, results) {
                    // Do something with problemdata
                }
            }(problemdataFromScopeChain)

这是有问题的。由于回调函数被转换为字符串,所有作用域链信息都会丢失。

关于如何解决这个问题的任何建议?

编辑:

我更喜欢“查询”功能方面的解决方案。例如:有没有办法将作用域链中的变量转换为 eval()-able 字符串?

4

2 回答 2

3

与其将回调函数本身传递给查询页面,不如传递一个与回调数组中的索引对应的 ID?

例如

var callback = function(problemdata){
// Do stuff
};

callbacks = [];
callbacks.append(callback); // so index of 0

现在,您为查询 iframe src 提供回调索引而不是实际的回调函数

最后,您的查询服务器端脚本可以返回类似的内容

callbacks[0]("this is a load of JSON for example");
于 2011-06-28T14:07:44.030 回答
0
var problemdataFromScopeChain = 4;
var callback = function(problemdata){
  // Return the 'real' callback.
  //return function (tx, results) {
  //  // Do something with problemdata
  //  return tx + results + problemdata;
  //}
  return new Function('tx', 'results', 'return tx + results + ' + problemdata + ';');
}(problemdataFromScopeChain);
alert('' + callback);

但在我看来,像这样使用 Function 构造函数并不是很好 =)。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

于 2011-06-28T13:58:03.523 回答