Javascript Chrome 57.data()功能不正常
当用户在Chrome 57中工作时,Javascript Chrome 57.data()功能不正常,javascript,jquery,google-chrome,Javascript,Jquery,Google Chrome,当用户在Chrome 57中工作时,.on(“更改”)事件的这部分无法正常工作。这只是一个问题 if中的userId变量已设置,并且在到达这段代码之前有一个值。 但是,当条件应该为真时,却找不到它 但是如果我正在调试并且设置了一个断点,我会在if上思考,然后在断点处停下来,逗留一段时间,这是否正常工作 这不会影响使用57的所有人。 我只能重新创建这个问题两次,调试后,它就消失了 知道发生了什么以及如何修复吗? 我还将注意到,我们使用的是非常旧的jquery-1.11.1版本,升级并不容易 var
.on(“更改”)
事件的这部分无法正常工作。这只是一个问题
if
中的userId
变量已设置,并且在到达这段代码之前有一个值。但是,当条件应该为真时,却找不到它 但是如果我正在调试并且设置了一个断点,我会在
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
}
对我来说,这就成功了: 在设置.data()的地方,只需将元素或数据结果保存在某个地方 然后,调用
$('#someElem').data('userId')
应该在事件处理程序中返回有效数据
至于发生这种情况的原因:我非常感谢您的回答。我的一位同事建议,这可能与新Chrome中的垃圾收集有关。但是如果是这样的话,它看起来像是GC中的一个bug。我不知道确切的原因,但这似乎与垃圾收集有关。 此外,Chrome已经开始进行一些激进的Javascript限制 我一直在尝试一个非常黑客的修复,但它似乎改善了一些事情:
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);
}
在jQuery之后加载这段Javascript,在拥有代码之前加载这段Javascript。
它应该会起作用
请注意,这可以防止对象被垃圾收集,因此它会影响内存。您可能会在它周围包装一个setTimeout,直到更好的东西出现。在设置了
userId
的地方发布代码可能会有所帮助。我还看到Chrome 57和.data()存在一些问题。不太确定是什么问题,因为它不一致。当我们刷新页面时,它会随机中断。我将此标记为答案,因为在设置属性后记录整个元素后,错误停止了。
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);
}