jQuery: jak uzyskać obiekt event w funkcji obsługi zdarzeń bez przekazywania go jako argumentu?

Mam atrybut onclick na moim linku:

<a href="#" onclick="myFunc(1,2,3)">click</a>

To wskazuje na obsługę tego zdarzenia w JavaScript:

function myFunc(p1,p2,p3) {
    //need to refer to the current event object:
    alert(evt.type);        
}

Ponieważ obiekt event " evt " nie jest przekazywany do parametru, czy jest jeszcze możliwe uzyskanie tego obiektu?

Próbowałem window.event i $(window.event), ale oba są undefined.

Jakiś pomysł?
Author: Web_Designer, 2011-05-01

4 answers

Ponieważ obiekt event " evt " nie jest przekazywany z parametru, czy jest jeszcze możliwe uzyskanie tego obiektu?

Nie, Nie niezawodnie. IE i niektóre inne przeglądarki udostępniają go jako window.event (nie $(window.event)), ale jest to niestandardowe i nie jest obsługiwane przez wszystkie przeglądarki (znany Firefox nie).

Lepiej przekazać obiekt event do funkcji:

<a href="#" onclick="myFunc(event, 1,2,3)">click</a>

To działa nawet na przeglądarkach innych niż IE, ponieważ wykonują kod w kontekście, który ma zmienna event (i działa na IE, ponieważ event rozwiązuje się na window.event). Próbowałem go w IE6+, Firefox, Chrome, Safari i Opera. Przykład: http://jsbin.com/iwifu4

Ale Twoim najlepszym zakładem jest użycie nowoczesnej obsługi zdarzeń:

HTML:

<a href="#">click</a>

JavaScript za pomocą jQuery (ponieważ używasz jQuery):

$("selector_for_the_anchor").click(function(event) {
    // Call `myFunc`
    myFunc(1, 2, 3);

    // Use `event` here at the event handler level, for instance
    event.stopPropagation();
});

...lub jeśli naprawdę chcesz przejść event do myFunc:

$("selector_for_the_anchor").click(function(event) {
    myFunc(event, 1, 2, 3);
});

Selektorem może być wszystko, co identyfikuje kotwicę. Masz bardzo bogaty zestawdo wyboru (prawie wszystkie CSS3, plus niektóre). Możesz dodać id lub class do kotwicy, ale znowu masz inne opcje. Jeśli możesz użyć tego, gdzie jest w dokumencie, zamiast dodawać coś sztucznego, świetnie.

 98
Author: T.J. Crowder,
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
2018-09-19 11:50:24

W IE można uzyskać obiekt event za pomocą window.event w innych przeglądarkach bez dyrektywy 'use strict' możliwe jest uzyskanie przez arguments.callee.caller.arguments[0].

function myFunc(p1, p2, p3) {
    var evt = window.event || arguments.callee.caller.arguments[0];
}
 15
Author: otakustay,
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-04-15 00:36:39

Napisz deklarację obsługi zdarzenia w następujący sposób:

<a href="#" onclick="myFunc(event,1,2,3)">click</a>

Wtedy twoja funkcja" myFunc ()" może uzyskać dostęp do zdarzenia.

Wartość łańcuchowa atrybutu" onclick " jest konwertowana do funkcji w sposób prawie dokładnie taki sam jak przeglądarka (wewnętrznie) wywołująca konstruktor funkcji:

theAnchor.onclick = new Function("event", theOnclickString);

(z wyjątkiem IE). Ponieważ jednak "event" jest globalnym w IE (jest to atrybut okna), będziesz mógł przekazać go do funkcji w ten sposób w dowolnej przeglądarce.

 4
Author: Pointy,
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
2011-05-01 15:49:49

Jeśli wywołasz obsługę zdarzeń na znacznikach, tak jak teraz, nie możesz (x-browser). Ale jeśli połączysz Zdarzenie click z jquery, jest to możliwe w następujący sposób:

Znaczniki:

  <a href="#" id="link1" >click</a>

Javascript:

  $(document).ready(function(){
      $("#link1").click(clickWithEvent);  //Bind the click event to the link
  });
  function clickWithEvent(evt){
     myFunc('p1', 'p2', 'p3');
     function myFunc(p1,p2,p3){  //Defined as local function, but has access to evt
        alert(evt.type);        
     }
  }

Od zdarzenia ob

 1
Author: Edgar Villegas Alvarado,
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
2011-05-01 15:55:50