Вопрос по 'this' Javascript

Qest
На сайте с 21.10.2010
Offline
40
559

<p onclick="foo()" id="foo">test</p>

<script type="text/javascript">
function foo() {
alert(this.id)
}
</script>

Чтото то я не пойму, почему алертом выводиться "undefined" вместо "foo", и как получить значение атрибута через "this"?

rbbumfirst
На сайте с 03.04.2009
Offline
87
#1

<p onclick="foo(this)" id="foo">test</p>

<script type="text/javascript">
function foo(obj) {
alert(obj.id)
}
</script>

this ссылается на того, кто его вызвал потому как

Web developer (http://rudov.com). разработка на Go, ReactJS, React Native
TO
На сайте с 21.09.2007
Offline
170
#2

Так нужно.

<p onclick="foo(this);" id="foo">test</p>

<script type="text/javascript">
function foo(elem) {
alert(elem.id);
}
</script>
Ayavryk
На сайте с 11.10.2003
Offline
209
#3

Вы уперлись в основу ООП на JS. Почитайте здесь: http://javascript.ru/tutorial/object/thiskeyword

Когда вызываете функцию так как вы ее вызывали this = window. И при обращении к this.id интерпретатор пытается найти window.id или что то же самое глобальную переменную id.

<script type="text/javascript">

id='WOW!;// то же самое что и window.id = 'WOW!'

function foo() {

alert(this.id) // WOW!

}

</script>

Вообще эта тема - основа ООП в JS.

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/
Qest
На сайте с 21.10.2010
Offline
40
#4

Меня смутило то что если я присваиваю click посредстовом скрипта

<p id="foo">test</p>

<script type="text/javascript">
$("#foo").click(function() {
alert(this.id) // foo
});
</script>

То все работает, а если задаю его посредством события через тэг html то нет, хотя казалось бы это одно и тоже.

Ayavryk
На сайте с 11.10.2003
Offline
209
#5

В JS есть такое понятие как "контекст выполнения". Для обычной функции в том виде, в котором вы указали контекст = глобальный объект window. Любая глобальная переменная(функция) доступна как свойство window.

Но если вы создаете свой собственный объект, контекстом становятся свойства и методы объекта + много что еще при этом this указывает на собственные методы и свойства объекта.

В jQuery когда вы пишите

var v = $("#foo");

вы создаете v - некий объект(обертку вокруг #foo) , у которого куча собственных свойств и методов + сам элемент DOM c id=foo

Обработчики событий устроены так, что при записи

$("#foo").click(function(){...})

функция передаваемая в качестве параметра обрабатывается в контексте элемента DOM, соответствующего $("#foo"). Т.е. внутри этой функции ссылка на this обращается непосредственно к элементу DOM c id=foo Но это фича именно jQuery не js

Мутно но проще я не объясню. Я привел ссылку на Javascript.Ru там у Ильи Кантора подробно все расписано.

=

Офтопик.

Тут регулярно возникали холивары на тему jquery. Смысл которых в том, что jquery очень часто создает иллюзию того, что можно обойтись без знания JS как такового.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий