Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: NodeList возвращает копию DOM объекта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Bio man
Отправлено: 29 Августа, 2014 - 17:04:48
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Почему NodeList возвращает копию? Попробую объяснить ситуауию.
Нужно у элемента взять все дочерние элементы и что то с ними сделать.
CODE (javascript):
скопировать код в буфер обмена
  1. var copyButtons = dv.right.copyButtons.childNodes;
  2. console.log(copyButtons);

Код возвращает массив элементов, все элементы хранятся как надо, то есть напрямую связаны с DOM, так как при наведении на ноду в панели разработчиков хрома, подсвечивается нода на странице.
НО! если попытаться получить дочерний элемент, например
CODE (javascript):
скопировать код в буфер обмена
  1. console.log(copyButtons[0]);

то возвращается КОПИЯ! Меняя дочерний элемент, DOM остаётся без изменений.
Кто сталкивался с подобным? В чём вообще дело?
Спасибо.
 
 Top
esterio
Отправлено: 30 Августа, 2014 - 15:46:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




все нормально. вы видимо меняете TextNode
CODE (html):
скопировать код в буфер обмена
  1. <p id="id1">
  2.     <span>text</span>
  3.     <span>text</span>
  4.     <span>text</span>
  5.     <span>text</span>
  6. </p>

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var c = document.getElementById('id1').childNodes;
  3. c[1].style.color = 'red';

все ок меняет первый текст на красный. но вот елемент с индексом 0
Цитата:
<TextNode textContent="\n ">
 
 Top
Bio man
Отправлено: 30 Августа, 2014 - 21:17:47
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Да нет, не получилось тебе объяснить странное поведение.
У меня проблема не тривиальная, впервые такое.

Немного предыстории.
Пытаюсь изменить отображение плагина merge из CodeMirror.
Полазив немного по плагину, не нашёл никаких настроек для кастомизации кнопок, наобарот, все параметры по кнопкам зашиты в коде.
И единственный способ изменить кнопки уже после их рендеринга.
И вот я получаю массив этих кнопок и не могу их изменить! Точней я получаю копии кнопок, не то что сейчас в DOM.

Выложу пару скринов с отладчика.
На первом результат работы вот такого кода:
CODE (javascript):
скопировать код в буфер обмена
  1. var copyButtons = dv.right.copyButtons.childNodes;
  2. console.log(copyButtons);


Как видно, возвращается массив нужных мне нод. В браузере подсвечивается нода с индексом 0.

А вот вторая картинка, результат выполнения такого кода:
CODE (javascript):
скопировать код в буфер обмена
  1. var copyButtons = dv.right.copyButtons.childNodes;
  2. console.log(copyButtons[0]);

 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Августа, 2014 - 02:59:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




 
 Top
Bio man
Отправлено: 31 Августа, 2014 - 04:55:32
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




нет, не то.
 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Августа, 2014 - 08:47:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Я к тому, что Вы ошибаетесь
Bio man пишет:
NodeList возвращает копию
 
 Top
Bio man
Отправлено: 31 Августа, 2014 - 12:45:12
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Но в моём случае так и есть.
А почему у него такое поведения я бы и хотел выяснить.
Ломает всю человеческую логику.
Как из корзины полной яблок можно достать грушу, если изначально там груш не было?
Такая вот метафора моей проблемы.
 
 Top
IllusionMH
Отправлено: 01 Сентября, 2014 - 11:50:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Bio man, проблема именнно с консолью или с NodeList ?
Слегка переделанный пример http://jsfiddle[dot]net/ufv01rL6/2/
Прекрасно выделяет в Opera(stable, dev), GC(stable, canary), FF(stable, nightly). Только в дев тулах IE(stable, DP) не сработало.

(Отредактировано автором: 01 Сентября, 2014 - 12:03:39)

 
 Top
Bio man
Отправлено: 01 Сентября, 2014 - 13:25:22
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




IllusionMH, с NodeList, если я всё правильно понял. Если я изменяю элементы в цикле, то тоже ничего не происходит.
 
 Top
IllusionMH
Отправлено: 01 Сентября, 2014 - 14:56:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Bio man, тогда конкретные куски кода на jsFiddle(или любой другой вохожий ресурс) и тогда можно будет смотреть.
Простые манипуляции показывают в примере armancho7777777 что все ок.

(Отредактировано автором: 01 Сентября, 2014 - 14:57:11)

 
 Top
Bio man
Отправлено: 01 Сентября, 2014 - 15:18:11
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




 
 Top
IllusionMH
Отправлено: 01 Сентября, 2014 - 16:04:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Bio man, а если сделать вот так http://jsfiddle[dot]net/bc9k3nrL/2/тогда элементы показывает правильные.
Похоже, что редактор сам еще раз перезаписывает эти элементы(не искал в какой момент времени), поэтому выведенные элементы уже не актуальны, а element.childNodes всегда имеет актуальное состояние.

Нужно искать в доке есть ли событие по которому меняются эти элементы и уже менять их после этого события.

upd. Замечено что список обновляется как минимум при скролле или изменении размеров. Так что нужно икать что-то вроде глобального ивента перерисовки.

(Отредактировано автором: 01 Сентября, 2014 - 16:08:27)

 
 Top
Bio man
Отправлено: 01 Сентября, 2014 - 16:35:47
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Спасибо огромное! Теперь есть куда копать.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB