Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   аналог innerHTML (https://javascript.ru/forum/offtopic/4786-analog-innerhtml.html)

B~Vladi 20.08.2009 15:20

аналог innerHTML
 
Как известно, W3C рекомендует не использовать innerHTML, а вместо него DOM-методы.

Хорошо, теги с текстом генерить мы можем, а вот как в тег вставить, например, HTML-код символа? createTextNode() вставляет их "как есть", data/setData - то же самое...
:-?

Kolyaj 20.08.2009 16:09

String.fromCharCode(code);


А вообще, они там (W3C) теоретики все. Практика показывает, что без innerHTML нельзя.

B~Vladi 20.08.2009 16:17

За код спасибо. Почему-то не попадался такой...

Цитата:

Сообщение от Kolyaj
Практика показывает, что без innerHTML нельзя.

Если думать логически, то innerHTML даже быстрее будет работать при больших объёмах, т.к. формирование DOM происходит на низком уровне. Так что, думаю, у него есть основания жить:)

e1f 20.08.2009 16:27

Возникает закономерный вопрос -- "А зачем?" всех символов есть Юникод-представление, милости просим. А HTML-код, как видно из названия, нужен для HTML

B~Vladi 20.08.2009 16:59

Цитата:

Сообщение от e1f
Юникод-представление

Дк вот это самое представление и надо ставить. createTextNode('&') ставит &, а не амперсанд.

Gvozd 20.08.2009 18:18

чем не угодил createTextNode('\'') ?

e1f 20.08.2009 18:24

Цитата:

Сообщение от B~Vladi (Сообщение 27703)
Дк вот это самое представление и надо ставить. createTextNode('&') ставит &, а не амперсанд.

Что мешает написать createTextNode('\x26')?

Tim 20.08.2009 21:50

хоть innerHTML и не входит в спецификации W3C его поддерживают все современные браузеры. Уверен будут поддерживать и дальше. Вообще не вижу причин заморачиваться.

B~Vladi 21.08.2009 10:34

Цитата:

Сообщение от Tim
хоть innerHTML и не входит в спецификации W3C его поддерживают все современные браузеры.

Я вкурсе:)
Цитата:

Сообщение от Tim
Вообще не вижу причин заморачиваться.

Я вижу.
Цитата:

Сообщение от e1f
Что мешает написать createTextNode('\x26')?

А что это - \x26???
Нет, я вкурсе, что & - это амперсанд, но откуда такая запись взялась?

Riim 21.08.2009 11:01

Цитата:

Сообщение от B~Vladi
А что это - \x26???
Нет, я вкурсе, что & - это амперсанд, но откуда такая запись взялась?

\0n
n - восьмеричное число, не большее 377. Соответствует символу с восьмеричным кодом n.

\xn
n - шестнадцатеричное число, состоящее из двух цифр. Соответствует символу с шестнадцатеричным кодом n.

\un
n - шестнадцатеричное число, состоящее из четырех цифр. Соответствует символу Unicode с шестнадцатеричным кодом n.

B~Vladi 21.08.2009 11:26

Riim, спасибо, впринципе всё понятно:)

Increazon 20.04.2010 14:56

Цитата:

Сообщение от Tim (Сообщение 27733)
хоть innerHTML и не входит в спецификации W3C его поддерживают все современные браузеры. Уверен будут поддерживать и дальше. Вообще не вижу причин заморачиваться.

Ты не видишь причин, а я охуевший сижу! Нужно менять текста в ячейке таблицы на джаваскрипт, в ИЕ7 пишет "Операция прервана. Не могу отобразить страницу." Так что поверь причины есть

Gvozd 20.04.2010 15:05

Increazon,
радиус кривизны слишком мал

Increazon 20.04.2010 15:16

Спасибо. Сделал. Вот код:
var ar2 =  JSON.parse(editStr, function (k,v) { return v; });
// now init the innerHtml numbers of door
updadeCellsDoorNumber();
function updadeCellsDoorNumber()
{
var temputnd;
var cuttd;
for (var i=1; i<=ar2_ln; i++)
{
	temputnd = document.createTextNode(guv(i,'door'));
	cuttd = $('td'+i);
	cuttd.replaceChild(temputnd,cuttd.firstChild);
	if ((guv(i,'status')=='reserved') || (guv(i,'status')=='sold'))
	{
		$('td'+i).style.backgroundColor = '#990000';
		$('td'+i).style.color = '#f4f4f4';
	}
	else $('td'+i).style.color = '#242021';
}
}


Дак если радиус кривизны мал, давайте все гавно делать, что в фаерфокс хорошо, то в ИЕ полная хуйня. ?

Gvozd 20.04.2010 15:24

<html>
<body>
<table>
<tr>
	<td id="td"></td>
</tr>
</table>
<script type="text/javascript">
document.getElementById('td').innerHTML='sdsad';
</script>
</body>
</html>

ну и где что не работает в IE?

Kolyaj 20.04.2010 15:54

У него, наверно, что-то вроде
<html>
<body>
<table>
<tr>
    <td id="td"><div><script type="text/javascript">
            document.getElementById('td').innerHTML='sdsad';
    </script></div></td>
</tr>
</table>

</body>
</html>

Increazon 20.04.2010 17:58

Проверил. Работает. Но если ты слышал о проблеме ИЕ7, он может через раз то выдавать ошибку, то показывать страницу. Лично я уже 2 раза столкнулся с таким приколом. А новое решение - универсально, и придерживается W3C. Я больше никогда не буду использовать innerHTML. Потому что всегда найдется лох который использует ИЕ, да еще и старых версий.

Gvozd 20.04.2010 18:12

На зеркало неча пенять, коли рожа крива.©

Kolyaj 20.04.2010 21:07

Цитата:

Сообщение от Increazon
Но если ты слышал о проблеме ИЕ7, он может через раз то выдавать ошибку, то показывать страницу.

Ошибка, о которой вы говорите, давно известна, и давно описано, в каких случаях она возникает. Один из таких случаев я привёл. Никаких через раз нет.

mycoding 28.05.2010 14:48

Хотел спросить, а как генерируются диалоги и другие виджеты в JQuery?
Через innerHTML или через createElements ?

Прочитал вот эту статью http://javascript.ru/optimize/javascript-performance
Т.е. обращение через createElements очень медленное будет по сравнению с innerHTML.

Например попробуем сделать диалоговое окно. Там надо как минимум раз 5 сделать элемент через createElements.
А в innerHTML всего один раз обратится к DOM и всё.
Ведь обращение к DOM очень медленное.
Подскажите, пожалуйста как лучше генерировать диалоговые окна, через какой метод и как это сделано в framework-ах?

Kolyaj 28.05.2010 14:54

Цитата:

Сообщение от mycoding
как лучше генерировать диалоговые окна

Через innerHTML. Среди каши из createElement потом не разберёшься. Проходили.

B~Vladi 28.05.2010 14:56

Есть другой вариант. В памяти лежит шаблон HTML - кода. Так же есть ссылки на необходимые элементы, которые нужно "подправить" при создании нового экземпляра шаблона. Таким образом, при создании экземпляра, клонируем нужный шаблон, правим (если надо) и добавляем в DOM одним разом - с помощью documentFragment, если добавляется всё в 1 место. Не уверен, что будет быстрее innerHTML, но удобнее - это факт. Так же не придётся создавать каждый элемент шаблона через createElement.

e1f 28.05.2010 15:01

Цитата:

Сообщение от mycoding (Сообщение 56854)
Хотел спросить, а как генерируются диалоги и другие виджеты в JQuery?
Через innerHTML или через createElements ?

Прочитал вот эту статью http://javascript.ru/optimize/javascript-performance
Т.е. обращение через createElements очень медленное будет по сравнению с innerHTML.

Например попробуем сделать диалоговое окно. Там надо как минимум раз 5 сделать элемент через createElements.
А в innerHTML всего один раз обратится к DOM и всё.
Ведь обращение к DOM очень медленное.
Подскажите, пожалуйста как лучше генерировать диалоговые окна, через какой метод и как это сделано в framework-ах?

mycoding, ну епсель-дропсель, неужели сложно открыть исходник? Пора уже сервис делать Let me read the source for you...

try {
    for ( var i = 0, l = this.length; i < l; i++ ) {
        // Remove element nodes and prevent memory leaks
        if ( this[i].nodeType === 1 ) {
            jQuery.cleanData( this[i].getElementsByTagName("*") );
            this[i].innerHTML = value;
        }
    }

// If using innerHTML throws an exception, use the fallback method
} catch(e) {
    this.empty().append( value );
}


UPD Kolyaj, innerHTML может иногда подвести в ИЕ, при невалидном html.

Kolyaj 28.05.2010 15:13

Цитата:

Сообщение от e1f
innerHTML может иногда подвести в ИЕ, при невалидном html.

Примеры? Иногда может подвести всё, что угодно, в любом браузере. И что имеется в виду под невалидным HTML?

e1f 28.05.2010 15:25

Kolyaj, хм, а тема-то старовата, я и не заметил :)
Пример тот, что у ТС'а :)

Kolyaj 28.05.2010 15:33

Цитата:

Сообщение от e1f
Пример тот, что у ТС'а

У ТС'а нет никаких примеров :)

e1f 28.05.2010 15:39

У ТС'а была проблема, которая и является примером "подвести в ИЕ" :)

UPD Тю, с чего это я решил, что Increazon -- ТС. Туплю, видимо :)

B~Vladi 28.05.2010 15:41

Цитата:

Сообщение от Kolyaj
У ТС'а

Можно просто Влад:)

Kolyaj 28.05.2010 15:44

ТС, B~Vladi то бишь, про IE вообще не упоминает. Может ты имеешь в виду
Цитата:

Сообщение от Increazon
Ты не видишь причин, а я охуевший сижу! Нужно менять текста в ячейке таблицы на джаваскрипт, в ИЕ7 пишет "Операция прервана. Не могу отобразить страницу." Так что поверь причины есть

Так неизвестно, что там Increazon наворотил. Если это то, о чём я думаю, то проблема не в innerHTML.

e1f 28.05.2010 15:54

Kolyaj, да, я это и имел в виду :) И Вы правы -- тут innerHTML вроде не виноват -- скорее всего это вставка элементов JS-ом до load страницы.

Increazon 28.05.2010 17:51

А кто такой ТС? впервые слышу. Признаюсь что в том сайте который я сделал - используется и innerHTML (лень менять, ведь работает), и AppendChild. Но InnerHTML всетаки не предусмотрен стандартами W3C, бейте его!

Octane 28.05.2010 17:58

Цитата:

Сообщение от Increazon
А кто такой ТС? впервые слышу.

topic starter — человек, создавший тему на форуме, автор темы.

Kolyaj 28.05.2010 18:57

Цитата:

Сообщение от Increazon
Но InnerHTML всетаки не предусмотрен стандартами W3C

http://www.w3.org/TR/html5/embedded-...html#innerhtml


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