Почему плагин jQuery Asual Address запускает событие change дважды? - PullRequest
1 голос
/ 25 февраля 2011

Привет,

Я использую плагин 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 ]

3 голосов
/ 11 марта 2011

Попробуйте использовать функции internalChange и externalChange.

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

2 голосов
/ 31 марта 2011

Мой обходной путь для этой проблемы - установка переменной 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 События специфичны для рельсов, но того же можно достичь с помощью обратных вызовов JQuery Ajax.

1 голос
/ 01 апреля 2011

Похоже, что последняя версия плагина на github (1.4) исправляет это.

Вот обновленный пример с использованием последнего плагина: http://jsfiddle.net/5L6Ur/10/

1 голос
/ 15 марта 2011

Я потратил много времени на устранение этой же проблемы.Я сузился до причины, но у меня нет решения, кроме как избежать.Проблема вызвана "=" в хеш-значении, которое вы создаете в своем примере.Я предполагаю, что проблема связана с анализом, выполняемым плагином, потому что я воссоздал проблему со многими общими символами-разделителями ("=", "&", "|", ":", ";"),Вы можете избежать проблемы двойного увольнения, заменив этих проблемных персонажей другими (я использую «/» и «.»).

Вот более конкретное объяснение симптомов, которые я вижу.Двойное срабатывание события изменения происходит как в IE, так и в Firefox с использованием метода .change () или комбинации методов .externalChange () и .internalChange.При использовании метода .change () нет реального указания на то, что происходит, но использование внутренних и внешних методов позволяет вам глубже понять проблему.Кажется, что внутреннее событие изменения ведет себя правильно, запускается только тогда, когда инициирующее событие действительно внутреннее.Однако внешнее событие, кажется, срабатывает постоянно, независимо от того, является ли инициирующее событие внутренним или внешним.В результате внешние события запускаются «правильно», что означает, что вызывается только метод externalChange ().Внутренние события запускаются «неправильно», что приводит к двойному запуску - метод internalChange () срабатывает, как и ожидалось, но метод externalChange () также срабатывает.

Надеюсь, это поможет.

0 голосов
/ 05 апреля 2013

Вы не должны заключать его в $ (function () {}); функция. Тогда это работает

...