Javascript: доступ к сетевому соединению История XHR [дубликат]

Ответ THC4k работает, но я просто хочу добавить, что query_result должен быть уже отсортирован, чтобы получить itertools.groupby , работая так, как вы хотите.

  query_result = DBSession.query (Article) .order_by (Article.created) .all ()  

Вот объяснение в itertools.groupby docs :

Операция groupby () аналогична фильтру uniq в Unix. Он генерирует разрыв или новую группу каждый раз, когда изменяется значение ключевой функции (поэтому, как правило, необходимо сортировать данные с использованием одной и той же ключевой функции). Это поведение отличается от SQL GROUP BY, которое объединяет общие элементы независимо от их порядка ввода.

blockquote>

78
задан Yuliy 5 March 2011 в 08:04
поделиться

9 ответов

Вдохновленный ответом aviv , я немного разобрался, и это то, что я придумал. Я не уверен, что все это полезно в соответствии с комментариями в скрипте и, конечно же, будет работать только для браузеров с использованием собственного объекта XMLHttpRequest. Я думаю, что это сработает, если библиотеки javascript будут использоваться, поскольку они будут использовать собственный объект, если это возможно.

  function addXMLRequestCallback (обратный вызов) {var oldSend, i;  if (XMLHttpRequest.callbacks) {// мы уже переопределили send (), поэтому просто добавим обратный вызов XMLHttpRequest.callbacks.push (обратный вызов);  } else {// создать очередь обратного вызова XMLHttpRequest.callbacks = [обратный вызов];  // сохраняем native send () oldSend = XMLHttpRequest.prototype.send;  // переопределяем native send () XMLHttpRequest.prototype.send = function () {// обрабатываем очередь обратного вызова // экземпляр xhr передается в каждый обратный вызов, но кажется довольно бесполезным // вы не можете определить, каково его назначение или  call abort () без ошибки // так что действительно полезно для ведения журнала, что запрос произошел // Я мог ошибаться, я надеюсь, что так ... // EDIT: я полагаю, вы могли бы переопределить обработчик onreadystatechange, хотя для (i =  0; i & lt; XMLHttpRequest.callbacks.length; i ++) {XMLHttpRequest.callbacks [i] (это);  } // вызов native send () oldSend.apply (это, аргументы);  }}} // например.  addXMLRequestCallback (function (xhr) {console.log (xhr.responseText); // (пустая строка)});  addXMLRequestCallback (function (xhr) {console.dir (xhr); // посмотрим, есть ли что-нибудь полезное здесь});   
92
ответ дан Community 16 August 2018 в 00:59
поделиться
  • 1
    Творческий. JS трюки снова сохранили этот день. – Alon Amir 2 May 2013 в 18:19
  • 2
    было бы неплохо расширить этот ответ для поддержки перехватов после запроса – Sebastien Lorber 19 September 2014 в 14:45
  • 3
    Основываясь на вашей реализации, я опубликовал что-то о NPM, которое работает как с запросами, так и с ответами! [D0] github.com/slorber/ajax-interceptor – Sebastien Lorber 19 September 2014 в 16:21
  • 4
    console.log (xhr.responseText) - пустая строка, потому что в этот момент xhr пуст. если вы передадите переменную xhr в глобальную переменную и установите задержку несколько секунд, вы сможете получить доступ к свойствам напрямую – Toolkit 9 March 2015 в 08:56
  • 5
    хороший ответ. Если вы хотите получить данные ответа, проверьте состояние готовности и статус при изменении состояния. xhr.onreadystatechange = function () {if (xhr.readyState == 4 & amp; & amp; xhr.status == 200) {console.log (JSON.parse (xhr.responseText)); }} – ucheng 16 February 2016 в 22:50

Существует трюк.

Перед тем, как все запущенные скрипты, возьмите исходный объект XHMHttpReuqest и сохраните его в другом var. Затем переопределите исходный XMLHttpRequest и направьте все вызовы на него через свой собственный объект.

Код псевдонауки:

  var savd = XMLHttpRequest;  XMLHttpRequest.prototype = function () {this.init = function () {};  // ваш код и т. д. и т. д.};   
9
ответ дан aviv 16 August 2018 в 00:59
поделиться
  • 1
    Этот ответ не совсем прав, если вы измените прототип объекта, даже сохраненный будет изменен. Также весь прототип заменяется одной функцией, которая разбивает все запросы ajax. Это вдохновило меня на то, чтобы предложить ответ. – meouw 5 March 2011 в 10:59

В дополнение к ответу meouw я должен был ввести код в iframe, который перехватывает вызовы XHR и использовал вышеупомянутый ответ. Однако мне пришлось изменить

  XMLHttpRequest.prototype.send = function () { 

To:

  XMLHttpRequest  .prototype.send = function (arguments)  

И мне пришлось изменить

  oldSend.apply (это, аргументы);   

To:

  oldSend.call (это, аргументы);   

Это было необходимо, чтобы заставить его работать в IE9 с режимом документа IE8 . Если эта модификация не была выполнена, некоторые обратные вызовы, созданные инфраструктурой компонента (Visual WebGUI), не работали. Дополнительная информация по этим ссылкам:

Без этих изменений ретрансляции AJAX не завершились.

3
ответ дан bPratik 16 August 2018 в 00:59
поделиться

Используя ответ «meouw», я предлагаю использовать следующее решение, если вы хотите увидеть результаты запроса

  function addXMLRequestCallback (callback) {var oldSend, i;  if (XMLHttpRequest.callbacks) {// мы уже переопределили send (), поэтому просто добавим обратный вызов XMLHttpRequest.callbacks.push (обратный вызов);  } else {// создать очередь обратного вызова XMLHttpRequest.callbacks = [обратный вызов];  // сохраняем native send () oldSend = XMLHttpRequest.prototype.send;  // переопределить native send () XMLHttpRequest.prototype.send = function () {// вызвать native send () oldSend.apply (это, аргументы);  this.onreadystatechange = function (progress) {for (i = 0; i & lt; XMLHttpRequest.callbacks.length; i ++) {XMLHttpRequest.callbacks [i] (прогресс);  }};  }}} addXMLRequestCallback (функция (прогресс) {if (typeof progress.srcElement.responseText! = 'undefined' & amp; & amp; progress.srcElement.responseText! = '') {console.log (progress.srcElement.responseText.length)  ;}});   
4
ответ дан heroin 16 August 2018 в 00:59
поделиться

Если вам не нужно поддерживать & lt; = IE8, вы можете сделать это, что в общем случае перехватит любой AJAX по всему миру и не испортит никаких обратных вызовов и т. д., которые, возможно, были назначены любыми сторонними библиотеками AJAX. Принимаемый ответ не дает реального ответа, потому что его получают слишком рано.

  (function () {var origOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function ()  {console.log ('request started!'); this.addEventListener ('load', function () {console.log ('request completed!'); console.log (this.readyState); // всегда будет 4  (ajax успешно завершен) console.log (this.responseText); // независимо от ответа}); origOpen.apply (this, arguments);};}) ();   

Еще несколько документов о том, что вы можете сделать здесь с API-интерфейсом addEventListener:

https://developer.mozilla.org/en-US/ документы / Web / API / XMLHttpRequest / Using_XMLHttpRequest # Monitoring_progress

75
ответ дан John Culviner 16 August 2018 в 00:59
поделиться
  • 1
    Благодаря! Это прекрасно работает. Я немного модифицирую: this.status возвращает статус сервера в этом случае 200 , если запрос в порядке, 404, если элемент не был найден, 500 и т. Д. Но код, работает отлично. – MrMins 17 February 2015 в 16:20
  • 2
    Это может показаться вам старым, но вы заслуживаете всей любви к этому. Я глубоко застрял. Огромное спасибо. – Carles Alcolea 13 March 2017 в 00:54
  • 3
    Просто потому, что я немного искал это. Событие «load» вызвано только успехом. Если вы не заботитесь о результате (просто завершение запроса), вы можете использовать событие "loadend & quot; – Romuald Brunet 29 March 2017 в 16:34
  • 4
    Понадобилось много дней, чтобы найти это. Спасибо за этот гениальный гений. – David 24 October 2017 в 13:40

Поскольку вы упоминаете jquery, я знаю, что jquery предлагает метод .ajaxSetup () , который устанавливает глобальные параметры ajax, которые включают триггеры событий, такие как success , error [ ! d2] и beforeSend - это то, что походит на то, что вы ищете.

  $. ajaxSetup ({beforeSend: function () {// делать что-то  до запроса пожаров}});   

, конечно, вам нужно будет проверить доступность jQuery на любой странице, на которую вы пытаетесь использовать это решение.

19
ответ дан jondavidjohn 16 August 2018 в 00:59
поделиться
  • 1
    Спасибо за предложение, но это, к сожалению, не перехватывает вызовы AJAX, которые не используются AJAX. – Yuliy 6 March 2011 в 00:27
  • 2
    ... прочитайте ваш комментарий .... – jondavidjohn 6 March 2011 в 00:34
  • 3
    В сегодняшних новостях: единороги, убитые AJAX-призывами, которые не используются AJAX – Dashu 17 August 2015 в 13:54
  • 4
    он имеет в виду объект jquery AJAX. Но даже тогда u wil hv использовать один и тот же экземпляр jquery каждый раз – Shishir Arora 27 August 2015 в 21:00
  • 5
    Очень полезно. Хотелось добавить, еще один триггер - statusCode. Вставляя что-то вроде statusCode: {403: function () {error msg}, вы можете предоставить глобальную проверку auth / perms / role обратно ко всем функциям ajax, не переписывая один запрос .ajax. – Watercayman 18 May 2016 в 19:51

Я нашел хорошую библиотеку в Github, которая хорошо выполняет эту работу, вы должны включить ее перед любыми другими js-файлами

https://github.com/jpillora/xhook [ ! d0]

вот пример, который добавляет HTTP-заголовок к любому входящему отклику

  xhook.after (function (request, response) {response.headers ['Foo  '] =' Bar ';});   
5
ответ дан Mohamed Selim 16 August 2018 в 00:59
поделиться
  • 1
    Великий! Но не работал на приложение Кордовы даже с помощью перекрестного веб-виджета с перекрестным переходом! – Islam Attrash 27 November 2016 в 10:54
  • 2
    Это отлично работало для моих конкретных потребностей: в Wordpress, фильтрации событий из Event Organizer плагина полный календарь – Alfredo Yong 6 February 2017 в 17:24

jquery ...

  & lt; script & gt;  $ (document) .ajaxSuccess (функция (событие, xhr, настройки) {alert (xhr.responseText);});  & Lt; / сценарий & GT;   
3
ответ дан Vladimir Miroshnichenko 16 August 2018 в 00:59
поделиться
  • 1
    jQuery не будет ловить запросы, сделанные с использованием других библиотек. Например, ExtJS. Если вы используете только jQuery, это хороший ответ. В противном случае он не будет работать все время. – npiani 4 September 2014 в 14:44
  • 2
    он даже не поймает запросы jquery, если экземпляр jquery отличается. При необходимости изменить тип – Shishir Arora 27 August 2015 в 21:04

Ajax-hook - это lib с открытым исходным кодом для привязки глобального объекта XMLHttpRequest и изменения запроса AJax по умолчанию и ответа. github: https://github.com/wendux/Ajax-hook , например:

  hookAjax ({// hook callbacks onreadystatechange: function (xhr) {  console.log ("onreadystatechange called:% O", xhr)}, onload: function (xhr) {console.log ("onload called:% O", xhr)}, // функция hook open: function (arg, xhr  ) {console.log ("open called: method:% s, url:% s, async:% s", arg [0], arg [1], arg [2])}})  
1
ответ дан wendu 16 August 2018 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: