Это своего рода задача с топором, но это даст вам ваши динамические обратные вызовы. В основном это связано с тем, что переводы file:
будут довольно быстрыми. Он устанавливает очередь запросов и отправляет их по одному. Это был единственный способ понять, что правильный ответ и обратный вызов могут быть связаны (в гарантированном порядке). Надеюсь, кто-то может придумать лучший способ, но, не будучи в состоянии динамически генерировать ответы, это лучшее, что я могу сделать.
var JSONP = {
queue: [],
load: function(file, callback, scope) {
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = "text/javascript";
script.src = file;
head.appendChild(script);
},
request: function(file, callback, scope) {
this.queue.push(arguments);
if (this.queue.length == 1) {
this.next();
}
},
response: function(json) {
var requestArgs = this.queue.shift();
var file = requestArgs[0];
var callback = requestArgs[1];
var scope = requestArgs[2] || this;
callback.call(scope, json, file);
this.next();
},
next: function() {
if (this.queue.length) {
var nextArgs = this.queue[0];
this.load.apply(this, nextArgs);
}
}
};
Это то, что я сделал, чтобы проверить
window.onload = function() {
JSONP.request('data.js', function(json, file) { alert("1 " + json.message); });
JSONP.request('data.js', function(json, file) { alert("2 " + json.message); });
}
Data.js
JSONP.response({
message: 'hello'
});
У вас есть браузеры? – Hemlock
Он должен работать как можно больше браузеров. – erikvold
С CORS он никогда не будет работать, потому что вы не можете вернуть заголовок 'Access-Control-Allow-Origin', запросив хост' file: '. – inf3rno