From 856deebb1c0646278bcddf7d5551a401ae1ef754 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:57:17 +0900 Subject: [PATCH 1/2] fix: events handling --- src/xhr-proxy.js | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/xhr-proxy.js b/src/xhr-proxy.js index 73f7d76..4b64ce9 100644 --- a/src/xhr-proxy.js +++ b/src/xhr-proxy.js @@ -27,7 +27,7 @@ function trim(str) { } function getEventTarget(xhr) { - return xhr.watcher || (xhr.watcher = document.createElement('a')); + return xhr.watcher || (xhr.watcher = typeof document.createDocumentFragment === 'function' ? document.createDocumentFragment() : document.createElement('a')); } function triggerListener(xhr, name) { @@ -157,6 +157,9 @@ function proxyAjax(proxy, win) { return true; } + var eventListenerFnMap = typeof WeakMap === 'function' ? function (_this) { + return _this.eventListenerFnMap || (_this.eventListenerFnMap = new WeakMap()); + } : null; var { originXhr, unHook } = hook({ onload: preventXhrProxyCallback, @@ -210,18 +213,38 @@ function proxyAjax(proxy, win) { if (onRequest) return true; }, addEventListener: function (args, xhr) { + // args = (type:string , listener: EventListener, opt: any?) var _this = this; if (events.indexOf(args[0]) !== -1) { var handler = args[1]; - getEventTarget(xhr).addEventListener(args[0], function (e) { + var Gn = function (e) { var event = configEvent(e, _this); - event.type = args[0]; + event.type = e.type; event.isTrusted = true; handler.call(_this, event); - }); + }; + if (eventListenerFnMap) { + var map = eventListenerFnMap(_this); + map.set(handler, Gn); + } + getEventTarget(xhr).addEventListener(args[0], Gn, false); return true; } }, + removeEventListener: function (args, xhr) { + // args = (type:string , listener: EventListener, opt: any?) + if (events.indexOf(args[0]) !== -1) { + var handler = args[1]; + if (eventListenerFnMap) { + var map = eventListenerFnMap(this); + var Gn = map.get(handler); + if (Gn) { + getEventTarget(xhr).removeEventListener(args[0], Gn, false); + return true; + } + } + } + }, getAllResponseHeaders: function (_, xhr) { var headers = xhr.resHeader if (headers) { From c500118cc186c6efb34d7bc86356b8b19c807c93 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Wed, 16 Aug 2023 22:08:04 +0900 Subject: [PATCH 2/2] removed `event.type` assignment --- src/xhr-proxy.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/xhr-proxy.js b/src/xhr-proxy.js index 4b64ce9..c748bdb 100644 --- a/src/xhr-proxy.js +++ b/src/xhr-proxy.js @@ -219,7 +219,6 @@ function proxyAjax(proxy, win) { var handler = args[1]; var Gn = function (e) { var event = configEvent(e, _this); - event.type = e.type; event.isTrusted = true; handler.call(_this, event); };