1

変更しようとしているワードプレスプラグインのJavaScriptファイルがあります。ある種の抜け穴のあるクロスドメインリクエストを回避しているようです。これはこの関数です:

function urlCallback(url){
  var req = url;
  var head = document.getElementsByTagName("head").item(0);
  var script = document.createElement("script");
  script.setAttribute("type", "text/javascript");
  script.setAttribute("src", req);
  head.appendChild(script);   
}

渡されるURLは'http://url.com/page?callback=namespace.myFunction'、myFunctionがスクリプトの他の場所で定義された関数であるようなものです。

私の理解では、これは私のページの上部にソースURLを挿入し、ブラウザにそのページをロードさせます。次に、そのURLにアタッチされたコールバックが呼び出され、結果が単一のパラメーターとしてサンプル関数myFunctionに渡されます。

私の問題は、いくつかの異なる一意のURLに対してmyFunctionを呼び出す必要があることですが、結果は呼び出し元のURLに関連付けられています。myFunctionは、ページの読み込みが完了するたびに呼び出されるように見えるため、操作しているデータセットを単純に数えることはできません。myFunctionにコールバックURLにエンコードされた追加の変数を渡すか、myFunctionがアタッチされたURLを認識するための何らかの方法が必要です。

誰か助けてもらえますか?

編集:

さらに詳しく説明すると、これが私が持っているコードの簡略化されたバージョンです:

var parseUrls = (function(){
  function urlCallback(url){
    var req = url;
    // Here is where I need to save the url
    var head = document.getElementsByTagName("head").item(0);
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", req);
    head.appendChild(script);   
  }

  return {
    options: {},
    parseNextUrl: function(result) {
        if (!result || !result.data) { return; }
        var data = result.data;
        // Here is where I need the url

    },
    parseUrl: function(result) {
      if (!result || !result.data) { return; }
      var data = result.data;
      for (var i = 0; i < data.length; i++) {
        urlCallback( data[i].url + "/new_url/page?callback=parseUrls.parseNextUrl" );
      }
    },
    showResult: function(options){
      urlCallback( "http://start.url.com/page?callback=parseUrls.parseUrl" );
      this.options = options;
    }
  };
})();

明確にするために、ソース要求が終了するたびにparseNextUrlが呼び出されます。これは、すべてのurlCallback呼び出しがその時点ですでに終了していることを意味します。

4

1 に答える 1

1

新しく提供されたコードに基づいて更新されたコードは次のとおりです。

var parseUrls = (function(){
  function urlCallback(url){
    // Create request
    var head = document.getElementsByTagName("head").item(0);
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", req);
    head.appendChild(script);   
  }

  return {
    parsers: [], //response handler array
    options: {},
    parseUrl: function(result) {
      //parseUrls.parseUrl.url = request URL

      if (!result || !result.data) { return; }
      var data = result.data;

      // Create requests
      for (var i = 0; i < data.length; i++) {
        // Create new response handler
        var parseNextUrl = function(result) {
          // parseNextUrl.url = request URL

          if (!result || !result.data) { return; }
          var data = result.data;

          // Check the URL
          console.log('Result URL = ' + parseNextUrl.url);
        };

        // Make callback names and URLs for each handler
        var cbName = "parseUrls.parsers[" + this.parsers.length + "]";
        var req = data[i].url + "/new_url/page?callback=" + encodeURI(cbName);

        // Save the URL in the handler
        parseNextUrl.url = req;

        // Put handler into storage.
        // Note: Don't delete/insert any of parsers array element
        // until no more new requests and all responses are received.
        this.parsers.push(parseNextUrl);

        urlCallback(req);
      }
    },
    showResult: function(options){
      this.parseUrl.url = "http://start.url.com/page?callback=parseUrls.parseUrl";

      urlCallback(this.parseUrl.url);
      this.options = options;
    }
  };
})();
于 2012-08-15T19:03:09.467 に答える