Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что за ФИГНЯ?! У этого языка программирования логика вообще есть?! (https://javascript.ru/forum/misc/54626-chto-za-fignya-u-ehtogo-yazyka-programmirovaniya-logika-voobshhe-est.html)

tsigel 25.03.2015 15:18

Цитата:

Сообщение от jaroslav.tavgen
Почему "после"? "В" строке 4!

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

tsigel 25.03.2015 15:21

http://learn.javascript.ru/basic-dom-node-properties

Цитата:

Можно и записать outerHTML, однако при этом новый текст будет вставлен вместо узла, а сама переменная не изменится.
Если что-то не понятно, сначала ищите в Учебнике, там, как правило, все написано.

jaroslav.tavgen 25.03.2015 15:23

Цитата:

Сообщение от tsigel (Сообщение 363035)
Нет, там вы скзали чтобы текст тега из переменной "А" поменялся на другой текст, при этом это действие не связано с переменной.

Правильно ли я понимаю, что если бы браузер запрещал использовать необъявленные переменные, то на строке

id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');

он бы выдал ошибку из-за отсутствия "var id1.outerHTML;"?

jaroslav.tavgen 25.03.2015 15:26

Цитата:

Сообщение от tsigel (Сообщение 363036)
http://learn.javascript.ru/basic-dom-node-properties



Если что-то не понятно, сначала ищите в Учебнике, там, как правило, все написано.

В том-то и дело, что в разделе "переменные" там нет ничего подобного даже близко. Просто написано, что их использовать просто как валенок и пару советов как их называть, и всё.

tsigel 25.03.2015 15:28

Цитата:

Сообщение от jaroslav.tavgen
Правильно ли я понимаю, что если бы браузер запрещал использовать необъявленные переменные, то на строке

id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');

он бы выдал ошибку из-за отсутствия "var id1.outerHTML;"?

Да он и так запрещает. Надо только строгий режим включить.

"use strict"
a = "b"

jaroslav.tavgen 25.03.2015 15:31

Цитата:

Сообщение от tsigel (Сообщение 363043)
Да он и так запрещает. Надо только строгий режим включить.

"use strict"
a = "b"

Но не в этом случае:

<div id="id1" onclick="Function1()">Click on me</div>
<script>
"use strict"
var id1 = document.getElementById("id1");
id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');

alert(id1.outerHTML);

function Function1(){

    alert('Function1 is executed!');

}

function Function2(){

    alert('Function2 is executed!');

}


</script>

tsigel 25.03.2015 15:37

Цитата:

Сообщение от jaroslav.tavgen
Но не в этом случае:

Это вообще 2 разных случая. Ещё раз. Если сейчас не поймете - прочтите ЦЕЛИКОМ статью которую я кинул.

Вот Ваш код:
<div id="id1" onclick="Function1()">Click on me</div>
<script>
"use strict"
var id1 = document.getElementById("id1");
id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');

alert(id1.outerHTML);

function Function1(){

    alert('Function1 is executed!');

}

function Function2(){

    alert('Function2 is executed!');

}


</script>


В строке 4 вы записали в переменную "id1" ссылку на елемент.
В строке 5 Вы УДАЛИЛИ тег на который ссылалась переменная "id1" (при этом не удаляя переменную), и СОЗДАЛИ НОВЫЙ тег, ссылку на который вы НИКУДА не записывали. Оператор присвоения ("=") в данном случае никак не связан с вашей переменной! Он говорит чтобы вы записали НОВУЮ строку на место где находится Ваш элемент. После того как строка записана браузер понимает что это тег.

newuser1001 25.03.2015 15:51

Цитата:

Сообщение от jaroslav.tavgen
У этого языка программирования логика вообще есть?!

Тут дело не столько в языке, сколько в реализации, видимо.

Моя версия следующая. Когда ты меняешь outerHTML, он у тебя загружается в "виртуальную машину", а в исходнике он остается неизменным. Так вот, интерпретатор считывает outerHtml, похоже, из исходника, по-крайней мере в части между треугольными скобками. innerHTML все ж таки перерисовывается. Возможно это просто тупость имплементаторов, возможно, дрочево в присядку под компиляцию, чтобы меньше проходов делать. Но в любом случае, это ужасный косяк, да.

tsigel 25.03.2015 15:54

jaroslav.tavgen,
Советую обратить внимание на карму "Горного Троля" с ником "newuser1001", и не слушать бред который он извергает.

skrudjmakdak 25.03.2015 15:54

теперь я попробую объяснить указатели))
никаких дум элементов, возьмем обычный массив, но в массиве может находиться еще один массив, смотрим:

var a = [1, 2, 3, [6, 7, 8]];
console.log(a);//посмотрим чему равна переменная a
console.log(a[0]);//теперь посмотрим чему равен 0ой элемент массива (= 1)
console.log(a[3]);//теперь посмотрим чему равен 3ий элемент массива (он ревен другому массиву)
//запишем в переменную b этот массив
var b = a[3]; //но что значит запишем в переменную b??? давай выведем
console.log(b); // = [6, 7, 8]
//теперь изменими значение какого то элемента массива
b[0] = -9;
console.log(b); //смотрим результат
console.log(a[3]);//а теперь смотрим на значение 3го элемента в массиве "а". чудо? две переменные ссылаются на 1 массив!!
a.splice(3, 1);//а теперь удалим из массива а 3ий элемент
console.log(a);//смотрим...
console.log(b);//а в b массив то сохранен


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