JQuery: Как получить объект события в функции обработчика события, не передавая его в качестве аргумента?
У меня есть атрибут 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
.
Любая идея?
Ответы
Ответ 1
Поскольку объект события "evt" не передается из параметра, возможно ли получить этот объект?
Нет, не надежно. IE и некоторые другие браузеры делают его доступным как window.event
(not $(window.event)
), но многие браузеры этого не делают.
Вам лучше передать объект события в функцию:
<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
Но ваша ставка best, безусловно, должна правильно подключить событие:
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
, но опять же, у вас есть другие варианты. Если вы можете использовать то, что находится в документе, а не добавлять что-то искусственное, отлично.
Ответ 2
в 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
Напишите объявление своего обработчика событий следующим образом:
<a href="#" onclick="myFunc(event,1,2,3)">click</a>
Затем ваша функция "myFunc()" может получить доступ к событию.
Строковое значение атрибута "onclick" преобразуется в функцию таким образом, который почти точно совпадает с браузером (внутренне), вызывающим конструктор Function:
theAnchor.onclick = new Function("event", theOnclickString);
(кроме IE). Однако, поскольку "событие" является глобальным в IE (это атрибут окна), вы сможете передать его функции таким образом в любом браузере.
Ответ 4
Если вы вызываете обработчик событий по разметке, как вы сейчас делаете, вы не можете (x-браузер).
Но если вы связываете событие click с jquery, это возможно следующим образом:
Разметка:
<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);
}
}
Так как событие ob