2014-05-15 3 views
0

У меня есть следующий HTML-кодПочему Объект Window Передается Function

<a href="javascript:update(this)">Val1</a> 

<a href="javascript:update(this)">Val2</a> 

и функция

function update(obj) { 
    alert(obj); // I expect to get a tag object but I am getting Window Object 
    //do something 

} 

Теперь я бы ожидать, чтобы получить объект, ссылающийся на тег, но я получаю объект окна. Может ли кто-нибудь сказать мне, почему объект, ссылающийся на тег, не передан

+0

** window **. Location.href –

+0

Это не дубликат http://stackoverflow.com/questions/2842116/reliable-way-of-generating-unique-hardware-id. Вопрос: «Как «. Вопрос * здесь * «почему». –

ответ

2

Может кто-нибудь сказать мне, почему объект со ссылкой на тэг не передается

Поскольку это не является атрибутом события, это URL. Код в URL-адресах с использованием псевдопротокола javascript: запускается как глобальный код, с , относящимся к глобальному объекту, точно так же, как код в script элементах (которые не используют "use strict").

Если вы использовали атрибут события, как onclick, то код будет работать, как если бы это было в функции в глобальном масштабе с this набором к элементу и в области видимости event переменных со ссылкой на текущие события.

+0

Да, это имеет смысл. –

1

Вы посещаете URI схемы javascript: и не запускаете событие в контексте объекта Element.

<a href="sensible_fallback.html" onclick="return update(this)">Val1</a> 

function update(element) { 
    alert(element); 
    return false; 
} 

... но это 2014, поэтому не используйте внутренние атрибуты событий.

<a href="sensible_fallback.html" id="foo">Val1</a> 

function update(event) { 
    alert(this); 
    event.preventDefault(); 
} 

document.getElementById('foo').addEventListener('click', update); 

... и если у вас нет разумного запаса, используйте кнопку, а не ссылку.

+0

+1, но я ожидал, что вы порекомендуете анонимные функции. addeventlistener ('click', function (..) {..}) –

+1

Я предпочитаю отдельные объявления функций. Их легче читать (поскольку они не похоронены в середине другого вызова функции), и их имя отображается в стеке в отладчиках (и, хотя вы можете иметь именованные функциональные выражения, IIRC они утечки памяти в старом IE). – Quentin

Смежные вопросы