Что за ФИГНЯ?! У этого языка программирования логика вообще есть?!
<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". ЭТО ВООБЩЕ ЧТО ТАКОЕ? |
jaroslav.tavgen,
и что не устраивает то?) Все же логично) Вы в 4-й строке перезаписали элемент, а ссылка осталась на старый. |
<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> |
tsigel,
У переменной A значение B. Я сказал интерпретатору: "изменить значение B на значение C". Затем я говорю интерпретатору: "Покажи мне значение переменной A". Интерпретатор отвечает: "Значение переменной A ни хрена не поменялось - как было B, так и осталось". Однако когда я прошу его выполнить действие, то он выполняет действие C!!! Где логика? A = B; A = C; WriteContentsOf(A) // Пишет: B DoAction(A) // Делает действие C |
tsigel,
По поводу Вашего кода : я эту разницу тоже увидел. Но какая логика скрывается за этим? |
jaroslav.tavgen,
Нененене, Девид Блейн! Все не так) Вы сказали браузеру: Сделай мне элемент по клику на который отработает "ф1" и сохрани этот элемент в переменную "А". А теперь удали этот элемент (а переменная осталась) и замени его на элемент по клику на который отработает "ф2". Теперь покажи мне переменную "А" (он чесно показывает по тому что там осталась ссылка на удаленный элемент) |
tsigel,если честно, кое-что непонятно.
Цитата:
Ведь вначале он должен удалить элемент, создать новый элемент, И ЗАТЕМ ПОСЛЕ ЭТОГО приравнять полученный результат к переменной A (id1.outerHTML = ...). Хоть по ссылке хоть по значению. |
jaroslav.tavgen,
Браузер должен только спецификации, а поведение кторого вы от него хотите там не описано. Может быть вы хотите потом добавить её обратно,если браузер будет чистить переменные на элементы которые он удалил, это сильно свяжет руки программистам. Вы должны сами следить за своими переменными. К тому же вы просто неправильно используете АПИ, если бы вы поменяли атрибут методом setAttribute то outerHTML показал бы вам то что вы хотите и не было бы никаких "удаленных" элементов. |
Цитата:
Только оператор "=" может сказать что переменную надо заменить. И это ЛОГИЧНО. |
Цитата:
|
Цитата:
|
http://learn.javascript.ru/basic-dom-node-properties
Цитата:
|
Цитата:
id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"'); он бы выдал ошибку из-за отсутствия "var id1.outerHTML;"? |
Цитата:
|
Цитата:
"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> |
Цитата:
Вот Ваш код: <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" (при этом не удаляя переменную), и СОЗДАЛИ НОВЫЙ тег, ссылку на который вы НИКУДА не записывали. Оператор присвоения ("=") в данном случае никак не связан с вашей переменной! Он говорит чтобы вы записали НОВУЮ строку на место где находится Ваш элемент. После того как строка записана браузер понимает что это тег. |
Цитата:
Моя версия следующая. Когда ты меняешь outerHTML, он у тебя загружается в "виртуальную машину", а в исходнике он остается неизменным. Так вот, интерпретатор считывает outerHtml, похоже, из исходника, по-крайней мере в части между треугольными скобками. innerHTML все ж таки перерисовывается. Возможно это просто тупость имплементаторов, возможно, дрочево в присядку под компиляцию, чтобы меньше проходов делать. Но в любом случае, это ужасный косяк, да. |
jaroslav.tavgen,
Советую обратить внимание на карму "Горного Троля" с ником "newuser1001", и не слушать бред который он извергает. |
теперь я попробую объяснить указатели))
никаких дум элементов, возьмем обычный массив, но в массиве может находиться еще один массив, смотрим: 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 массив то сохранен |
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)); |
<!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> |
конкретно этот косяк можно пофиксить вот так:
<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 и так доступны по именам переменных), но, в общем случае, конечно, это не сработает. Надо, избегать, короче, этого дерьма, по возможности. |
skrudjmakdak,
И че? Какое это к сабжу имеет отношение? |
Цитата:
|
skrudjmakdak,
Короче, я прочитал это как: Цитата:
Твое кукареку имеет такое же отношение к сабжу, как сортир в деревне Простоквашино. А то о чем ты говоришь, это элементарщина, я хз, как это можно "не понимать", дегенератом полным надо быть для этого. |
skrudjmakdak,
Не обращай внимания на этого троля. |
tsigel,
заканчивай уже кирпичами срать. Ну мокнул я тебя разец в говнецо, не вечно же ты с этой болью жить будешь? В следующий раз будешь внимательней относиться к своим словам, ты спасибо должен сказать, я тебя к ответственности приучаю. Может мужиком станешь, со временем. |
newuser1001,
тебе хотят помочь, но ты грубишь в место того чтобы вникнуть. это печально. это очень печально. так как оно нужно не мне, а тебе |
skrudjmakdak,
Ты не попутал ничего? Я чо помощи просил? Я у тебя конкретно спросил, какое отношение твоя хрень имеет к сабжу. Ты слился. А про помощь -- это уже твои фантази, ты видать попутал. Разуй глаза. |
Цитата:
Цитата:
Цитата:
|
newuser1001,
Цитата:
|
skrudjmakdak,
Цитата:
|
Цитата:
|
tsigel,
Да, серьезно тебя бомбануло. Чуть более чем ожидалось. Сходи к психологу. |
skrudjmakdak,
Короче, слив засчитан. Ты юлишь задом уже третий пост, в философию вдарился. Поздравляю. Я, в принципе, сразу понял, что ты гонишь. Была какая-то тень сомнения... Но растаяла. |
foo вернулся )
|
jaroslav.tavgen,
Кстати, в JS еще куча wtf'ков, например в V8, внезапно: if(0) function foo(){alert("Hello!")} foo() // Hello! просто пошло статик-б*ство во все края, Ъ-динамичному языку трудно приспосабливаться. но, язык, все же хороший. Это самый мощный ЯП из Ынтырпрайзного говна, за исключением, разве что, Руби. Так что, терпи:). |
MallSerg,
Ну так че, ты даже не попытаешься? |
я ща с работы ухожу скоро, времени нет. как только приду домой, попытаюсь объяснить. НО только с одним условием. без намека на хамство в чью либо сторону! это будет около 8ми вечера. согласен?
|
Часовой пояс GMT +3, время: 17:27. |