wywołaj funkcję javascript po kliknięciu hiperłącza

Odpowiedzi:

133

Jeszcze schludniej, zamiast typical href="#"or href="javascript:void"lub href="whatever", myślę, że ma to znacznie więcej sensu:

var el = document.getElementById('foo');
el.onclick = showFoo;


function showFoo() {
  alert('I am foo!');
  return false;
}

<a href="no-javascript.html" title="Get some foo!" id="foo">Show me some foo</a>

Jeśli JavaScript się nie powiedzie, pojawi się informacja zwrotna. Ponadto wyeliminowane jest błędne zachowanie (przeskakiwanie stron w przypadku href="#"odwiedzania tej samej strony w przypadku href="").

karim79
źródło
13
+1 To obecnie jedyna dyskretna odpowiedź. +100, gdybym mógł.
James
@Lewis, tak, idealnie byłoby, gdyby tagi <a> nie były używane do czystych wywołań js, ale niestety starsze przeglądarki nie obsługiwały: najedź na elementy nie będące linkami. Dlatego linki były często używane do wyzwalania zdarzeń js.
Chris Van Opstal
@Chris - Nie jestem pewien, czy rozumiesz, Chris. Sugeruję, abyś nie używał opcji <a href="#"> Nic nie rób </a>, a zamiast tego użyj opcji <a href="a/link/somwhere.html"> Zrób coś </a>, a następnie użyj stopniowe ulepszanie, aby zastąpić href. To najczystsze rozwiązanie. Kotwice są w porządku, ale powinny COŚ zrobić, jeśli JavaScript jest wyłączony - lub z jakiegoś powodu (zgodnie z IE6) jakiś javascript zepsuł się przed utworzeniem i przypisaniem procedury obsługi. W ten sposób wszyscy Twoi użytkownicy są zadowoleni.
Lewis
2
Nie działa dla mnie, po prostu automatycznie wykonuje funkcję onclick podczas ładowania strony. Wydaje się to również koszmarem, jeśli chodzi o dostępność.
Shawn Solomon
4
To nie działa, po prostu kieruje do adresu URL href.
paddotk
58

Najprostsza odpowiedź brzmi:

<a href="javascript:alert('You clicked!')">My link</a>

Lub odpowiedz na pytanie o wywołanie funkcji javascript:

<script type="text/javascript">
function myFunction(myMessage) {
    alert(myMessage);
}
</script>

<a href="javascript:myFunction('You clicked!')">My link</a>

Jayden Lawson
źródło
2
Łącze w StackOverflow „Uruchom fragment kodu” nie działa w Firefoksie (nie jest tworzony żaden alert), ale działa w FF, gdy umieszczam tego typu łącze na normalnej stronie internetowej.
the_pwner224
Tak, to dziwne, działało na mnie, teraz nie jest. Inni mieli podobne problemy i wydaje się, że nie ma jednego ostatecznego rozwiązania, oprócz całkowitej ponownej instalacji Firefoksa.
Jayden Lawson
26

Za pomocą parametru onclick ...

<a href='http://www.google.com' onclick='myJavaScriptFunction();'>mylink</a>
amischiefr
źródło
mylące stwierdzenie. czy ma zamiar przejść do google.com czy wywołać funkcję javascript? który ma priorytet?
Nguai al
12

Odpowiedź JQuery. Ponieważ JavaScript został wymyślony w celu rozwijania JQuery, podam wam przykład w JQuery, który robi to:

<div class="menu">
    <a href="http://example.org">Example</a>
    <a href="http://foobar.com">Foobar.com</a>
</div>

<script>
jQuery( 'div.menu a' )
    .click(function() {
        do_the_click( this.href );
        return false;
    });

// play the funky music white boy
function do_the_click( url )
{
    alert( url );
}
</script>
elcuco
źródło
53
JavaScript został wymyślony w celu rozwijania jQuery? To jest nowe!
palswim
35
To było jak czytanie, że Lego zostało wymyślone do budowy Lego Batman.
Shawn Solomon
5
@ShawnSolomon Cieszę się, że się zgadzamy :)
elcuco
1
@elcuco, wielki sarkazm! + 'd :) Long Live JQuery
Zuul
6

Wolę używać metody onclick zamiast href dla hiperłączy javascript. I zawsze używaj alertów, aby określić, jaką masz wartość.

<a href='#' onclick='jsFunction();alert('it works!');'>Link</a>

Może być również używany na tagach wejściowych, np.

<input type='button' value='Submit' onclick='jsFunction();alert('it works!');'>

Marky
źródło
3

Najlepiej byłoby, gdybyś całkowicie unikał generowania linków w kodzie, ponieważ Twój kod będzie wymagał ponownej kompilacji za każdym razem, gdy będziesz chciał dokonać zmiany w „znacznikach” każdego z tych linków. Jeśli musisz to zrobić, nie osadziłbym twoich „wywołań” javascript w kodzie HTML, jest to zła praktyka, twoje znaczniki powinny opisywać twój dokument, a nie to, co robi, to jest zadanie twojego javascript.

Użyj podejścia, w którym masz określony identyfikator dla każdego elementu (lub klasy, jeśli jest to ich wspólna funkcja), a następnie użyj Progressive Enhancement, aby dodać obsługę zdarzeń, na przykład:

[c# example only probably not the way you're writing out your js]
Response.Write("<a href=\"/link/for/javascriptDisabled/Browsers.aspx\" id=\"uxAncMyLink\">My Link</a>");

[Javascript]  
document.getElementById('uxAncMyLink').onclick = function(e){

// do some stuff here

    return false;
    }

W ten sposób Twój kod nie zepsuje się dla użytkowników z wyłączonym JS i będzie miał wyraźny rozdział obaw.

Mam nadzieję, że to się przyda.

Chwytak
źródło
1
Dlaczego C#? Dlaczego nie po prostu <a href="https://stackoverflow.com/link/for/javascriptDisabled/Browsers.aspx" id="uxAncMyLink">My Link</a>?
Mahmoodvcs
2

Generalnie zalecałbym używanie element.attachEvent (IE) lub element.addEventListener (inne przeglądarki) zamiast bezpośredniego ustawiania zdarzenia onclick, ponieważ to drugie zastąpi wszelkie istniejące programy obsługi zdarzeń dla tego elementu.

attachEvent / addEventListening umożliwia utworzenie wielu programów obsługi zdarzeń.

Szymon
źródło
1

Użyj onclickatrybutu HTML .

Moduł onclickobsługi zdarzeń przechwytuje zdarzenie kliknięcia przycisku myszy użytkownika na elemencie, do którego zastosowano onclickatrybut. Ta akcja zwykle powoduje wywołanie metody skryptu, takiej jak funkcja JavaScript [...]

Pączek
źródło
1

Jeśli nie zaczekasz na załadowanie strony, nie będziesz mógł wybrać elementu według id. To rozwiązanie powinno działać dla każdego, kto ma problemy z uzyskaniem kodu do wykonania

<script type="text/javascript">
window.onload = function() {
    document.getElementById("delete").onclick = function() {myFunction()};

    function myFunction() {
        //your code goes here
        alert('Alert message here');
    }
};
</script>

<a href='#' id='delete'>Delete Document</a>
user2197701
źródło