当用户在Chrome 57中工作时,.on("change")
事件的这一部分无效。这只是Chrome 57问题。
userId
中的if
变量已设置,并且在到达此段代码之前具有值。
但是,条件在它应该被发现时不会被发现。
但是,如果我正在调试并设置断点,我会考虑if
,我会在断点处停下来并停留一段时间,这样做是否正常。
这并不影响使用57的每个人 我只能重复这个问题两次,经过调试后,它就消失了。
知道发生了什么以及如何解决问题? 我还要注意,我们使用的是非常旧版本的jquery - 1.11.1并且升级并不容易。
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
}
答案 0 :(得分:1)
对我来说,这就是诀窍:
在设置.data()的位置,只需将元素或数据的结果保存在某处。
$('#someElem').data('userId', '1234');
var elemData = $('#someElem').data('userId');
window['someUniqueKey'] = elemData;
//or
console.log(elemData);
然后,对$('#someElem').data('userId')
的调用应该在事件处理程序中返回有效数据。
至于为什么会这样:我会非常感激的回答。我的一位同事建议在新的Chrome中使用垃圾收集。但如果是这样,它看起来像GC中的一个错误。
答案 1 :(得分:1)
我不知道具体原因,但这似乎与垃圾收集有关。 此外,Chrome已开始进行一些积极的Javascript限制。
https://blog.chromium.org/2017/03/reducing-power-consumption-for.html
https://docs.google.com/document/d/1vCUeGfr2xzZ67SFt2yZjNeaIcXGp2Td6KHN7bI02ySo
https://docs.google.com/document/d/18_sX-KGRaHcV3xe5Xk_l6NNwXoxm-23IOepgMx4OlE4
我一直在尝试一个非常糟糕的修复,但它似乎改善了一些事情:
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);
}
在您拥有代码之前加载此javascript 之后的jQuery 和。 它应该工作。
请注意,这可以防止对象被垃圾回收,因此会对内存产生影响。