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).