Actualicé Chrome en la versión 83, y algunos de mis formularios que usan un componente de "carga Ajax" (más información a continuación) no funcionan. He leído los problemas de la nueva versión ( https://developers.google.com/web/updates/2020/05/nic83 ) pero no encuentro nada relacionado en formularios, iframes, archivos, ajax o publicaciones.
Intentaré publicar una muestra en Fiddler, pero quiero saber si alguien sabe algo al respecto.
Por otro lado, en otros formularios tengo un cargador de múltiples archivos, arrastrar y soltar (dropzone.js) y funciona bien, pero no es fácil de convertir y necesito una solución rápida.
Una muestra ficticia (no tengo ningún sandbox para probar la carga): https://jsfiddle.net/drvespa/7ue8k94r/3/
Publico la biblioteca en https://filebin.net/8sgsmq7sh14m0qen :
/** * Ajax upload * Project page - http://valums.com/ajax-upload/ * Copyright (c) 2008 Andris Valums, http://valums.com * Licensed under the MIT license (http://valums.com/mit-license/) * Version 3.6 (26.06.2009) */Acabo de establecer el atributo srcdoc en iframe igual a url en el componente AjaxUpload .
iframe.setAttribute('srcdoc', this._settings.action);
Ha resuelto mi problema.
Función en el archivo AjaxUpload.js:
_createIframe: function(){ var id = getUID(); var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />'); iframe.setAttribute('id', id); iframe.setAttribute('srcdoc', this._settings.action); iframe.style.display = 'none'; document.body.appendChild(iframe); return iframe; }Esta respuesta me ayudó a parchear nuestra copia de Atmail para que la carga de archivos adjuntos funcione nuevamente en Chrome 83. ¡Gracias!
La línea setAttribute anterior debe insertarse en el archivo AjaxUpload.js, dentro de la función '_createIframe'. Lo puse inmediatamente debajo de la llamada setAttribute('id', id) y eso funcionó :)
El problema es que la biblioteca está creando un <iframe>, con un atributo src , y escucha el evento de load de ese iframe justo después de que lo hizo.
/** * Creates iframe with unique name */ _createIframe: function () { // unique name // We cannot use getTime, because it sometimes return // same value in safari :( var id = getUID(); // Remove ie6 "This page contains both secure and nonsecure items" prompt var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />'); iframe.id = id; iframe.style.display = 'none'; d.body.appendChild(iframe); return iframe; }, luego en el método de submit
var iframe = this._createIframe(); // some synchronous operations addEvent(iframe, 'load', function (e) { // ... Dado que este iframe tiene un atributo src , Chrome comenzará a cargarse, y dado que su src es una URL falsa, esta operación en realidad se resuelve de forma síncrona, lo que significa que el evento de carga ya está configurado para activarse en la siguiente iteración del bucle de eventos.
const frame = document.createElement('iframe'); frame.src = 'javascript:return false'; document.body.append(frame); frame.addEventListener('load', (evt) => console.log('loaded', frame.src) ); setTimeout( () => frame.src = "about:blank", 0 ); // Results in Chrome: // loaded javascript:return false // loaded about:blank // Results in Firefox: // loaded about:blank Entonces, el único evento de load que recibe esta biblioteca es ese evento de carga inicial, de un documento vacío, y no el de la solicitud real.
Para solucionarlo, todo lo que necesita es eliminar este src="javascript:false;" del código de la biblioteca: https://jsfiddle.net/9phxmqjw/
Estábamos usando este antiguo complemento:
http://jquery.malsup.com/form/#opciones-objeto
Hay una opción que podría estar usando si fuera compatible con ie8 en algún momento de los últimos 10 años...
{ url: '/branded/image_upload', type: 'POST', iframe: false } También tuvimos un truco de envoltorio <textarea></textarea> en la respuesta.
Este código se transmitió a través de muchas iteraciones jajaja.
¡Gracias! Además, para todos los que aún usan Opencart 1.5 después de esta actualización de Chrome, la carga de imágenes y documentos se corrige agregando:
iframe.setAttribute('srcdoc', this._settings.action);en \admin\view\javascript\jquery\ajaxupload.js
var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />'); // src="javascript:false; was added // because it possibly removes ie6 prompt // "This page contains both secure and nonsecure items" // Anyway, it doesn't do any harm. iframe.setAttribute('id', id); iframe.setAttribute('srcdoc', this._settings.action); iframe.style.display = 'none'; document.body.appendChild(iframe);