2009-10-12 2 views
30

мне нужно иметь обработчик на вызывающий объект OnClick событиеКак получить объект вызова onclick?

т.е.

<a href="123.com" onclick="click123(event);">link</a> 
<script> 
function click123(event) 
{ 
//i need <a> so i can manipulate it with Jquery 
} 
</script> 

Я хочу сделать это без использования $(). Нажмите или $(). Жить в JQuery, но с описанным выше способом.

ответ

77

проход в this в обработчике рядный щелчка

<a href="123.com" onclick="click123(this);">link</a> 

или использовать event.target в функции (в соответствии с W3C DOM Level 2 Event model)

function click123(event) 
{ 
    var a = event.target; 
} 

Но, конечно, IE is different, поэтому ваниль JavaScript способ обработка это

function doSomething(e) { 
    var targ; 
    if (!e) var e = window.event; 
    if (e.target) targ = e.target; 
    else if (e.srcElement) targ = e.srcElement; 
    if (targ.nodeType == 3) // defeat Safari bug 
     targ = targ.parentNode; 
} 

или менее многословным

function doSomething(e) { 

    e = e || window.event; 
    var targ = e.target || e.srcElement; 
    if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug 
} 

где e является event object, который передается функции, отличных от IE браузеров.

Если вы используете jQuery, я бы настоятельно рекомендовал ненавязчивый JavaScript и использовал jQuery для привязки обработчиков событий к элементам.

+0

thx для быстрого ответа. – Konstantinos

+2

'if (! E) var e = window.event;' несколько избыточно - 'e' уже объявлен, зачем это делать снова? 'if' также можно избежать вообще в пользу более короткого тройного -' e = e || window.event'. То же для 'e.target' - эти 3 строки легко заменяются с помощью -' var target = e.target || е.srcElement';) – kangax

+0

@kangax - Я бы не сказал, что 'e = e || window.event' является тернарным оператором, поскольку нет трех аргументов, кроме двух, это оператор 'logical-or/default' - http://javascript.crockford.com/survey.html. Но я считаю, что он выглядит аккуратно, и я обычно использую его. Я просто вставлял код из связанной статьи, но теперь отвечу на мой вопрос :) –

4

http://docs.jquery.com/Events/jQuery.Event

Попробуйте с event.target

Содержит элемент DOM, который выдал событие. Это может быть элемент , зарегистрированный для события, или его .

4

Самый простой способ передать этот к click123 функции или вы также можете сделать что-то вроде этого (кросс-браузер):

function click123(e){ 
    e = e || window.event; 
    var src = e.target || e.srcElement; 
    //src element is the eventsource 
} 
2

Вещь с метода является то, что вы загромождали ваш HTML с javascript. Если вы поместите свой javascript во внешний файл, вы можете получить доступ к своему HTML ненавязчивому, и это намного опережает.

Lateron вы можете расширить свой код при помощи addEventListener/attackEvent (IE), чтобы предотвратить утечку памяти.

Это без JQuery

<a href="123.com" id="elementid">link</a> 

window.onload = function() { 
    var el = document.getElementById('elementid'); 
    el.onclick = function (e) { 
    var ev = e || window.event; 
    // here u can use this or el as the HTML node 
    } 
} 

Вы говорите, что вы хотите, чтобы манипулировать ею с JQuery. Таким образом, вы можете использовать jQuery. Чем лучше сделать это:

// this is the window.onload startup of your JS as in my previous example. The difference is 
// that you can add multiple onload functions 
$(function() { 
    $('a#elementid').bind('click', function (e) { 
    // "this" points to the <a> element 
    // "e" points to the event object 
    }); 
}); 
Смежные вопросы