javascript - 打开的 JqueryUI 对话框使用旧目标实例处理 onclick 事件

标签 javascript jquery

<div>
  <ul>
    <li><a data-id="1" href="#">Show dialog 1</a></li>
    <li><a data-id="2" href="#">Show dialog 2</a></li>
    <li><a data-id="3" href="#">Show dialog 3</a></li>
    <li><a data-id="4" href="#">Show dialog 4</a></li>
    <li><a data-id="5" href="#">Show dialog 5</a></li>
    <li><a data-id="6" href="#">Show dialog 6</a></li>
  </ul>
</div>

<div class="dialogTest" style="display: none">
<p>Are you shure you want to delete this link?</p>
<p style="margin-top: 15px; text-align: center;"><button>Delete it!</button></p>
</div>
<div class="dialogTestMenu" style="display: none">
<p style="margin-top: 15px; text-align: center;"><a href="#">Delete this link</a></p>
</div>
$(function () {
    var ulMenu = function (target) {

    console.log('target item',target);

    $('.dialogTestMenu').dialog({
        title: 'Item #' + target.dataset.id + ' menu',
        modal: true,
        open: function () {
            var rootDialog = this;

            $(this).find('a').on('click', function () {
                $(rootDialog).dialog('close');

                $('.dialogTest').dialog({
                    title: 'Confirm delete #' + target.dataset.id,
                    modal: true,
                    open: function () {
                        var selfDialog = this;
                        $(this).find('button').on('click', function () {
                            console.log('target item to delete',target);
                            $(target).remove();
                            $(selfDialog).dialog('close');
                            return false;
                        });
                    },
                    buttons: {
                        Cancel: function () {
                            $(this).dialog('close');
                            $(rootDialog).dialog('open');
                        }
                    }
                });
                return false;
            });
        },
        buttons: {
            Cancel: function () {
                $(this).dialog('close');
            }
        }
    });

    };

    $('ul a').on('click', function () {
        ulMenu(this);
        return false;
    });
});

我有一个项目列表。单击项目调用带有菜单的对话框。通过单击菜单项删除此链接,我会收到另一个确认对话框。当我从第二个对话框中取消删除第一个项目(例如),然后我尝试删除任何其他项目时,它会删除第一个项目,该项目已被取消。

请解释一下,当我尝试处理第二个对话框内的按钮点击时,为什么会得到 target 的旧实例。

Check out code ,填写免费使用控制台。

最佳答案

因为每次打开对话框时都使用.on(),所以它会向按钮附加一个新的单击函数。我改变你的jsFiddle。 Check it out 。我取消绑定(bind)最新的函数,然后绑定(bind)新的函数,顺便说一句,稍微改变了你的构造。

$(function () {
    var ulMenu = function () {
        var $this = $(this);
        $this.addClass('active');

        console.log('target item', this);

        $('.dialogTestMenu').dialog({
            title: 'Item #' + $this.data('id') + ' menu',
            modal: true,
            buttons: {
                Cancel: function () {
                    $(this).dialog('close');
                    $('.wrap a.active').removeClass('active');
                }
            }
        });

    };

    $('.dialogTestMenu a').bind('click', function () {
        $('.dialogTestMenu').dialog('close');

        var $current = $('.wrap a.active');

        $('.dialogTest').dialog({
            title: 'Confirm delete #' + $current.data('id'),
            modal: true,
            open: function () {
                var selfDialog = this;
                $(this).find('button').unbind('click').bind('click', function () {
                    console.log('target item to delete', $current.get(0));
                    $current.remove();
                    $(selfDialog).dialog('close');
                });
            },
            buttons: {
                Cancel: function () {
                    $(this).dialog('close');
                    $('.dialogTestMenu').dialog('open');
                }
            }
        });
    });

    $('ul a').on('click', ulMenu);
});

关于javascript - 打开的 JqueryUI 对话框使用旧目标实例处理 onclick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8399196/

相关文章:

javascript - 如何在过滤器中访问父重复模板中的项目

javascript - Zurb Foundation Top Bar & jQuery - 检查移动导航是否处于事件状态

jquery - CSS 动画 : Remove class with gently transition

javascript - 使用 jquery 附加到 href 值的末尾

javascript - 对数组中的所有数字求和,直到达到某个值

javascript - React-Router - 在路由数组映射外使用 <Switch> 时出错

javascript - 如何使用 JQuery 将 slider 中的所有表单值存储在对象、数组或 json 中?

javascript - 如何获取在第一页创建的另一个 php 文件上创建的 JavaScript 对象?

javascript - 当使用 "for in"定义时,如何使用 `Object.defineProperty` 循环访问 JavaScript 对象的属性

asp.net - 如何从服务器端关闭 jQuery (iFrame) 厚盒?