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)

jaroslav.tavgen 25.03.2015 14:41

Что за ФИГНЯ?! У этого языка программирования логика вообще есть?!
 
<div id="id1" onclick="Function1()">Click on me</div>
<script>
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>

Нажмите на "Посмотреть". Кликните на "ОК" при алерте. Потом кликните на "Click on me".

ЭТО ВООБЩЕ ЧТО ТАКОЕ?

tsigel 25.03.2015 14:43

jaroslav.tavgen,
и что не устраивает то?) Все же логично)

Вы в 4-й строке перезаписали элемент, а ссылка осталась на старый.

tsigel 25.03.2015 14:49

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

    alert(id1.outerHTML);
    alert(document.getElementById("id1").outerHTML);

    function Function1(){
        alert('Function1 is executed!');
    }

    function Function2(){
        alert('Function2 is executed!');
    }

</script>

jaroslav.tavgen 25.03.2015 14:51

tsigel,

У переменной A значение B.

Я сказал интерпретатору: "изменить значение B на значение C".
Затем я говорю интерпретатору: "Покажи мне значение переменной A".
Интерпретатор отвечает: "Значение переменной A ни хрена не поменялось - как было B, так и осталось".

Однако когда я прошу его выполнить действие, то он выполняет действие C!!!

Где логика?

A = B;
A = C;
WriteContentsOf(A) // Пишет: B
DoAction(A) // Делает действие C

jaroslav.tavgen 25.03.2015 14:53

tsigel,
По поводу Вашего кода : я эту разницу тоже увидел. Но какая логика скрывается за этим?

tsigel 25.03.2015 14:54

jaroslav.tavgen,
Нененене, Девид Блейн! Все не так)

Вы сказали браузеру: Сделай мне элемент по клику на который отработает "ф1" и сохрани этот элемент в переменную "А". А теперь удали этот элемент (а переменная осталась) и замени его на элемент по клику на который отработает "ф2".

Теперь покажи мне переменную "А" (он чесно показывает по тому что там осталась ссылка на удаленный элемент)

jaroslav.tavgen 25.03.2015 15:06

tsigel,если честно, кое-что непонятно.

Цитата:

Сообщение от tsigel
Вы сказали браузеру: Сделай мне элемент по клику на который отработает "ф1" и сохрани этот элемент в переменную "А". А теперь удали этот элемент (а переменная осталась)

А почему переменная осталась?

Ведь вначале он должен удалить элемент, создать новый элемент, И ЗАТЕМ ПОСЛЕ ЭТОГО приравнять полученный результат к переменной A (id1.outerHTML = ...). Хоть по ссылке хоть по значению.

tsigel 25.03.2015 15:11

jaroslav.tavgen,
Браузер должен только спецификации, а поведение кторого вы от него хотите там не описано.

Может быть вы хотите потом добавить её обратно,если браузер будет чистить переменные на элементы которые он удалил, это сильно свяжет руки программистам. Вы должны сами следить за своими переменными. К тому же вы просто неправильно используете АПИ, если бы вы поменяли атрибут методом setAttribute то outerHTML показал бы вам то что вы хотите и не было бы никаких "удаленных" элементов.

tsigel 25.03.2015 15:14

Цитата:

Сообщение от jaroslav.tavgen
Ведь вначале он должен удалить элемент, создать новый элемент, И ЗАТЕМ ПОСЛЕ ЭТОГО приравнять полученный результат к переменной A (id1.outerHTML = ...). Хоть по ссылке хоть по значению.

Что-то я не увидел у вас после строки 4 что-то похожее на "id1 = ...";
Только оператор "=" может сказать что переменную надо заменить. И это ЛОГИЧНО.

jaroslav.tavgen 25.03.2015 15:16

Цитата:

Сообщение от tsigel (Сообщение 363031)
Что-то я не увидел у вас после строки 4 что-то похожее на "id1 = ...";
Только оператор "=" может сказать что переменную надо заменить. И это ЛОГИЧНО.

Почему "после"? "В" строке 4!

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 массив то сохранен

tsigel 25.03.2015 16:00

skrudjmakdak,
Я как раз тоже подумал объяснить с другой стороны, только на объектах. Ведь дом элементы это объекты и как все нормальные объекты они передаются по ссылке:

var a = {"test": "test"};// это то что находится в доме
var b = a// это ссылка на элемент

alert(JSON.stringify(b));

a = {"test": "test2"} // .outerHTML = id1.outerHTML.replace (то место где вы перезаписывете объект, b - остается прежним!)

alert(JSON.stringify(a));
alert(JSON.stringify(b));

skrudjmakdak 25.03.2015 16:02

<!DOCTYPE html>
<html>
	<head>
		<title>example</title>
	</head>

	<body>
		<div class="cont">1</div>
		<script>
var a = document.querySelector('div'); //записали в переменную ссылку на div
a.outerHTML = '<span>2</span>'; //убрали див из дерева (но не удалили!! он живет в переменной "a") и записали на его место спан
document.body.appendChild(a); //теперь вернем наш div
a.innerHTML = 11;
		</script>
	</body>
</html>

newuser1001 25.03.2015 16:03

конкретно этот косяк можно пофиксить вот так:
<html>
<head>
<style>
</style>
</head>
<body>



<div id="id1" onclick="Function1()">Click on me</div>
<script>
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>
</body>
</html>

Просто убрав строку с getElementById (она там особо не нужна, так как эл-ты с id и так доступны по именам переменных), но, в общем случае, конечно, это не сработает. Надо, избегать, короче, этого дерьма, по возможности.

newuser1001 25.03.2015 16:06

skrudjmakdak,
И че? Какое это к сабжу имеет отношение?

skrudjmakdak 25.03.2015 16:08

Цитата:

Сообщение от newuser1001 (Сообщение 363060)
skrudjmakdak,
И че? Какое это к сабжу имеет отношение?

к тому что ты пока не понимаешь смысл указателей

newuser1001 25.03.2015 16:12

skrudjmakdak,
Короче, я прочитал это как:
Цитата:

я обосрался, извини, хотел рисануться, не получилось.
Ниче, бывает.

Твое кукареку имеет такое же отношение к сабжу, как сортир в деревне Простоквашино.

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

tsigel 25.03.2015 16:14

skrudjmakdak,
Не обращай внимания на этого троля.

newuser1001 25.03.2015 16:17

tsigel,
заканчивай уже кирпичами срать. Ну мокнул я тебя разец в говнецо, не вечно же ты с этой болью жить будешь? В следующий раз будешь внимательней относиться к своим словам, ты спасибо должен сказать, я тебя к ответственности приучаю. Может мужиком станешь, со временем.

skrudjmakdak 25.03.2015 16:17

newuser1001,
тебе хотят помочь, но ты грубишь в место того чтобы вникнуть. это печально. это очень печально. так как оно нужно не мне, а тебе

newuser1001 25.03.2015 16:20

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

skrudjmakdak 25.03.2015 16:22

Цитата:

Сообщение от newuser1001 (Сообщение 363074)
Я чо помощи просил?

да ты попросил помощи! спросил, значит попросил!
Цитата:

Сообщение от newuser1001 (Сообщение 363074)
Я у тебя конкретно спросил, какое отношение твоя хрень имеет к сабжу.

имеет и еще какое, но ты не хочешь вникать
Цитата:

Сообщение от newuser1001 (Сообщение 363074)
Ты слился. А про помощь -- это уже твои фантази, ты видать попутал. Разуй глаза.

это лишь твое жалкое мнение, не более

tsigel 25.03.2015 16:23

newuser1001,
Цитата:

Сообщение от newuser1001
tsigel,
заканчивай уже кирпичами срать. Ну мокнул я тебя разец в говнецо, не вечно же ты с этой болью жить будешь? В следующий раз будешь внимательней относиться к своим словам, ты спасибо должен сказать, я тебя к ответственности приучаю. Может мужиком станешь, со временем.

Я с даунами не разговариваю, это мой тоебе последний пост.

newuser1001 25.03.2015 16:25

skrudjmakdak,
Цитата:

Сообщение от skrudjmakdak
но ты не хочешь вникать

Так ты же ничего не желаешь объяснять. Ладно, если ты сможешь объяснить, я извинюсь, и возьму свои слова обратно. Я слушаю внимательно.

skrudjmakdak 25.03.2015 16:25

Цитата:

Сообщение от tsigel (Сообщение 363076)
newuser1001,

Я с даунами не разговариваю, это мой тоебе последний пост.

это правильно) пусть сначала с людьми разговаривать научится, а то мамка видать не научила :)

newuser1001 25.03.2015 16:26

tsigel,
Да, серьезно тебя бомбануло. Чуть более чем ожидалось. Сходи к психологу.

newuser1001 25.03.2015 16:28

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

MallSerg 25.03.2015 16:35

foo вернулся )

newuser1001 25.03.2015 16:39

jaroslav.tavgen,
Кстати, в JS еще куча wtf'ков, например в V8, внезапно:
if(0) function foo(){alert("Hello!")}
foo()
//  Hello!

просто пошло статик-б*ство во все края, Ъ-динамичному языку трудно приспосабливаться.

но, язык, все же хороший. Это самый мощный ЯП из Ынтырпрайзного говна, за исключением, разве что, Руби. Так что, терпи:).

newuser1001 25.03.2015 16:41

MallSerg,
Ну так че, ты даже не попытаешься?

skrudjmakdak 25.03.2015 16:53

я ща с работы ухожу скоро, времени нет. как только приду домой, попытаюсь объяснить. НО только с одним условием. без намека на хамство в чью либо сторону! это будет около 8ми вечера. согласен?


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