jQuery: как получить объект события в функции обработчика события, не передавая его в качестве аргумента? - PullRequest
65 голосов
/ 01 мая 2011

У меня есть атрибут onclick в моей ссылке:

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

Это указывает на этот обработчик событий в JavaScript:

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

Поскольку объект события "evt" не передан параметру, все еще возможно получить этот объект?

Я пробовал window.event и $(window.event), но оба undefined.

Есть идеи?

Ответы [ 4 ]

93 голосов
/ 01 мая 2011

Поскольку объект события "evt" не передан из параметра, все еще возможно получить этот объект?

Нет, ненадежно.IE и некоторые другие браузеры делают его доступным как window.event (не $(window.event)), но это нестандартно и поддерживается не всеми браузерами (как известно, Firefox не поддерживает).

Вам лучше пройтиобъект события в функцию:

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

Это работает даже в браузерах не IE, потому что они выполняют код в контексте, который имеет переменную event (и работают в IE, потому что event разрешает вwindow.event).Я пробовал это в IE6 +, Firefox, Chrome, Safari и Opera.Пример: http://jsbin.com/iwifu4

Но ваша ставка лучший заключается в использовании современной обработки событий:

HTML:

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

JavaScript с использованием jQuery (посколькувы используете 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();
});

... или если вы действительно хотите передать event в myFunc:

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

Селектор может быть любым, что идентифицируетякорьУ вас есть очень богатый набор на выбор (почти весь CSS3, плюс некоторые).Вы можете добавить id или class к якору, но опять же, у вас есть другие варианты.Если вы можете использовать то, что находится в документе, а не добавлять что-то искусственное, замечательно.

14 голосов
/ 01 мая 2011

в IE вы можете получить объект события с помощью window.event в других браузерах без директивы 'use strict', можно получить с помощью arguments.callee.caller.arguments[0].

function myFunc(p1, p2, p3) {
    var evt = window.event || arguments.callee.caller.arguments[0];
}
3 голосов
/ 01 мая 2011

Напишите ваше объявление обработчика событий следующим образом:

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

Тогда ваша функция "myFunc ()" сможет получить доступ к событию.

Преобразуется строковое значение атрибута "onclick"для функции почти точно так же, как браузер (внутри), вызывающий конструктор Function:

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

(кроме IE).Однако, поскольку «событие» является глобальным в IE (это атрибут окна), вы сможете передать его функции в любом браузере.

1 голос
/ 01 мая 2011

Если вы вызываете обработчик событий для разметки, как вы это делаете сейчас, вы не сможете (x-browser). Но если вы связываете событие click с jquery, это возможно следующим образом:

Markup:

  <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);        
     }
  }

С момента проведения мероприятия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...