javascript ajax cors microsoft-edge easyxdm

javascript - Evento Microsoft Edge easyXDM activado("mensaje") no se llama



ajax cors (1)

Resultó que había un "truco" requerido que un desarrollador anterior escribió en nuestra implementación de easyXDM.

En nuestra implementación de easyXDM, tuvimos que actualizar el objeto Window en IE porque nuestra aplicación se inicia en un iFrame. Como Edge no es técnicamente una versión de IE, nuestra prueba estaba fallando, por lo que el código no se estaba ejecutando para actualizar la window para que fuera window.parent en el contexto de easyXDM.

Estamos utilizando typeof document.documentMode === ''number'' para detectar IE, pero document.documentMode no está definido en Edge, por lo que agregamos una verificación navigator.userAgent para Edge.

Esto resolvió el problema.

En Microsoft Edge, una solicitud GET no se está ejecutando. He recorrido el código hasta el punto de la solicitud AJAX que se está ejecutando, y establecí un punto de interrupción en la devolución de llamada (s). Sin embargo, el código nunca llega a las devoluciones de llamada.

Ya tengo una configuración .then () y .fail () con devoluciones de llamada, e intenté agregar un .done () y .always () con devoluciones de llamada, pero no se está ejecutando ninguno de los códigos en las devoluciones de llamada.

Luego revisé la pestaña de red en dev-tools, y no puedo encontrar la solicitud en absoluto. Parece que Edge no está ejecutando la solicitud por algún motivo.

request = function(options, resolveScope) { var deferred = $.Deferred(); corsHandler.makeRequest(options) .done(this._wrap(function(response) { deferred.resolveWith(resolveScope, [response]); //never gets here }, this)) .fail(this._wrap(function(response) { deferred.rejectWith(resolveScope, [response]); //never gets here }, this)); return deferred; }

Esto es lo que llama a la función de solicitud anterior.

ajaxFunc = function(data, scope) { return request({ url: ''/path/to/server'', internalUrl: true, method: ''GET'', datatype: ''json'', data: data }, scope); }

Esta es la implementación utilizada para hacer esa solicitud.

(function() { // set data var return ajaxFunc(data, self) .then(function(res) { console.log(res); }) //never gets here .done(function(res) { console.log(res); }) //never gets here .fail(function(res) { console.log(res); }) //never gets here .finally(function(res) { console.log(res); }) //never gets here })();

Aquí está el cors cosas. (No sé mucho sobre esto.)

corsHandler.makeRequest = function(options) { // resolve default options _.defaults(options, { xhr: null, corsUrl: null, url: null, method: ''GET'', data: {}, success: function() {}, error: function() {}, terminate: false, binary: false, headers: {}, internalUrl: false, datatype: '''' }); // if url is internal, create absolute url from relative url if (options.internalUrl) { options.url = this.createAbsoluteInternalUrl(options.url); } // resolve cors url or proxy url options.corsUrl = options.corsUrl || this.getCorsUrl(options.url); if (!options.corsUrl) { options.url = this.getProxyUrl(options.url); options.corsUrl = this.getCorsUrl(options.url); } // create xhr if (!options.xhr && options.corsUrl) { options.xhr = this.createXhr(options.corsUrl); } // create cleanup procedure var cleanUpAfterRequest = $.proxy(function() { if (options.terminate) { options.xhr.destroy(); this._removeCacheXhr(options.corsUrl); } }, this); // prepare deffered object var deferred = $.Deferred(); deferred .done(function() { if (options.success) { options.success.apply(null, Array.prototype.slice.call(arguments)); } }) .fail(function() { if (options.error) { options.error.apply(null, Array.prototype.slice.call(arguments)); } }); // make actual request if (!options.xhr) { throw ''corsHandler: xhr object was not created or defined to make request''; // this does not happen } options.xhr.request( { url: options.url, method: options.method, data: options.data, binary: options.binary, headers: options.headers, datatype: options.datatype }, function() { deferred.resolve.apply(null, Array.prototype.slice.call(arguments)); cleanUpAfterRequest(); }, function() { deferred.reject.apply(null, Array.prototype.slice.call(arguments)); cleanUpAfterRequest(); } ); return deferred; }

ACTUALIZAR

Parece que el problema está en easyXDM . waitForReady() no se está waitForReady() on(window, "message", waitForReady) en edge. Estoy investigando el problema más ahora.

fragmento de easyXDM:

targetOrigin = getLocation(config.remote); if (config.isHost) { // add the event handler for listening var waitForReady = function(event){ if (event.data == config.channel + "-ready") { // replace the eventlistener callerWindow = ("postMessage" in frame.contentWindow) ? frame.contentWindow : frame.contentWindow.document; un(window, "message", waitForReady); on(window, "message", _window_onMessage); setTimeout(function(){ pub.up.callback(true); }, 0); } }; on(window, "message", waitForReady); // set up the iframe apply(config.props, { src: appendQueryParameters(config.remote, { xdm_e: getLocation(location.href), xdm_c: config.channel, xdm_p: 1 // 1 = PostMessage }), name: IFRAME_PREFIX + config.channel + "_provider" }); frame = createFrame(config); }

El fragmento de waitForReady anterior se ejecuta, pero nunca se llama al método waitForReady . El único navegador al que no se llama es Edge (funciona en IE8 +, Chrome, Safari, FF y mobile cromo / safari).