我有一个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调用都已完成。
答案 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;
}
};
})();