0

我正在制作一个数据可视化工具,您可以在其中输入自己的数据。数据值存储在无序列表中,如下所示<ul><li data-name='name'><a href='#' onclick='showEditDv(this);'>Edit</a><span class='name'>name</span><span class='seperator'> | </span><span class='value'>7</span></li></ul:列表中可以有多个列表项。当您单击 Edit 按钮时,它会调用该showEditDv()函数,并提供对自身的引用。在展示函数之前,我会说data对象是这样组织的:

data ->
    name: "root",
    children: [ {name: "something", size: "7"},
        {name: "something-else", size: "999"} ]

这是函数的代码:

function showEditDv(object) {
    var name = $(object).parent().attr("data-name"),
        input = new Opentip($(object), {removeElementsOnHide: true, target: null, showOn: null, hideTrigger: "closeButton"}),
        disabled = (data.children[getChildIndexByName(name)].hasOwnProperty("children")) ? "disabled" : "";

    input.setContent("<label>Name:</label><input type='text' data-prevname='" + name + "' value='" + name + "' class='dv-add-name' /><label>Value:</label><input " + disabled + " type='text' class='dv-add-value' value='" + data.children[getChildIndexByName(name)].size + "' /><button class='callEditDv'>Apply</button>"); // Set content of opentip

    input.show();

    $("body").on("click", ".callEditDv", function() {
        var newname = $(this).siblings(".dv-add-name").val(),
            prevname = $(this).siblings(".dv-add-name").attr("data-prevname"),
            value = $(this).siblings(".dv-add-value").val();

        if (newname !== prevname)
        {
            data.children[ getChildIndexByName(prevname) ].name = newname; // Update name

            $(object).parent().attr("data-name", newname); // Update parent data

            $(object).siblings(".name").text(newname); // Update form
        }

        if (data.children[ getChildIndexByName(newname) ].size !== value)
        {
            data.children[ getChildIndexByName(newname) ].size = value;
            $(object).siblings(".value").text(value);
        }
        input.hide();
    });
}

它使用 Opentip,这只是一种创建动态弹出窗口/工具提示的方式。问题是,一旦您更改了数据值一次,当您再次尝试更改它时,它会循环两次代码!第一次一切都按预期工作,但第二次它再次使用相同的prevname,这意味着getChildIndexByName返回undefined并且它无法设置导致错误的变量。getChildIndexByName循环data.children检查名称的值,直到找到匹配项,然后返回数组中对象的索引。

提前致谢!

4

2 回答 2

2

试试这个:

$("body").off('click').on("click",...

jQuery 文档

使用 .bind() 附加的事件处理程序可以使用 .unbind() 删除。(从 jQuery 1.7 开始,首选 .on() 和 .off() 方法来附加和删除元素上的事件处理程序。)

于 2013-04-05T09:29:54.947 回答
1

改变:

$("body").on("click",...

$("body").unbind('click').on("click",

希望这有帮助!

于 2013-04-05T09:24:39.377 回答