JQuery没有看到更新的属性值

时间:2014-07-07 19:04:37

标签: javascript jquery html twitter-bootstrap modal-dialog

我有一些JS代码,我在其中使用ajax加载项目列表。每个项目都有相应的"编辑"像这样的按钮:

<button class="btn btn-default open-EditProjectDialog" data-toggle="modal" data-id="someProjectName" data-target="#editProjectModal">Edit</button>

data-id用于区分此按钮对应的项目。我为这些按钮的模态创建了通用处理程序:

$(document).on(
    "click",
    ".open-EditProjectDialog",
    function() {
        var projectName = $(this).data('id');
        console.log("onclick open-EditProjectDialog " + projectName);
        $(".modal-body #projectNameInput").val(projectName);
        sessionStorage.setItem("currentlyConsideredProject", projectName);
});

此处理程序使用当前项目名称填充输入表单。当用户在输入中更改此名称并单击“保存”按钮时,我向服务器发送ajax调用并动态更新DOM中的值:

$("#saveEditProjectButton").click(
function() {
var newProjectName = $('#projectNameInput').val();
var projectName = sessionStorage.getItem("currentlyConsideredProject");
    (...) //some checking
$.ajax({
    url : '/services/projects/' + projectName,
    type : 'PUT',
    data : newProjectName,
    success : function(result) {
        $('#editProjectModal').modal('hide');
        $.growl.notice({
           message : "Changes saved"
        });
        updateProjectInDom(projectName, newProjectName);
    },
    error : function() {
        $('#editProjectModal').modal('hide');
        $.growl.error({
             message : "Could not save the changes"
        });
    }
});
});

function updateProjectInDom(projectName, newProjectName) {
    var projectDiv = $("div #" + projectName);
    projectDiv.attr("id", newProjectName);  
    projectDiv.find("button").attr("data-id", newProjectName);
};

在chrome dev工具中,我可以看到在正确的ajax后,在DOM中更新了pUT data-id。但是,当我再次打开EditProjectDialog时,它会加载旧的projectName。任何建议我做错了什么以及为什么$(this).data(&#39; id&#39;)加载旧的data-id属性值?

2 个答案:

答案 0 :(得分:0)

.click()被认为是jQuery中的直接绑定,它不适用于动态生成的内容。 on()被认为是一个适合您需要的委托绑定:

$('body').on('click', '#saveEditProjectButton', function() {
    var newProjectName = $('#projectNameInput').val();
    var projectName = sessionStorage.getItem("currentlyConsideredProject");
        (...) //some checking
    $.ajax({
        url : '/services/projects/' + projectName,
        type : 'PUT',
        data : newProjectName,
        success : function(result) {
            $('#editProjectModal').modal('hide');
            $.growl.notice({
                message : "Changes saved"
            });
            updateProjectInDom(projectName, newProjectName);
        },
        error : function() {
            $('#editProjectModal').modal('hide');
            $.growl.error({
                 message : "Could not save the changes"
            });
        }
    });
});
编辑:忘记#saveEditProjectButton周围的引号。

答案 1 :(得分:0)

我的问题是我jQuery确实缓存了数据值。所以我最终没有使用jQuery,只是使用普通的Javascript。

jQuery的:

$('#element').data('id');

使用Javascript:

document.getElementByID('element').dataset.id;

普通的Javascript不会缓存任何内容并加载更新的data-id值。