Jak mogę programowo wywołać zdarzenie onclick () ze znacznika zakotwiczenia, zachowując odniesienie 'this' W funkcji onclick?
Czy można programowo wywoływać Zdarzenie onClick dla znacznika kotwicy, zachowując " to " odniesienie do kotwicy?
Poniższe nie działają... (przynajmniej nie w Firefox: document.getElementById('linkid').Kliknij () nie jest funkcją)
<script type="text/javascript">
function doOnClick() {
document.getElementById('linkid').click();
//Should alert('/testlocation');
}
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>
8 answers
Musisz apply
Obsługa zdarzenia w kontekście tego elementu:
var elem = document.getElementById("linkid");
if (typeof elem.onclick == "function") {
elem.onclick.apply(elem);
}
W przeciwnym razie this
odwołuje się do kontekstu, w którym powyższy kod jest wykonywany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-25 12:35:12
Jest bardzo proste rozwiązanie z jQuery, właśnie tego użyłem i działa idealnie:
<script type="text/javascript">
function doOnClick() {
$('#linkid').click();
}
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>
Testowane w IE8-10, Chrome, Firefox.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 09:59:48
Aby wywołać zdarzenie, wystarczy wywołać obsługę zdarzenia element. Drobna zmiana kodu.
var a = document.getElementById("element");
var evnt = a["onclick"];
if (typeof(evnt) == "function") {
evnt.call(a);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-19 05:57:38
$("#linkid").trigger("click");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-21 21:24:58
# Patrz metoda handleEvent
https://developer.mozilla.org/en-US/docs/Web/API/EventListener
"Raw" Javascript:
function MyObj() {
this.abc = "ABC";
}
MyObj.prototype.handleEvent = function(e) {
console.log("caught event: "+e.type);
console.log(this.abc);
}
var myObj = new MyObj();
document.querySelector("#myElement").addEventListener('click', myObj);
Teraz kliknij na swój element (o id "myElement") i powinien wydrukować w konsoli:
Caught event: click
ABC
To pozwala mieć metodę obiektu jako obsługę zdarzenia i mieć dostęp do wszystkich właściwości obiektu w tej metodzie.
You can ' t just pass metoda obiektu do addeventlistener bezpośrednio (Jak to: element.addEventListener('click',myObj.myMethod);
) i oczekiwać myMethod
działać tak, jakbym został normalnie wywołany na obiekcie. Domyślam się, że jakakolwiek funkcja przekazywana do addEventListener jest w jakiś sposób kopiowana zamiast odwoływania się do niej. Na przykład, jeśli przekażesz referencję funkcji detektora zdarzeń do addEventListener (w postaci zmiennej), a następnie odłączysz tę referencję, detektor zdarzeń będzie nadal wykonywany, gdy zdarzenia zostaną przechwycone.
Kolejne (mniej eleganckie) obejście przejścia metoda jako detektor zdarzeń i stil this
i nadal mieć dostęp do Właściwości obiektu wewnątrz detektora zdarzeń będzie coś w tym stylu:
// see above for definition of MyObj
var myObj = new MyObj();
document.querySelector("#myElement").addEventListener('click', myObj.handleEvent.bind(myObj));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-22 17:30:54
Jeśli używasz tego wyłącznie do odwoływania się do funkcji w atrybucie onclick, wydaje się to bardzo złym pomysłem. Zdarzenia Inline są ogólnie złym pomysłem.
Proponuję:
function addEvent(elm, evType, fn, useCapture) {
if (elm.addEventListener) {
elm.addEventListener(evType, fn, useCapture);
return true;
}
else if (elm.attachEvent) {
var r = elm.attachEvent('on' + evType, fn);
return r;
}
else {
elm['on' + evType] = fn;
}
}
handler = function(){
showHref(el);
}
showHref = function(el) {
alert(el.href);
}
var el = document.getElementById('linkid');
addEvent(el, 'click', handler);
Jeśli chcesz wywołać tę samą funkcję z innego kodu javascript, symulowanie kliknięcia w wywołanie funkcji nie jest najlepszym sposobem. Consider:
function doOnClick() {
showHref(document.getElementById('linkid'));
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-25 12:33:08
Przyznaję, OP stwierdził bardzo podobnie, że to nie działa, ale dla mnie tak. Opierając się na notatkach w moim źródle, wydaje się, że został zaimplementowany mniej więcej w czasie, lub po, po poście OP. Może to teraz bardziej standardowe.
document.getElementsByName('MyElementsName')[0].click();
W moim przypadku mój guzik nie miał identyfikatora. Jeśli twój element ma id, najlepiej użyj poniższego (nieprzetestowanego).
document.getElementById('MyElementsId').click();
Początkowo próbowałem tej metody i nie zadziałało. Po Googlowaniu wróciłem i zdałem sobie sprawę, że mój element był z nazwy i nie miał identyfikatora. Sprawdź dokładnie, czy wywołujesz właściwy atrybut.
Źródło: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 20:52:25
Ogólnie zalecałbym, aby nie wywoływać programów obsługi zdarzeń "ręcznie".
- nie jest jasne, co zostanie wykonane z powodu wielu zarejestrowanych słuchacze
- niebezpieczeństwo, aby dostać się do rekurencyjnej i nieskończonej pętli zdarzeń (kliknij wyzwalanie kliknięcia B, wyzwalanie kliknięcia A itp.)
- zbędne aktualizacje DOM
- trudno odróżnić rzeczywiste zmiany w widoku spowodowane przez Użytkownika od zmian wprowadzonych jako kod inicjujący (który powinien być uruchamiany tylko raz).
Lepiej jest dowiedzieć się, co dokładnie chcesz, aby się stało, umieścić to w funkcji i wywołać to ręcznie i zarejestrować go jako słuchacza zdarzeń.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-13 09:59:53