Esta parte de un .on("change") no funciona correctamente cuando los usuarios están trabajando en Chrome 57. Este es solo un problema de Chrome 57.
La variable userId en el if está configurada y tiene un valor antes de llegar a este fragmento de código.
Sin embargo, el condicional no se encuentra verdadero cuando debería.
Pero si estoy depurando y tengo un punto de interrupción establecido, pienso en el if y me detengo en el punto de interrupción y me detengo por un tiempo, ¿funciona correctamente?
Esto no afecta a todos los que usan 57.
Solo he podido recrear este problema dos veces y después de la depuración, desaparece.
¿Alguna idea de lo que está pasando y cómo solucionarlo?
También señalaré que estamos usando una versión muy antigua de jquery: 1.11.1 y la actualización no será fácil.
var selected = $(this).children("option:selected"); var name = selected.html(); var userId = selected.attr("value"); var personInList; $("li", "#list1").add("li.person", "#list2").each(function () { if ($(this).data("userId") == userId) { personInList = $(this); return; } }); if (userId && userId!= "default" && !personInList) { //some code that gets triggered that shouldn't because this "if" is turning up true }No sé la causa exacta, pero esto parece estar relacionado con la recolección de basura. Además, Chrome ha comenzado a hacer una aceleración agresiva de Javascript.
https://blog.chromium.org/2017/03/reduciendo-el-consumo-de-energia-para.html
https://docs.google.com/document/d/1vCUeGfr2xzZ67SFt2yZjNeaIcXGp2Td6KHN7bI02ySo
https://docs.google.com/document/d/18_sX-KGRaHcV3xe5Xk_l6NNwXoxm-23IOepgMx4OlE4
He estado intentando una solución muy hacky, pero parece mejorar las cosas:
var _oldjQueryData = jQuery.fn.data; var _chrome57Fix = {}; jQuery.fn.data = function(key, value){ if(key && value) { var resultElem = _oldjQueryData.call(this, key, value); var resultData = _oldjQueryData.call(this, key) var cacheKey = key + '_' + 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); _chrome57Fix[cacheKey] = resultData; return resultElem; } return _oldjQueryData.call(this, key); }Cargue esta pieza de Javascript después de jQuery y antes de su propio código . Deberia de funcionar.
Tenga en cuenta que esto evita que los objetos se recopilen como basura, por lo tanto, tiene un impacto en la memoria.
Para mí, esto funcionó:
En el lugar donde se establece .data(), simplemente guarde el elemento o el resultado de los datos en algún lugar .
$('#someElem').data('userId', '1234'); var elemData = $('#someElem').data('userId'); window['someUniqueKey'] = elemData; //or console.log(elemData); Luego, la llamada a $('#someElem').data('userId') debería devolver datos válidos en su controlador de eventos.
En cuanto a por qué sucede esto: estaría muy agradecido por una respuesta. Un colega mío sugirió que podría ser algo con la recolección de basura en el nuevo Chrome. Pero si es así, parece que es un error en el GC.