【问题标题】:jquery live() appending click events causing multiple clicksjquery live() 附加点击事件导致多次点击
【发布时间】:2012-10-04 09:02:50
【问题描述】:

我的 asp.net MVC3 应用程序中的 jQuery ajax 功能出现了一些奇怪的行为。

我有几个数据框,每个数据框都包含一个链接,用于打开弹出窗口并更改每个框中的数据。为此,我添加了一个 jquery live() click 事件来通过 jQuery ajax 调用处理数据。在 ajax 调用的“成功”方法中,我获取返回数据并打开一个 UI 对话框弹出窗口(部分视图),其中包含单选按钮列表。我选择了一个不同的单选按钮并按下“关闭” - 关闭按钮会触发另一个 live() 点击事件,通过 ajax 调用处理新数据,该调用会刷新主页上框中的数据。

这是第一次完美运行。如果您然后单击以再次更改它,弹出窗口将打开,允许您选择一个新值,但是这次在弹出窗口上按下关闭会触发两个点击事件,这会在我的 MVC 控制器中引发空错误。

如果你重复这个过程,它会触发 3 个点击事件,所以很明显 live() 正在某处附加这些事件。

我尝试过使用on()click(),但是页面本身是由通过ajax 加载的面板组成的,所以我使用live() 来自动绑定事件。

这是我正在使用的代码:

HTML

<p><!--Data to update goes here--></p>
<a href="#" class="adjust">Update Data</a>

First Click 事件调用带有局部视图的弹出窗口

$('a.adjust').live('click', function (e) { 
    var jsonData = getJsonString(n[1]);
    var url = '@Url.Action("ChangeOptions", "Search")';
    var dialog = $('<div id="ModalDialog" style="display:none"></div>').appendTo('body');
    // load the data via ajax
    $.ajax({
        url: url,
        type: 'POST',
        cache: false,
        contentType: "application/json; charset=utf-8",
        data: jsonData,
        success: function (response) {
            dialog.html(response);
            dialog.dialog({
                bgiframe: true,
                modal: true
                }
            });
        }
    });
    e.preventDefault();
});

第二次点击事件,获取新信息以返回更新的局部视图

$('a#close').live('click', function (event) { 
    var jsonData = getJsonString(n[1]);
    var url = '@Url.Action("GetChangeInfo", "Search")';
    $.ajax({
        url: url,
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        data: jsonData,
        success: function (response) {
            $('#box-' + @column).html(response);  //this refreshes the box on the main page
        },
        error: function () {
        }
    });
    $('#ModalDialog').dialog('close');
    event.preventDefault();
});

有人知道这里可能发生什么,我该如何解决?

【问题讨论】:

  • 不回答您的问题,但请停止使用.live() 方法。一直是deprecated for ages now。请改用.on() (jQuery 1.7+) 或.delegate()
  • 是的,我尝试过 on(),但由于父 div 加载了 ajax,甚至无法触发链接,这就是我回到 live() 的原因。
  • 阅读.on() 的文档。您不能只用 .on 替换 .live 并期望它立即工作 - 您需要稍微重构代码。

标签: asp.net-mvc-3 jquery


【解决方案1】:

使用命名空间来解除之前的点击绑定,如下所示:

$('a.adjust').unbind('click.adjustclick');

然后将点击动作绑定到a.adjust:

$('a.adjust').bind('click.adjustclick', function(){

  //your code here

  //note the return false, this prevents the browser from visiting the URL in the href attribute
  return false;
});

如果我对您的理解正确,您尝试在对话框关闭时运行第二次单击操作。因此,我会为这样的对话框使用内置关闭功能:

$('a.adjust').bind('click.adjustclick', function(){
    var jsonData = getJsonString(n[1]);
    var url = '@Url.Action("ChangeOptions", "Search")';
    var dialog = $('<div id="ModalDialog" style="display:none"></div>').appendTo('body');
    // load the data via ajax

    $.ajax({
        url: url,
        type: 'POST',
        cache: false,
        contentType: "application/json; charset=utf-8",
        data: jsonData,
        success: function (response) {
            dialog.html(response);
            dialog.dialog({
                bgiframe: true,
                modal: true,
                close: function(){
                    var jsonData2 = getJsonString(n[1]);
                    var url2 = '@Url.Action("GetChangeInfo", "Search")';

                    $.ajax({
                        url: url2,
                        type: 'POST',
                        contentType: "application/json; charset=utf-8",
                        data: jsonData2,
                        success: function (response2) {
                            $('#box-' + @column).html(response2);  //this refreshes the box on the main page
                        },
                        error: function () {
                        }
                    });
                  }
                }
            });
        }
    });
});

如果你使用自己的按钮a#close,给它绑定一个点击事件来关闭对话框,它会自动触发对话框的关闭函数。

$('a#close').unbind('click.closedialog');
$('a#close').bind('click.closedialog', function () {
  $('#ModalDialog').dialog('close');
  return false;
}

【讨论】:

  • 感谢 feskr - 这对于点击“X”按钮关闭弹出窗口和更新非常有效。将事件绑定和解除绑定到关闭按钮仍然会产生相同的结果,但我现在可能已经足够了。非常感谢
  • 关闭按钮的绑定应该在弹窗加载时完成。因为在那之前是不存在的。因此,您可能想在第一次响应之后尝试绑定它,或者在您在第一次 ajax 调用中调用的 ajax 文件中尝试绑定它。
  • 不,仍然没有变化。没关系,我会使用刚才的弹出关闭按钮,等我有时间再回来。再次感谢您的帮助。
【解决方案2】:

试试这个:

$('a#close').unbind('click').bind('click', function (event) {
//Your Code
});

【讨论】:

  • 谢谢,但不幸的是没有工作。结果完全没有变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
相关资源
最近更新 更多