Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   document.getElementById return undefined (https://javascript.ru/forum/events/48327-document-getelementbyid-return-undefined.html)

HardR0ck 29.06.2014 17:56

document.getElementById return undefined
 
Добрый день, только начал курить джаваскрипт.

var left = document.getElementById('sq').style.left; // return Undefined

<div id="sq" class="square"></div>


Помогите плиз

Sweet 29.06.2014 18:09

document.getElementById возвращает либо элемент, либо null. И никогда undefined. Такие дела.
Возможно проблема в следующем:
<script>
alert( document.getElementById('sq') ); // такого элемента в документе ещё нет
</script>

<div id="sq" class="square"></div>

<script>
alert( document.getElementById('sq') ); // элемент в документе: получите-распишитесь
</script>

Sweet 29.06.2014 18:54

Свойство .style содержит стили из атрибута style. И не имеет никакого отношения к стилям, прилетевшим через класс или ещё как. И, кстати, непонятно, откуда взялся undefined:
<div id="sq" class="square"></div>
<script>
alert( typeof document.getElementById('sq').style.left );
</script>

В любом случае, RTFM!

Aetae 29.06.2014 19:11

Sweet, cкорее всего проблема в другом.
HardR0ck, element.style - содержит только то, что есть в атрибуте style этого элемента. Если же left задан в css, то получить его можно либо перебрав саму css, либо получив вычисленное браузером значение:
var elem = document.getElementById('sq');
var left = (window.getComputedStyle ? getComputedStyle(elem, null) : elem.currentStyle).left;

foo 29.06.2014 21:09

Цитата:

Сообщение от Sweet
document.getElementById возвращает либо элемент, либо null. И никогда undefined. Такие дела.

А при чем тут document.getElementById, если речь о var left = document.getElementById('sq').style.left? Это что то из разряда в огороде бузина а в Киеве дядька?

Aetae 29.06.2014 21:29

foo, вопрос - откуда undefined?
document.getElementById('sq') - никогда не undefined
document.getElementById('sq').style - никогда не undefined
document.getElementById('sq').style.left - никогда не undefined

Sweet 29.06.2014 21:30

Цитата:

Сообщение от foo
А при чем тут document.getElementById

Тема называется "document.getElementById return undefined".

bes 29.06.2014 21:55

Цитата:

Сообщение от Sweet
И, кстати, непонятно, откуда взялся undefined:

ну только отсюда наверное :)
<div id="sq" class="square"></div>
<script>
alert(left);//undefined
var left = document.getElementById('sq').style.left; 
</script>

foo 29.06.2014 22:10

Цитата:

Сообщение от Aetae
откуда undefined?

Да, я понял, это типа шутка была. Там, вообще-то пустая строка возвращается в его случае. А почему undefined у него с большой буквы? Это тс ошибся, или в этом есть тайный смысл?

bes 29.06.2014 22:13

Цитата:

Сообщение от foo
Это тс ошибся, или в этом есть тайный смысл?

есть - комментарии не обрабатываются интерпретатором, что хочу, то и пишу

foo 29.06.2014 22:19

Цитата:

Сообщение от bes
alert(left);//undefined

Это выражение не возвратит undefined. Это ошибка. можно window.left уж тогда.
Цитата:

Сообщение от bes
var left = document.getElementById('sq').style.left;

Это выражение никакого отношения к первому не имеет. Я Вашей шутки не понял.

foo 29.06.2014 22:21

Цитата:

Сообщение от bes
есть - комментарии не обрабатываются интерпретатором, что хочу, то и пишу

Не, я подумал, что он туда скопировал, возможно, с аутпута, JS ведь регистр различает. Может в эту сторону стоило бы капнуть.

Sweet 29.06.2014 22:33

Цитата:

Сообщение от foo
Это ошибка.

Нет никакой ошибки. Вполне допустимо писать так:
foo = "bar";
var foo;
alert(foo);

, чтобы подчеркнуть свой богатый внутренний мир. Ну а чё! Я вот не понимаю людей, которые объявляют переменные в начале функции. И в знак протеста, я буду объявлять переменные внизу функций!!!

foo 29.06.2014 22:40

Sweet,
Вы там написали совершенно другое. Вы аллертите необявленное и неприсвоенное. Это ошибка.

Aetae 29.06.2014 22:43

Цитата:

Сообщение от foo (Сообщение 318697)
Это выражение не возвратит undefined. Это ошибка.

Оба этих утверждения ложны. Вы вообще не знаете тонкостей javascript.
value = alert(left);
var left;

alert( 'Небыло никакой ошибки, alert(left) в свою очередь вернула: ' + value );

Хотя бы проверяйте свои домыслы прежде чем утверждать.

foo 29.06.2014 22:46

Цитата:

Сообщение от Sweet
чтобы подчеркнуть свой богатый внутренний мир

BTW, выражение вашего внутреннего мира сильно зависит от реализации. Например в ноде:
foo="bar"
var foo
delete foo
console.log(global.foo)// undefined
console.log(foo)// bar

foo 29.06.2014 22:52

Цитата:

Сообщение от Aetae
Хотя бы проверяйте свои домыслы прежде чем утверждать.

Да, ошибся. Я просто не глянул внимательно на его код. Ладно проехали, признаю, что ошибся. А Вы значит знаете тонкости? Почему же так происходит?

Aetae 29.06.2014 22:57

foo, еслиб вы почитали учебник на этом сайте и вы бы знали почему.

foo 29.06.2014 23:01

Цитата:

Сообщение от Aetae
еслиб вы почитали учебник на этом сайте и вы бы знали почему.

Дайте линк

Sweet 29.06.2014 23:07

Цитата:

Сообщение от foo
выражение вашего внутреннего мира сильно зависит от реализации.

Нет, если реализация - по стандартам. Как, например, в ноде. Просто в ноде есть тонкость: там модули при require оборачиваются в функцию:
Function(/*arguments*/, moduleText)(/*arguments*/);

, где /*arguments*/ - не помню точно какие аргументы (помню module, __dirname и ещё какие-то).
Т.е.
foo="bar" // присваиваем значение переменной
var foo // объявляем переменную
delete foo // пытаемся удалять переменную - false
console.log(global.foo)// это не имеет никакого отношения к переменной
console.log(foo)// bar - ибо почему бы и нет =)

foo 29.06.2014 23:14

Sweet,
Я думаю, не совсем так.
foo="bar" // объявляем свойство глобального объекта 
var foo // объявляем переменную, в которую копируется значение свойства глобального объекта
delete foo // пытаемся удалять переменную - false, и вместе с этим удаляется св-во в глобале
console.log(global.foo)// это не имеет никакого отношения к переменной, и кроме того, мы это свойство удалили
console.log(foo)// bar - ибо почему бы и нет = так оно и должно быть.

Aetae 29.06.2014 23:21

Цитата:

Сообщение от foo (Сообщение 318705)
Дайте линк

Хмм, быстро не нашёл, но точно помню что когда-то давно об этом читал здесь. Читайте весь учебник - не пропустите.)

А по вопросу: объявления var происходят в начале функции независимо от того где они указанны в коде.
Т.е.
alert(a);
var a = 123;
это на самом деле
var a;
alert(a);
a = 123;


Соответственно и в васшем примере:
foo="bar" // foo уже локально ибо ниже объявлена через var
var foo //объявляем переменную
delete foo //удаление несуществующего
console.log(global.foo) //undefined(было таким и до delete)
console.log(foo) //bar

Sweet 29.06.2014 23:27

Цитата:

Сообщение от foo
Я думаю

А я не думаю, я - знаю. Можешь проверить. Объяви в одном модуле:
global.foo = "value";

А затем в другом:
console.log(foo); // undefined - это значение переменной
foo="bar" // присваеваем переменной
var foo // объявляем переменную
delete foo // пытаемся удалять переменную - false
console.log(global.foo)// value, потому что глобальное свойство мы не трогали
console.log(foo)// bar

foo 29.06.2014 23:34

Цитата:

Сообщение от Aetae
было таким и до delete

В вашей схеме все правильно с виду, но моя точней отражает суть происходящего. Тут, насколько я понял, дело в том, что транслятор проходит текст проги за 2 раза. В первом проходе, он делает подстановку во все вары. В браузерах на этом все и заканчивается. А в ноде он вместе с подстановкой удаляет соответствующие св-ва глобала.

Aetae 29.06.2014 23:37

*facepalm.jpg*
foo

foo 29.06.2014 23:38

Цитата:

Сообщение от Sweet
модуле

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

А что касаемо реально происходящего, см выше.

foo 29.06.2014 23:54

Цитата:

Сообщение от Aetae
facepalm.jpg

Подумай над этим, раз такой умный
global.a=eval("1")
var a
a//undefined

Sweet 29.06.2014 23:55

Цитата:

Сообщение от foo
Я не хочу сейчас модули обсуждать, это прямого отношения к делу не имеет.

Просто запусти на ноде такой код:
console.log(arguments);
И прозрей: в ноде весь код оборачивается в функцию! Там нет кода, исполняющего в глобальном окружении.
Всё остальное - это просто бредни человека, который толком ничего не знает и не имеет опыта, но бредит какой-то хренотенью, типа "я самый умный, я понял, что var в глобале не нужен". Но
Цитата:

Сообщение от foo
что касаемо реально происходящего

, ты ничего не понимаешь.

Sweet 30.06.2014 00:03

Цитата:

Сообщение от foo
Подумай над этим, раз такой умный

Я уже объяснил, почему оно так. Потому что в ноде этот код исполняется так:
var global = window;

var program = 'global.a=eval("1");\
var a;\
alert(a); //undefined';

Function("exports, module, __filename, __dirname", program)(/*arguments*/);

foo 30.06.2014 00:04

Цитата:

Сообщение от Sweet
Там нет кода, исполняющего в глобальном окружении.

Да? A это что?
a=1
console.log(a)

И что ты вообще называешь глобальным окружением? То глобальное (с var) что внутри модуля -- есть глобальное для этого модуля, как, впрочем и для функции. Ты не понимаешь, что такое глобальное окружение. Есть глобальный объект и есть глобальное окружение, в JS это не одно и тоже.

Sweet 30.06.2014 00:11

Цитата:

Сообщение от foo
Да? A это что?
a=1
console.log(a)

Это просто код. Ты мне лучше скажи, это что:
Цитата:

Сообщение от Sweet
Просто запусти на ноде такой код:
console.log(arguments);

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

foo 30.06.2014 00:15

Цитата:

Сообщение от Sweet
Я уже объяснил, почему оно так

А теперь я объясняю без модулей головного мозга, а сточки зрения семантики. Как я уже объяснял выше, компилятор в первом проходе делает подстановку всех варов. Он эти значения выдергивает из глобала. Поскольку global.a получит свое значение только в рантайме, на стадии компиляции присвоить значение var a невозможно, и оно устанавливается в undefined

Sweet 30.06.2014 00:24

foo, вот только не нужно рассказывать мне своё представление о том, как всё работает. Я без тебя уже много лет знаю, как работает интерпритатор js.

Sweet 30.06.2014 00:32

foo, и, кстати, ты все разговоры сводишь к глобальному окружению и var. Видимо, потому что внезапное "озарение" про var - это единственное, чем ты в этой жизни можешь похвастаться:haha:
Кстати, весь этот флейм вышел отсюда:
Цитата:

Сообщение от Sweet
Я вот не понимаю людей, которые объявляют переменные в начале функции. И в знак протеста, я буду объявлять переменные внизу функций!!!

Так что:
x = "foo";
new function () {
  alert(x);
  x = "Засунь своё любимое глобальное окружение себе в...";
  alert(x);
  
  var x;
};

foo 30.06.2014 00:38

Цитата:

Сообщение от Sweet
Ты мне лучше скажи, это что:

Вот такая вот клоунада, видимо
a=arguments[0].__proto__
b=(function(){return arguments.__proto__})()
console.log(a===b)// true

А ты мне скажи, какая нахрен разница, что это? Какое это имеет отношение к вопросу?

Sweet 30.06.2014 00:49

Цитата:

Сообщение от foo
Вот такая вот клоунада, видимо
a=arguments[0].__proto__
b=(function(){return arguments.__proto__})()
console.log(a===b)// true

Что ты этим хочешь сказать? Что
Object.prototype === Object.prototype
???
Цитата:

Сообщение от foo
А ты мне скажи, какая нахрен разница, что это?

Такая, что в ноде никакой код не исполняется в глобальном окружении.
Цитата:

Сообщение от foo
Какое это имеет отношение к вопросу?

А что за вопрос?

foo 30.06.2014 00:53

Sweet,
Что-то удивительное я должен найти в этом куске? Впечатлиться как-то?

foo 30.06.2014 00:55

Цитата:

Сообщение от Sweet
что в ноде никакой код не исполняется в глобальном окружении.

Каким образом наличие какого то объекта доказывает это?
console.log({one: 1})

Это тоже доказывает?

Sweet 30.06.2014 00:57

Цитата:

Сообщение от foo
Что-то удивительное я должен найти в этом куске? Впечатлиться как-то?

Ну естественно!!! Ты ж поди и не знал, что есть что-то, кроме глобального окружения.

Sweet 30.06.2014 01:00

Цитата:

Сообщение от foo
Каким образом наличие какого то объекта доказывает это?

Не доказывает, а показывает. Ты хочешь доказательств?
Цитата:

Сообщение от foo
Это тоже доказывает?

Ничего.


Часовой пояс GMT +3, время: 13:18.