Объединение обработчиков событий DOM0 и DOM2 - отмена события возможна в обработчике DOM0? - PullRequest
2 голосов
/ 01 апреля 2010

рассмотрите следующую проблему:

(1) Вы присвоили встроенный обработчик события элементу DOM, например, <a id="link1" href="..." onclick=" ... ´">

(2) Вы также назначаете один или несколько дополнительных обработчиков событий для события onclick link1 с помощью механизма присваивания, специфичного для DOM2 или IE.

Проверенное поведение в FF3.019 и IE7: обработчик, назначенный в (1), выполняется ДО всех обработчиков, назначенных в (2), в случае щелчка. Это хорошо (так что, наверное, ничего не написано в камне ...). Но давайте на минуту положимся на это поведение.

ВОПРОС сейчас: возможно ли ОТМЕНИТЬ всплывающее окно события щелчка для обработчиков, назначенных в (2) В РАМКАХ обработчика, назначенного в (1)?

Прежде, чем вы закричите: Конечно, почему бы и нет, посмотрите следующее: Предположим, вы присваиваете onclick = "if (ready1) возвращает true; в противном случае возвращает load (event);" на link1 и определите загрузку как

function loading(e) {
    // alert("Still loading functionality - sorry, slow line perhaps...");
    // no propagation
    if( e.stopPropagation ) { e.stopPropagation(); }
    e.cancelBubble = true;
    return false; // Cancel default handling
}

в некотором теге скрипта выше. Это НЕ препятствует распространению (ни в FF3.019, ни в IE) на обработчики, назначенные в (2).

Любая подсказка приветствуется! Заранее спасибо!

Jannico

Контекст (или: зачем мне это делать?):

A) Ленивая / поздняя загрузка javascript для быстрого восстановления содержимого.
-> вы хотите сообщить пользователю, что некоторые функциональные возможности все еще загружаются (вместо простого отключения элемента пользовательского интерфейса, который не очень удобен для пользователя - почему эта кнопка отключена ???). Вы также хотите использовать минимальный javascript, уже встроенный в страницу, потому что загрузка библиотеки javascript сначала дополнительным запросом несколько противоречит цели (в противном случае вы, конечно, можете использовать один из реализованных механизмов, которые позволяют регистрировать события с гарантированной последовательностью выполнения ( который вам понадобится для B, см. ниже)

и B) вы также хотите «освободить зверей» в один «атомный» момент времени, то есть вы не хотите, чтобы вас принудительно интегрировали / меняли все обработчики, назначенные в (2), для ожидания для какого-то сигнала «теперь вам разрешено работать, потому что все загружено», вы просто хотите передать этот сигнал только заголовку цепочки обработки событий (обработчику, назначенному в (1)), который затем может просто начать распространение событие, что бы ни случилось (в противном случае возможны частичные реакции на ввод пользователя, потому что некоторые функции уже подключены, а другие нет - что потенциально хуже, чем ничего не делать;)

1 Ответ

0 голосов
/ 01 апреля 2010

Краткий ответ: Нет.

Длинный ответ: Вы можете использовать первый обработчик, чтобы установить переменную, которую проверяют второй (и последующие) обработчики. Вот быстрый пример

<div id="outer">
  <a id="link1" href="#" onclick="return loading();">test</a>
</div>

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>
<script type="text/javascript">

var passCheck = false;

setTimeout( function()
{
  passCheck = true;
}, 5000 );

function loading()
{
  alert( 'a#link1 was clicked!' );
  return false;
}

$(function()
{
  $('#link1').click( function( event )
  {
    if ( !passCheck )
    {
      event.stopPropagation();
    }
  });

  $('#outer').click( function( event )
  {
    alert( 'div#outer was clicked!' );
  });
});

</script>

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

...