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)

これには問題があります。コールバック関数は文字列に変換されるため、すべてのスコープチェーン情報が失われます。

この問題を解決する方法について何か提案はありますか?

編集:

'query'関数側のソリューションをお勧めします。例:スコープチェーン内の変数をeval()可能な文字列に変換する方法はありますか?

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 に答える