如何在javascript中传递url回调函数中的参数

时间:2012-08-15 07:52:09

标签: javascript callback

我有一个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。

我的问题是我需要为几个不同的唯一网址调用myFunction,但结果与调用网址相关联。似乎每当页面加载完成时都会调用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调用都已完成。

1 个答案:

答案 0 :(得分:0)

这是基于新提供的代码的更新代码。

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;
    }
  };
})();