"on" предотвращать дефолт - PullRequest
6 голосов
/ 14 марта 2012

Что мне здесь не хватает?

Обратите внимание: используется jQuery MOBILE

Если я использую warnDefault, то страница загружается так, как будто у меня только ссылки и нет сценария, когда я возвращаю false (который я всегда использовал для простого обработчика событий JS onclick), она работает как положено. Я уже просмотрел другие посты, и все они используют .click и все предлагают предотвращение дефолта.

$(document).ready(function() {
  $("#leftdiv a").on("click",function(e) {
    $("#rightDiv").load(this.href);
    return false; // I was sure preventDefault would work
  });
});

HTML

<div id="leftdiv" style="position:absolute;padding-right:5%; overflow:scroll;">
<a href="page1.htm">Launch page 1</a><br />
<a href="page2.htm">Launch page 2</a>
</div>

<div id="rightDiv" style="padding-left:30%"></div>

Ответы [ 2 ]

16 голосов
/ 14 марта 2012
e.preventDefault();

не работает?

$('a').on("click",function(e){
     //do something
     e.preventDefault();
});

Помещение e.preventDefault(); сверху или сверхуконец вашего кода обычно не имеет значения.Существует также метод e.stop() Я думаю.Но почему бы вам не придерживаться return false;, когда он работает на вас?

Из мобильной документации jQuery:

Отмена поведения щелчков по умолчанию для элементов

Приложения могут вызывать warnDefault () в событии vclick, чтобы отменить поведение по умолчанию для щелчка элемента.На устройствах, основанных на мыши, вызов метода protectDefault () для события vclick приравнивается к вызову protectDefault () для события реального щелчка во время фазы пузырькового события.На сенсорных устройствах это немного сложнее, поскольку фактическое событие click отправляется примерно через 300 мс после отправки события vclick.Для сенсорных устройств вызов метода warnDefault () для события vclick запускает некоторый код в подключаемом модуле vmouse, который пытается перехватить следующее событие щелчка, отправляемое браузером, во время фазы события захвата, а также вызывает методы protectDefault () и stopPropagation () дляЭто.Как упомянуто в предупреждении выше, иногда трудно сопоставить событие касания с соответствующим событием мыши, потому что цели могут отличаться.По этой причине плагин vmouse также пытается идентифицировать соответствующее событие клика по координатам.Все еще существуют случаи, когда происходит сбой идентификации цели и координаты, что приводит к отправке события щелчка и либо к запуску действия элемента по умолчанию, либо к случаю, когда содержимое было перемещено или заменено, вызывая щелчок по другому элементу.Если это происходит на регулярной основе для данного элемента / элемента управления, мы рекомендуем использовать щелчок для запуска вашего действия.

function() {
  return false;
}

// IS EQUAL TO

function(e) {
  e.preventDefault();
  e.stopPropagation();
}

Источник: http://css-tricks.com/return-false-and-prevent-default/

Также кажется, что .on() также не поддерживается в качестве документа. Уже не поддерживается

Источник: http://jquerymobile.com/test/docs/api/events.html

0 голосов
/ 17 января 2018

Это может обеспечить решение, но мне не хватает информации, чтобы объяснить почему. Недавно я столкнулся с проблемой, в которой предотвратительная защита не работает в аналогичном коде, и проблема заключается в делегировании от $(document) vs $('body'), попробуйте следующее:

<a href="http://stackoverflow.com" id="test1">Test 1</a>
<a href="http://stackoverflow.com" id="test2">Test 2</a>
<script>
    $('body').on('click', '#test1', function(e) {
        e.preventDefault();
        alert('hi 1');
    });

    $(document).on('click', '#test2', function(e) {
        e.preventDefault();
        alert('hi 2');
    });
</script>

Этого не происходит, однако с jQuery 3.2.1, я могу только подтвердить, что это проблема с 2.1.7

...