Как называются объекты, передаваемые из селектора jQuery в функцию-обработчик?

Я не понимаю следующее поведение jQuery 1.9.1 в Firefox 22.0 при следовании коду (jsFiddle) не выдает ReferenceError, как ожидалось (даже в строгий режим), но вместо этого возвращает объект:

$("#press").click(function(){
    console.log(press);
});

Я хотел бы прочитать некоторую документацию или объяснение этого - это что-то полезное или мне следует избегать этого? Почему он не перезаписывает переменные, унаследованные от внешней области видимости?

Я понятия не имею, что искать. Есть ли название этой функции? Или для таких объектов, которые помещаются в функцию-обработчик?

ОБНОВЛЕНИЕ — обратите внимание, что объект press отличается от других глобальных объектов, созданных из ids — http://jsfiddle.net/Aprillion/BgsZn/2/:

$("html #outer #press").click(function(){
    console.log(output);
    console.log(outer);
    console.log(press);
});

[14:23:02.632] [object HTMLDivElement]
[14:23:02.632] [object HTMLDivElement]
[14:23:02.632] ({jQuery19108414748019423938:2})

person Aprillion    schedule 06.08.2013    source источник
comment
См. stackoverflow.com/questions/3434278 и stackoverflow. .com/questions/5515659   -  person LeGEC    schedule 06.08.2013
comment
@LeGEC я обновил свой вопрос, чтобы охватить немного другую область, чем ответы там, но спасибо :)   -  person Aprillion    schedule 06.08.2013
comment
Скрипка показывает мне 3 элемента. Я собираюсь предположить, что вы используете IE?   -  person cHao    schedule 06.08.2013
comment
@cHao еще раз прочитайте 1-ю строку моего вопроса. В IE 10 press равен другим глобальным объектам.   -  person Aprillion    schedule 06.08.2013
comment
Ах. Давно не пользовался ФФ. Почему-то я даже не установил его на эту машину: P И я так привык к тому, что IE немного отличается...   -  person cHao    schedule 06.08.2013


Ответы (3)


Это обычное поведение в браузерах, когда при добавлении элемента с атрибутом ID в документ браузер также покажет свойство в window с идентификатором элемента в качестве имени и элементом в качестве значения. Я бы не стал полагаться на него, если беспокоит совместимость, поскольку (а) он явно не указан ни в одном общем стандарте, который я могу найти, и (б) магические переменные могут вызвать всевозможные головные боли, если вы не будете осторожны. Но в настоящее время это делают как минимум 4 из 5 распространенных браузеров. (IE, Chrome, Opera и Firefox — все это делают, хотя веб-консоль FF довольно ненадежна в этом отношении. У меня нет Safari для тестирования.)

Что касается того, почему ваша кнопка отображается как ({jQuery##########:2}):

Когда jQuery добавляет к элементу обработчики событий (или некоторые другие типы данных), он устанавливает свойство с именем 'jQuery' + the version digits + a big random number, а значением является уникальное целое число. Кое-что о ресурсах и тому подобное.

Во всяком случае, соедините это со встроенной консолью Firefox, которая довольно тупа. В тот момент, когда вы добавляете свойство к элементу, консоль забывает, что это элемент. Например, откройте консоль на любой существующей странице (подойдет даже about:blank) и попробуйте ввести это по порядку (хотя вы, конечно, можете пропустить комментарии):

d = document.createElement('div')     // [object HTMLDivElement]
d                                     // [object HTMLDivElement]

// all's good so far...
d.id = 'stuff'                        // "stuff"
d                                     // [object HTMLDivElement]

// now set a property the browser doesn't define
d.randomProperty = 42                 // 42
d                                     // ({randomProperty:42})

// still an element, though
d.id                                  // "stuff"

txt = document.createTextNode('test') // [object Text]
d.appendChild(txt)                    // [object Text]
d                                     // ({randomProperty:42})

// and once the property's gone...
delete d.randomProperty               // true
d                                     // [object HTMLDivElement]

Проблема связана с консолью, а не с браузером или jQuery. Элементы по-прежнему остаются элементами, и они по-прежнему будут отлично работать для любых элементарных вещей, которые вы хотите с ними делать.

person cHao    schedule 06.08.2013
comment
спасибо за полный ответ .. я не буду использовать эти глобальные объекты и буду следить за забавным выводом консоли FF, есть только один недостаток: если я забуду объявить локальную переменную с тем же именем, строгий режим не выдает ReferenceError .. - person Aprillion; 07.08.2013
comment
Интересно, произойдет ли что-нибудь с идентификаторами, похожими на зарезервированные ключевые слова, такими как for или in? для них создаются какие-либо глобальные объекты? - person Aprillion; 07.08.2013
comment
Глобальные объекты? Вполне возможно; вы можете получить к ним доступ как window['for']. Удачи, пытаясь использовать их без window.. :) Меня бы больше беспокоили такие имена, как document, которые уже являются глобальными. Я надеюсь, что браузер достаточно умен, чтобы не пытаться устанавливать свойства, которые уже определены. - person cHao; 07.08.2013
comment
По крайней мере, Chrome и IE достаточно умны: jsfiddle.net/7QP3L. И да, для #for создается глобальный объект; вы бы получили к нему доступ как window['for']. - person cHao; 07.08.2013
comment
Я не боялся document и других глобальных объектов, кто-то бы уже заметил, если бы они были переписаны :) Я не собираюсь использовать эти объекты из идентификаторов ни с window., ни без window., мне просто было интересно, как это работает, спасибо за объяснение снова. - person Aprillion; 07.08.2013

Это не связано с jQuery, это связано с тем, что некоторые браузеры определяют глобальную переменную для элементов, которые имеют атрибуты ID/name. Поскольку у вас есть элемент с атрибутом ID press, переменная press относится к этому элементу DOM.

person undefined    schedule 06.08.2013
comment
большое спасибо за большую часть ответа, однако посмотрите мой обновленный вопрос - press как-то отличается от других глобальных объектов. - person Aprillion; 06.08.2013

Всегда ли работает селектор jQuery по идентификатору без кавычек и знака #?

Переменная press в вашем коде не связана с событием $('#press').click.

person matth    schedule 06.08.2013