单击时为什么无法在动态创建的按钮上看到数据字段?

时间:2014-09-04 16:01:51

标签: javascript jquery html dom jquery-data

编辑: 这是一个JSFiddle,它显示了我遇到的问题:

http://jsfiddle.net/gyhvpmgy/4/


我有以下功能创建动态div:

InvalidField.prototype.getMessageStructure = function(){
    var div = $('<div></div>').addClass('invalidRow');      
    var span = $('<span></span>')
        .text(this._message)
    var button = $('<button></button>')
        .addClass('btn_AlertFocus')
        .text("Go To Field")
        .data("field", this._field[0].name)    

    return div.append(button).append(span);
};

在返回行之前,通过调试,我可以看到button.data(&#39;字段&#39;)包含,应该:&#34; applicant.email&#34;。

我还有以下通用按钮点击事件:

$(document).on('click', '.btn_AlertFocus', function() {
    var field = $(this).data('field');
    goToFieldFromAlert('input[name="' + field + '"]');
});

&#39;字段&#39;现在是未定义的。

有人能够告诉我为什么,它可能会显而易见 - 这对我来说是一个新功能吗?

以下是获取此返回字符串值的代码段。

function validateForm(){
    if(list_Invalid.size() > 0){
        var structure = "";
        for ( i = 0; i < list_Invalid.size(); i ++){
            structure += list_Invalid.item(i).getMessageStructure()[0].outerHTML;
        }
        var alert = new Alert(structure, 
                function(){
                }
            ).showAlert();      
        return false;
    }
    return true;
}

非常感谢!

1 个答案:

答案 0 :(得分:2)

jQuery使用内部表示来处理data

如果您最初在HTML元素上有data属性,那么执行$('foo').data('bar')会导致jQuery将该属性读入内存。进一步使用data进行修改,不会导致属性发生变化。

如果您首先没有该属性,那么jQuery将在内存中与data一起使用,该属性将永远不会出现在HTML中。

要显式更新HTML属性,请使用:

$('foo').attr('data-bar', 'value');

但速度较慢并将值转换为字符串。