Jak usunąć „onclick” za pomocą JQuery?


100

Kod PHP:

<a id="a$id" onclick="check($id,1)" href="javascript:void(0)"  class="black">Qualify</a>

Chcę usunąć, onclick="check($id,1)aby link nie mógł zostać kliknięty lub „ check($id,1)nie zostanie uruchomiony . Jak mogę to zrobić z JQuery?

Odpowiedzi:


238

Old Way (przed 1.7):

$("...").attr("onclick", "").unbind("click");

Nowy sposób (1.7+):

$("...").prop("onclick", null).off("click");

(Zastąp ... selektorem, którego potrzebujesz.)


26
Czy nie powinno to być removeAttr („onclick”)?
Roatin Marth

Tak, słuszna uwaga, może być czystsza, ale nie jestem pewien, czy różniłaby się od punktu widzenia wykonania.
glmxndr

6
Z jQuery 1.7+ możesz korzystać z włączania / wyłączania: stackoverflow.com/questions/209029/…
Lance Cleveland

6
Zobacz pierwszy komentarz do removeAttr api.jquery.com/removeattr Removing an inline onclick event handler using .removeAttr() doesn't achieve the desired effect in Internet Explorer 6, 7, or 8. To avoid potential problems, use .prop() instead
andyface

2
@andyface tak, to jest w dokumentacji, ale musiałem używać .prop()również dla IE11.
onetwo12

58

Wiem, że to dość stare, ale kiedy zagubiony nieznajomy znajdzie to pytanie szukając odpowiedzi (tak jak ja), to jest to najlepszy sposób, aby to zrobić, zamiast używać removeAttr ():

$element.prop("onclick", null);

Cytując oficjalne doku jQuerys :

„Usunięcie wbudowanej procedury obsługi zdarzeń onclick za pomocą .removeAttr () nie daje pożądanego efektu w programie Internet Explorer 6, 7 lub 8. Aby uniknąć potencjalnych problemów, użyj zamiast tego .prop ()”


1
Przekonałem się, że jest to najlepszy sposób na usunięcie zdarzenia onlick po wpisaniu go w ten sposób. <span onlick="method()">sometext>/span>Wydarzenie jest w pełni niezwiązane i działa świetnie
zdarsky.peter

3
Nie sądzę, żeby to był najlepszy sposób. jsfiddle.net/TN2wr vs jsfiddle.net/TN2wr/1
Gus

Używam JQ starszego niż 1,6, dlatego $ (element) .attr ('onclick', null); pracuje dla mnie.
metamagikum

18

Usuwanie onclickmienia

Załóżmy, że dodałeś zdarzenie kliknięcia w tekście, na przykład:

<button id="myButton" onclick="alert('test')">Married</button>

Następnie możesz usunąć wydarzenie w ten sposób:

$("#myButton").prop('onclick', null); // Removes 'onclick' property if found

Usuwanie clickdetektorów zdarzeń

Załóżmy, że dodałeś zdarzenie kliknięcia, definiując odbiornik zdarzeń, na przykład:

$("button").on("click", function() { alert("clicked!"); });

... lub tak:

$("button").click(function() { alert("clicked!"); });

Następnie możesz usunąć wydarzenie w ten sposób:

$("#myButton").off('click');          // Removes other events if found

Usuwanie obu

Jeśli nie masz pewności, w jaki sposób wydarzenie zostało dodane, możesz połączyć oba, na przykład:

$("#myButton").prop('onclick', null)  // Removes 'onclick' property if found
              .off('click');          // Removes other events if found



5

Po tak ciężkich próbach z bind, unbind, on, off, click, attr, removeAttr, prop, sprawiłem, że zadziałało. Mam więc następujący scenariusz: W moim html NIE dołączyłem żadnych programów obsługi onclick.

Następnie w moim JavaScript użyłem następującego, aby dodać wbudowaną obsługę onclick:

$(element).attr('onclick','myFunction()');

Aby usunąć to później z Javascript, użyłem:

$(element).prop('onclick',null);

W ten sposób pracowałem w przypadku dynamicznego łączenia i usuwania powiązań kliknięć w Javascript. Pamiętaj, aby NIE wstawiać żadnych funkcji obsługi onclick w swoich elementach.


Podoba mi się to, ale dlaczego jeden miałby być rekwizytem, ​​a drugi atr?
Stachu

Nie jestem pewien, ale widzę to w ten sposób, że za pomocą attr dodajesz / wstrzykujesz procedurę obsługi onclick z odpowiednią funkcją myFunction (), a prop ('onclick', null) usuwa atrybut, więc żadna funkcja nie zostanie wywołana. Tak to działa w moim przypadku. I mogłem zauważyć, jak element miał obsługę onclick za pośrednictwem attr i jak został usunięty po właściwości.
bboydflo

1
Na przyszłość naprawdę powinieneś używać .on('click', myFunction)(zauważ, że niemyFunction ma tego w cudzysłowach), a później,.off('click')
JDB nadal pamięta Monikę

1

Co jeśli zdarzenie onclick nie jest bezpośrednio na elemencie, ale z elementu nadrzędnego? To powinno działać:

$(".noclick").attr('onclick','').unbind('click');
$(".noclick").click(function(e){
    e.preventDefault();
    e.stopPropagation();
    return false;
});

Dodanie kolejnego nasłuchiwania kliknięć (aby zapobiec domyślnemu itp.) Może dodać go na końcu listy nasłuchiwania, a zatem inne detektory nadal będą wykonywane jako pierwsze. Nie jestem jednak pewien, czy jest dodawany jako pierwszy, czy ostatni na liście. W każdym razie lepiej jest użyć opcji „off”, jak widać w innych odpowiedziach.
Frederic Leitenberger

0

Spróbuj tego, jeśli usuniesz wiązanie zdarzenia onclick według identyfikatora Następnie użyj:

$('#youLinkID').attr('onclick','').unbind('click');

Spróbuj tego, jeśli usuniesz wiązanie zdarzenia onclick według klasy. Następnie użyj:

$('.className').attr('onclick','').unbind('click');
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.