Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.02.2021, 02:42
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

странное поведение .innerHTML()
почему, если напечатать вот так:
var html_tbl = document.getElementById('small_tbl');
      html_tbl.innerHTML += "<table>\n";
      html_tbl.innerHTML += "<table2>\n";

alert(html_tbl.innerHTML);

то он выдаёт:
<table>
</table> <table2>
</table2>

ЧЯДНТ???

там <span id='small_tbl'></span>
Ответить с цитированием
  #2 (permalink)  
Старый 03.02.2021, 02:49
Новичок на форуме
Отправить личное сообщение для awoll_n Посмотреть профиль Найти все сообщения от awoll_n
 
Регистрация: 03.02.2021
Сообщений: 2

html_tbl.innerHTML += "<table>";
html_tbl.innerHTML += "\n<table2>";
html_tbl.innerHTML += "\n<table3>";
Ответить с цитированием
  #3 (permalink)  
Старый 03.02.2021, 07:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Нормальное поведение.
Не понятно, что такое <table2>? Такого элемента не существует. Но это без разницы.
Происходит автозакрытие тегов.
У вас есть <span></span>.
Вы вставляете туда <table>, рассчитывая получить span><table></span>. Но сразу после вставки начинается парсинг этой строки. Парсер видит <table></span>. Такого быть не должно. Поэтому он сразу исправляет, закрывая тег, </table>. Иначе элементы правильно не построить.
Ответить с цитированием
  #4 (permalink)  
Старый 03.02.2021, 11:15
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

ок, но я там пытался вставлять в цикле <tr><td><div></div></td></tr>
а там вставляется только <div></div>
После <table></table>...
Спасибо тебе, умный парсер, что запорол программу... кто тебя просил??
Т.е. надо собирать таблицу в некую переменную, а только потом её .innerHTML(var)
и это единственный путь?
Ответить с цитированием
  #5 (permalink)  
Старый 03.02.2021, 11:53
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Да, готовая переменная - это единственный путь, если работать со строками. И не только из-за парсера:
a += b
в javascript это полный аналог
a = a + b
, соответственно
innerHTML += x
полностью перезаписывает заново весь код(и заново парсит), так делать нельзя в принципе.

Надо помнить, что вы работаете не с текстом, а с уже готовой DOM структурой, текст парсится по мере прихода с сервера и уже не существует в живой странице. Методы типа innerHTML - это на самом деле костыль. Правильно же с DOM структурой работать через DOM методы: createElement, appendChild итд.

P.S. Есть метод document.write() который работает именно так, как вы ожидаете, но он работает только во время загрузки страницы, т.к. плюёт текст прямо в поток получаемого с сервера, до того как он будет распаршен. Соответственно после того как страница уже загрузилась - использовать его невозможно.
__________________
29375, 35

Последний раз редактировалось Aetae, 03.02.2021 в 12:01.
Ответить с цитированием
  #6 (permalink)  
Старый 03.02.2021, 12:09
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

да, точно, DOM
спасибо
Ответить с цитированием
  #7 (permalink)  
Старый 03.02.2021, 13:22
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

хотя вообще-то есть один нюанс...
там таки появляется <div></div>
а значит НЕ перезаписывает...

И ещё вопрос: почему <tr><td></td></tr> не вставил, потому что </table> уже был?
Ответить с цитированием
  #8 (permalink)  
Старый 03.02.2021, 14:52
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от greenwar
И ещё вопрос: почему <tr><td></td></tr> не вставил, потому что </table> уже был?
Именно поэтому. <tr> можно вставлять только в <table> и ее компоненты. <td> только в tr. А <div></div> вставится.
Ответить с цитированием
  #9 (permalink)  
Старый 03.02.2021, 14:53
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от greenwar
Спасибо тебе, умный парсер, что запорол программу... кто тебя просил??
Такую программу и запороть не жалко.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение отладчика Andrew K Библиотеки/Тулкиты/Фреймворки 8 29.11.2019 12:30
Странное поведение jQuery borodatych Javascript под браузер 5 27.02.2014 11:47
Странное поведение innerHTML DoubleDragon Общие вопросы Javascript 9 10.08.2012 16:09
Странное поведение переменной mycoding Серверные языки и технологии 4 14.01.2011 19:18
Странное поведение replace cooli0 Общие вопросы Javascript 4 25.01.2010 17:16