2012-03-14 8 views
6

Czego mi tu brakuje?"on" preventDefault

Uwaga: jQuery MOBILE służy

Jeśli używam preventDefault wczytywania strony jakbym miał tylko linki i bez scenariusza, gdy Zmieniam na false (co zawsze używałem w zwykłym module obsługi zdarzeń JS onclick), działa zgodnie z oczekiwaniami. Przeglądałem już inne posty i wszystkie zastosowania .click i wszystkie sugerują preventDefault.

$(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> 
+1

w przeciwieństwie do 'return false', który zwykle jest umieszczony na końcu, spróbuj użyć' e.preventDefault() 'przed wszystkim innym. – Joseph

+0

@Joseph na pewno jest umieszczony na końcu, jest to ostatnia pica kodu, który zostanie wykonany. Nie zależy od tego, w którym miejscu zostanie wywołane wywołanie preventDefault. –

+0

_ "działa zgodnie z oczekiwaniami" _ - czy mógłbyś nieco wyjaśnić, co oznacza "zgodnie z oczekiwaniami" w tym przypadku? Jakie jest twoje pożądane zachowanie? Czy możesz pokazać dokładny kod, który nie działa? – nnnnnn

Odpowiedz

15
e.preventDefault(); 

nie działa?

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

Umieszczenie e.preventDefault(); na górze lub na końcu kodu nie ma znaczenia normalnie. Jest też pewnie metoda e.stop(). Ale dlaczego nie pozostaniesz przy return false;, kiedy będzie działać?

Od jQuery dokumentacji telefonu:

Anulowanie domyślnych elementów kliknij zachowanie ruchowe

Aplikacje mogą dzwonić preventDefault() w przypadku VKLIKNIJ anulować domyślny kliknij zachowanie danej elementu. W urządzeniach opartych na myszach wywoływanie preventDefault() na zdarzeniu vclick jest równoznaczne z wywołaniem preventDefault() dla zdarzenia real click podczas fazy zdarzenia bubble. Na urządzeniach dotykowych jest to nieco bardziej skomplikowane, ponieważ rzeczywiste zdarzenie click jest wysyłane około 300ms po wywołaniu zdarzenia vclick. W przypadku urządzeń dotykowych wywoływanie metody preventDefault() w przypadku zdarzenia vclick uruchamia kod w wtyczce vmouse, która próbuje przechwycić zdarzenie następnego kliknięcia, które zostanie wywołane przez przeglądarkę, podczas fazy przechwytywania zdarzenia i wywołania preventDefault() i stopPropagation() na tym. Jak wspomniano w powyższym ostrzeżeniu, czasami trudno jest dopasować zdarzenie dotykowe z odpowiednim zdarzeniem myszy, ponieważ cele mogą się różnić. Z tego powodu wtyczka vmouse również powraca do próby zidentyfikowania odpowiedniego zdarzenia kliknięcia według współrzędnych. Wciąż są przypadki , w których nie powiodła się identyfikacja docelowa i koordynacyjna, co powoduje, że zdarzenie click jest wywoływane i powoduje domyślną akcję elementu, lub w przypadku, gdy treść została zmieniona lub zastąpiona zawartością , co powoduje kliknięcie inny element.Jeśli to się zdarza regularnie dla danego elementu/kontrolki, sugerujemy, że klikniesz, aby uruchomić swoje działanie.

function() { 
    return false; 
} 

// IS EQUAL TO 

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

Źródło:http://css-tricks.com/return-false-and-prevent-default/

Wydaje się również, że .on() ISN obsługiwane także document.ready nie jest obsługiwana

Źródło:http://jquerymobile.com/test/docs/api/events.html

+0

@mplungjan Edytowałem swoją odpowiedź. Wygląda na to, że nie ma prawdziwego sposobu na to, –

+0

Proszę spojrzeć na moje aktualizacje – mplungjan

+0

OK, zrobiłem to, ale dlaczego nie używasz zwrotu false; kiedy to działa? –

1

Może to zapewnić rozwiązanie, ale brakuje mi informacji wyjaśniających dlaczego . Niedawno natknąłem emisji gdzie preventDefault nie pracował w podobnym kodzie, a problem polega na przekazaniu z $(document) vs $('body') spróbuj wykonać następujące czynności:

<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> 

Nie zdarza się to jednak z jQuery 3.2.1, mogę tylko potwierdzić jest to problem z 2.1.7

+1

jak ta odpowiedź na pytanie, kiedy nie można nawet wyjaśnić, dlaczego? –

Powiązane problemy