1

我有一个来自我正在尝试修改的 wordpress 插件的 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 回答