2012-02-16 8 views
20

I expect this to print "a" because when I call foo(this), the argument seems to be the link tag.<a href="javascript:foo(this)"> passes Window, I want the tag element itself

<script type="text/javascript"> 
    function foo (e) { 
     alert (e .tagName); 
    } 
</script> 
<a href="javascript:foo(this)">click</a> 

Instead, it prints "undefined". If I alert(e) it says "object Window". How do I make foo know which element launched it? Without passing/looking up ids.

+0

co, jeśli użyjesz 'console.log (e.tagName);' – mgraph

+0

Myślę, że potrzebujesz 'href', który nie jest wywołaniem funkcji JavaScript. Powinno działać, jeśli użyjesz 'href =" # "' i użyjesz funkcji 'onclick =" ... 'do wykonania skryptu. Myślę, że to ma coś wspólnego z tym, że znacznik zakotwiczenia nie jest prawdziwym tagiem bez właściwego 'href'. – andyb

+0

Nie używaj' e' dla obiektu obj. 'e' jest standardem dla obiektu zdarzenia – gdoron

Odpowiedz

29

You should not use href for JavaScript. Bad practice, instead use onclick and this will magically point to the link.

<a href="#" onclick="foo(this)">click</a> 

You also need to cancel the click action of the link. Either with return false or cancelling the event with preventDefault.

It is better to attach the event with Unobtrusive JavaScript

+4

Jeśli "Będziesz wybredny w kwestii filozofii kodowania. Przypuśćmy, że warto zwrócić uwagę na to, że' href = "javascript: void (0);" 'jest bezpieczniejsze (brak fałszywego zwrotu, brak interferencji z bazowym URL-em) – spraff

+0

Również,' href = "javascript : void (0); "' jest lepsze niż 'href =" # "', ponieważ nie powoduje przeskoczenia okna przeglądarki do początku dokumentu, gdy tylko kliknie się w link. – Abdull

4

You can do this directly too

<a href="#" onclick="alert(this.tagName);">click</a>​ 
+0

Nie chcę nazwy znacznika, to tylko dla celów demonstracyjnych, chcę elementu. – spraff

0
<a href="#" onclick="foo(this)">click</a> 

function foo(obj) { 
    alert(obj.tagName); 
}​ 

Nie nazywaj element e to standard obiektu zdarzenia.

JSfiddle DEMO

0

Przedmiotem this nie jest traktowane tak samo we wszystkich przeglądarkach. Jest to jeden z wielu elementów, które biblioteki takie jak Prototype i jQuery próbują normalizować. Mimo to większość przeglądarek przejdzie odpowiednie this podczas obsługi na onclick (zamiast href), jak wiele innych odpowiedzi wskazał. Jeśli chcesz odpowiednio obsłużyć model this, musisz wykonać czynności podobne do tych opisanych w artykule this question.

Powiązane problemy