jQuery protectDefault () не работает так, как я ожидал - это ошибка jQuery? - PullRequest
1 голос
/ 05 декабря 2011

Это упрощенный код для точного воспроизведения проблемы, с которой я столкнулся в jQuery.

Я бы ожидал, что он отменит исходный щелчок, а затем снова вызовет событие щелчка, что, в свою очередь, приведет к загрузке браузерассылка на URL.

<script type="text/javascript">
$( function()
{
    var confirmed = false;
    $('a').click( function( event )
    {
        if ( confirmed == false )
        {
            event.preventDefault();
            confirmed = true;
            $(event.target).trigger( 'click' );
        }
    });
});

</script>

Исходный вопрос здесь

Я не хочу менять window.location.Я хочу, чтобы сработали все обработчики событий, которые были связаны с событием click.Так получилось, что я тоже хочу, чтобы браузер перешел по ссылке.

Ответы [ 6 ]

2 голосов
/ 17 декабря 2011

.trigger('click') не будет запускать действие браузера по умолчанию - оно просто вызовет обработчики событий jQuery, связанные с этим событием в этом элементе.

Посмотрите на этот ответ - вынужно создать и запустить событие клика самостоятельно.Вот код из этого ответа:

function fireEvent(obj,evt){
    var fireOnThis = obj;
    if( document.createEvent ) {
      var evObj = document.createEvent('MouseEvents');
      evObj.initEvent( evt, true, false );
      fireOnThis.dispatchEvent( evObj );

    } else if( document.createEventObject ) {
      var evObj = document.createEventObject();
      fireOnThis.fireEvent( 'on' + evt, evObj );
    }
}
2 голосов
/ 05 декабря 2011

Ваш обработчик событий всегда будет запускаться, когда вы инициируете событие "click" и до того, как произойдет поведение по умолчанию.Так что нет, это не ошибка.

edit - Если вы хотите, чтобы действие по умолчанию происходило при щелчке элемента и выполнении ваших различных условий, просто return из вашего обработчика.

$('a').click( function( event )
{
    if ( confirmed == false )
    {
        event.preventDefault();
        confirmed = true;
    }
    else
        return;
});

Когда ваш обработчик вернется, браузер продолжит работу по умолчанию.

снова отредактируйте - и, конечно, если вы хотите просто выполнить программнодействие по умолчанию для тега <a> с атрибутом "href", это просто:

   window.location = $(element).attr('href');

Нет необходимости в событии "click" вообще.

0 голосов
/ 15 декабря 2011

Как насчет создания ссылки вне экрана, которая будет обрабатывать последний клик?Таким образом, вы можете предотвратить щелчок по исходной ссылке, обработать код, а затем приступить к срабатыванию щелчка скрытой копии.

0 голосов
/ 13 декабря 2011

Я просто напишу, пока буду анализировать, надеясь, что за ним будет легко следить и его будет легко сравнивать с вашим кодом.Пинайте меня, когда я могу каким-либо образом оптимизировать / улучшить свои ответы.

проверка - часть 1

Переместите «protectDefault» за пределы оператора «if»!Если вы не переместите его за пределы «if», код пропустит «protectDefault», если подтверждено == true.

  <script type="text/javascript">
  $( function()
  {
      var confirmed = false;
      $('a').click( function( event )
      {
          event.preventDefault();                  
          if ( confirmed == false )
          {
              confirmed = true;
              $(event.target).trigger( 'click' );
          }
      });
  });
  </script>

проверка - часть 2

Кроме того, я задаюсь вопросом о существовании "подтвержденного var" в целом.Код также будет работать без ошибок, так как вы не используете подтвержденную переменную в функции где-либо еще ...

  <script type="text/javascript">
  $( function()
  {
      $('a').click( function( event )
      {
          event.preventDefault();                  
          $(event.target).trigger( 'click' );
      });
  });
  </script>

проверка - часть 3

Зная, что вы можете заменить триггер простым щелчком, вы пробовали это?

 <script type="text/javascript">
  $( function()
  {
      $('a').click( function( event )
      {
          event.preventDefault();                  
          $(event.target).click();
      });
  });
  </script>

проверка - часть 4

Если щелчок по целевому элементу все еще не удалсяОпределенно пора проверять (используя «FireBug on Firefox» или тому подобное), если «event.target» вообще содержит объект.Вы никогда не знаете ...

проверка - часть 5

Еще одна вещь: я не вижу Документ готов проверка, поэтому янадеюсь, что вы поместили этот скрипт в конец вашего файла, прямо перед тегом "".Если вы загрузите его в «» без проверки Document Ready , может случиться так, что javascript попытается привязать событие к элементу, который еще не загружен в dom ... который будеткак бросать перья на 9-дюймовую стальную пластину ... ничего не произойдет.;)

вот и все

Это все, что приходит на ум как ответ на ваш вопрос.Один из них может решить вашу проблему.По крайней мере, это то, на что я надеюсь.Эти маленькие фрагменты здесь, в stackoverflow, оставляют огромные вероятности, связанные с тем, что мы не видим.Трудно быть уверенным в том, что может отсутствовать, если у вас нет «полного представления».;)

0 голосов
/ 05 декабря 2011

Похоже, у вас есть одно состояние, в котором вы хотите запретить действие по умолчанию (и обновить флаг), и другое состояние, в котором вы просто хотите применить действие по умолчанию. Разве удаление чехла else не поможет? При отсутствии preventDefault() действие по умолчанию по-прежнему будет выполняться.

Редактировать: в ответе Pointy теперь ваш код обновляется аналогичным образом.


Edit: я до сих пор не совсем уверен, что вы собираетесь, но если по какой-то причине вы должны запустить вручную, один из способов предотвратить переполнение стека из-за рекурсии было бы назначить пользовательское событие (т.е. не click), а затем всегда подавить действие по умолчанию. Затем в вашем условном выражении либо выполните, либо не запустите пользовательское событие.

Итак, что-то вроде этого (не проверено):

$('a')
  .bind('fancyclick', function () { // Your special click logic
    changeStatusOf( confirmed );
    doCrazyStuff();
    location.replace( $(this).attr('href') ); // or whatever
  })
  .click( function (e) {
    e.preventDefault(); // Always suppress natural click
    if ( confirmed ){
      $(this).trigger('fancyclick'); // Fire the special click
    }
  });
0 голосов
/ 05 декабря 2011

protectDefault () не отменяет действие щелчка, связанного с jquery; отменяет действие по умолчанию, которое присваивается тегу привязки. unbind () - подходящая функция для отмены любого действия / функции, связанной с объектом.

...