ajax 요청이 jQuery의 $.ajax 에 의해 시작되면 기본적으로 JQuery의 Global Ajax 이벤트 처리기를 사용하여 Ajax 이벤트를들을 수 있습니다. 그러나 내가 만난 것은 기본 JavaScript로 시작된 AJAX 요청 이므로이 방법은 작동하지 않습니다.
그런 다음 Pub/Sub와 같은 다른 방법이 있지만 요청을 시작하는 JS 코드를 변경할 수 없으므로 코드에 게시하는 데 아무런 문제가 없습니다. 마찬가지로 jQuery의 .bind 및 .trigger 사용할 수 없습니다.
마지막으로, 사용자 지정 이벤트를 사용하는 동안 Direct override XMLHttpRequest 사용하기로 결정했습니다.
StackoverFlow를 검색하면서 나는 나쁜 사람이 신뢰할 수없는 솔루션을 주었다는 것을 알았습니다. 글쎄, 나는 당신이 볼 수 있도록 그것을 게시 할 것입니다.
(function () {var open = wind if (this.onreadyStateChange). Wind 이 솔루션은 모든 XHR Events 를들을 수 없으며 readystatechange 이벤트는 send 메소드를 호출 한 후에 만 경시되므로 readyState = 1 일 때 이벤트를들을 수 없습니다. 동시에, send 메소드를 사용한 후 onreadystatechange 대한 콜백 함수를 설정하면 override 코드가 다시 override 되며 예상 효과가 생성되지 않습니다.
그렇다면 어떻게 XHR을 올바르게 무시할 수 있습니까? 코드를 게시하고 살펴 보겠습니다.
; (function () {function ajaxeventtrigger (event) {var ajaxevent = new customevent (event, {reaver : this}); window.dispatchevent (ajaxevent);} var oldxhr = window.xmlhttprequest; function newxhr () {var revelxhr = new Oldxhr (); realxhr.adeventListener ( 'Abort', function () {ajaxeventtrigge.call ( 'ajaxabort'), realxhr.addeventlistener ( 'error', {ajaxeventtrigger.call); function () {ajaxeventtrigge.call (this, 'ajaxload'); ajaxeventtrigge.call (this, 'ajaxtimeout'); ajaxeventtrigger.call (this, 'ajaxreadystatechange'); 이렇게하면 사용자 정의 이벤트가 XHR 에 추가됩니다. 전화하는 방법?
var xhr = 새로운 xmlhttprequest (); Window.AdDeventListener ( 'AjaxreadyStateChange', function (e) {console.log (e.detail); // xmlhttprequest object}); window.adeventListener ( 'ajaxabort', function (e) {console.log (e.detail.responsetext); // xhr에 의해 반환 된 내용); xhr.open ( 'get', 'info.json'); xhr.send (); 정상적인 readystatechange 및 기타 이벤트 handler 에 의해 반환 된 e XMLHttpRequest 객체이지만 e 정의 방법 ajaxReadyStateChange 및 기타 이벤트 핸들러가 CustomEvent 객체이며 e.detail 이 실제 XMLHttpRequest 객체입니다. ajax 요청에 의해 반환 된 컨텐츠를 얻는 e.responseText 도 e.detail.responseText 로 수정해야합니다.
동시에 addEventListener 메소드는 XHR 인스턴스가 아닌 window 对象에 장착해야합니다.
위의 코드는 CustomEvent 생성자를 사용하기 때문에 일반적으로 최신 브라우저에서 사용할 수 있지만 IE 11조차도 지원하지 않으므로 Polyfill 추가해야합니다.
(function () {if (if (typeof swooin evt;} custome.prototype = wind window.xmlhttprequest; ajaxeventtrigger.call (this, ajaxerror '); 'ajaxloadStart'); false); realxh.adeventListener ( 'timeout', function () {ajaxeventtrigge.call ( 'ajaxtimeout'); realxhr.addeventListener realxhr.adeventListener ( 'readystatechange', function () {ajaxeventtrigge.call ( 'ajaxreadstatechange');현재 IE 9+, Chrome 15+, Firefox 11+, Edge, Safari 6.1+ 및 Opera 12.1+에서 행복하게 사용할 수 있습니다. 위는이 기사의 모든 내용입니다. 나는 당신이 그것을 좋아하기를 바랍니다.