2013-10-25 2 views
1

Есть ли у браузера какой-то способ нацелиться на открытые запросы?Восстановить и отменить объекты XMLHttpRequest

У меня есть плагин, который вызывает некоторые запросы, которые не отображают объект XMLHttpRequest/jqXHR; однако Firebug действительно показывает эти запросы в консоли.

Есть ли способ ссылки на объекты для открытых запросов? Конечная цель - прервать существующую.

+0

Я так не считаю. Скорее всего, вам лучше искать способ подключиться к плагину и сделать доступным xhr таким образом. Или, если вы знаете, что он использует jQuery, вы можете обезвредить метод $ .ajax. –

+0

@KevinB Вы также можете просто слушать все вызовы 'open'. Очевидно, что лучше всего подключиться к самому плагину. – plalx

+0

@KevinB: Я не знаю, что на самом деле, не вникая в его код – vol7ron

ответ

1

Я считаю, что расширение FF имеет больше возможностей, чем код, запущенный в контексте страницы, и именно поэтому он может обнаруживать запросы. Насколько я знаю, нет собственного способа получить экземпляр объекта XMLHttpRequest, если вы не указали на него ссылку.

Однако JavaScript является гибким языком, и вы можете легко создать перехватчик, который будет отслеживать все открытые вызовы.

Примечание: Предпочтительно, если возможно, использовать методы плагина.

E.g.

XMLHttpRequest.prototype.send = (function (nativeSendFn) { 
    return function() { 
     var sendHandler = this.constructor.onSend; 
     nativeSendFn.apply(this, arguments); 

     sendHandler && sendHandler(this, arguments); 
    }; 
})(XMLHttpRequest.prototype.send); 

XMLHttpRequest.onSend = function (xhr, args) { 
    console.log('request ', xhr); 
    console.log('arguments ', args); 
}; 

var req = new XMLHttpRequest(); 

req.open('GET', 'http://www.stackoverflow.com', true); 
req.send(); 
+0

Мне нужно будет изучить это. Похоже, он должен работать. Вместо 'console.log (...)' Я думаю, что добавлю объект в 'window.oXMLHttpRequests', поэтому я могу ссылаться на него позже. Мне также нужно зацепиться за закрытие, чтобы удалить его из объекта. – vol7ron

+0

@ vol7ron Да, трудно дать полную реализацию, когда я точно не знаю, что вам нужно, но это должно дать вам начальный удар, который вам нужен;) Я подключился к функции 'send', чтобы вы могли отменить запросите сразу, не имея необходимости хранить экземпляр, что требует некоторого процесса очистки, чтобы избежать утечек памяти. – plalx

+0

Думаю, я мог бы дать более подробную информацию. Я использую плагин dataTables и переключая уничтожение/создание таблиц с помощью переключателя. Я не думаю, что плагин предоставляет объект XMLHttpRequest, но я хочу прервать вызов, если пользователь быстро переключается, чтобы избежать условий гонки при загрузке данных. – vol7ron

Смежные вопросы