Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

225
Views
Chrome 57 hace que .data() no funcione bien

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 }
about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

about 4 years ago · Santiago Trujillo Report

0

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.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!