为什么jQuery Asual Address插件会触发两次更改事件?

时间:2011-02-25 16:41:15

标签: jquery jquery-plugins jquery-address

问候,

我正在使用jQuery Asual Address插件:http://www.asual.com/jquery/address/

出于某种原因,在Firefox和IE(但不是Chrome)中,当其中一个参数是url(以“http://”开头)时,地址更改事件会触发两次。

这是一个例子的小提琴:http://jsfiddle.net/5L6Ur/

点击“foo”链接演示了我的问题。非常感谢任何帮助。

代码:

$(function() {
    $('a').click(function(e) {
        e.preventDefault();
        $.address.value($(this).attr('href'));
    });
    var changecount = 0;
    $.address.change(function(event) {
        $('span').html(changecount++);
    });
});

<a href="?u=http://foo.bar">foo</a><br />
<a href="?u=foo.bar">bar</a><br />
<span></span>

5 个答案:

答案 0 :(得分:3)

尝试使用internalChange和externalChange函数。

http://jsfiddle.net/5L6Ur/9/

答案 1 :(得分:2)

我解决此问题的方法是设置searching变量。

类似的东西:

$(function () {
  var searching = false;
  $('form.ajaxified').live('ajax:beforeSend.rails', function(){
    $.address.value('?' + $('form.ajaxified').serialize());
    searching = true;
  });
  $('form.ajaxified').live('ajax:complete.rails', function(){
    searching = false;
  });
  $.address.externalChange(function(event) {
    if (!searching) {
      $('form.ajaxified').submit();
    }
  });
});

当我以用户身份触发(通过提交表单)但在我回击按钮或重新加载页面时运行它时,这可以防止双重ajax请求。希望有所帮助。

PS事件是特定于rails的,但使用JQuery Ajax calbacks可以实现相同的功能。

答案 2 :(得分:1)

我花了很多时间来解决同样的问题。我已经缩小了原因,但除了回避之外,我没有提供解决方案。问题是由您在示例中创建的哈希值中的“=”引起的。我猜这个问题与插件执行的解析有关,因为我用许多常见的分隔符来重新创建问题(“=”,“&amp;”,“|”,“:”,“;” )。你可以通过用其他人替换这些麻烦的字符来避免双击问题(我正在使用“/”和“。”)。

这是我所看到的症状的更具体的解释。使用.change()方法或.externalChange()和.internalChange方法的组合,在IE和Firefox中都会发生更改事件的双重触发。如果使用.change()方法,则没有真正指示发生了什么,但使用内部和外部方法可以让您更深入地了解问题。内部更改事件似乎行为正常,仅在触发事件实际为内部时触发。但是,无论触发事件是内部事件还是外部事件,外部事件似乎始终触发。结果是外部事件“正确”触发,意味着只触发externalChange()方法。内部事件“错误地”触发,导致双击 - internalChange()方法按预期触发,但externalChange()方法也会触发。

希望这有帮助。

答案 3 :(得分:1)

看起来github(1.4)上最新版本的插件修复了这个问题。

这是使用最新插件的更新示例: http://jsfiddle.net/5L6Ur/10/

答案 4 :(得分:0)

你不应该用$(function(){})包装它;功能。然后它工作