Chrome 57使.data()功能不佳

时间:2017-03-30 23:06:36

标签: javascript jquery google-chrome

当用户在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
}

2 个答案:

答案 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 。 它应该工作。

请注意,这可以防止对象被垃圾回收,因此会对内存产生影响。