Javascript Chrome 57.data()功能不正常

Javascript Chrome 57.data()功能不正常,javascript,jquery,google-chrome,Javascript,Jquery,Google Chrome,当用户在Chrome 57中工作时,.on(“更改”)事件的这部分无法正常工作。这只是一个问题 if中的userId变量已设置,并且在到达这段代码之前有一个值。 但是,当条件应该为真时,却找不到它 但是如果我正在调试并且设置了一个断点,我会在if上思考,然后在断点处停下来,逗留一段时间,这是否正常工作 这不会影响使用57的所有人。 我只能重新创建这个问题两次,调试后,它就消失了 知道发生了什么以及如何修复吗? 我还将注意到,我们使用的是非常旧的jquery-1.11.1版本,升级并不容易 var

当用户在Chrome 57中工作时,
.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);
}