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>
Author: Shog9, 2009-05-25

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.

 101
Author: Gumbo,
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.

 17
Author: luschn,
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);
}
 15
Author: simplyharsh,
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");
 4
Author: guest,
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));
 1
Author: Rolf,
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'));
}
 0
Author: David Snabel-Caunt,
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

 0
Author: Tyler Montney,
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ń.

 -1
Author: hvdd,
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