Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Отображение содержимого текстового узла (https://javascript.ru/forum/css-html/45048-otobrazhenie-soderzhimogo-tekstovogo-uzla.html)

kos403 12.02.2014 12:45

Отображение содержимого текстового узла
 
такой вопрос. Есть текстовый узел, комментарий в кода. Получаю к нему доступ с помощью childNodes. Но при попытке вычитки содержимого, получаю пустую строку. А мне нужен текст самого комментария. Пробывал вычитывать с помощью data, nodeValue и т.п. не помагает - все равно пустая строка. Мож кто сталкивался с подобным, хэлп плиз.

danik.js 12.02.2014 13:21

<body><!-- comment text -->
<script>
	var comment = document.body.firstChild;
	alert(comment.data);
</script>

kos403 12.02.2014 13:31

danik спасибо за помощь но у меня во всех браузерах выводится пустая строка без ничего. Причём я коммент пишу сразу после body и обращаюсь как ты написал firstChild. вообще не пойму что не так.

danik.js 12.02.2014 13:48

kos403, я думаю на тебе лежит проклятие. Это единственное объяснение, которое можно дать не увидив код.

danik.js 12.02.2014 13:49

Цитата:

Сообщение от kos403
danik спасибо за помощь но у меня во всех браузерах выводится пустая строка без ничего

Значит у тебя ошибка в коде. Согласен? А если у тебя ошибка в коде, который мы не видим, то что мы можем сделать? Интересно почему такие простые мысли ускользают от некоторых людей....

kos403 12.02.2014 13:52

Да нет всё ок, я уже понял, у меня просто комментарий был написан через пробел от body а пробел это ведь тоже текстовый узел. Вот почему была пустая строка. С кодом всё норм.Вот пример.

danik - но все равно спасибо большое!))

this.show_Comment = function(){
var mass_of_all_nodes = 0;
var length_of_the_collection_of_node = 0;

mass_of_all_nodes = document.body.childNodes;
length_of_the_collection_of_node = mass_of_all_nodes.length;

end : {

for(var i = 0;i < length_of_the_collection_of_node;i++){

if(mass_of_all_nodes[i].nodeType == 3){
if(mass_of_all_nodes[i].data.indexOf('<!-- js') != '-1' || mass_of_all_nodes[i].nodeValue.indexOf('<!-- js') != '-1'){

var from_where = 0;
var when_stopd = 0;
var string_of_data = '';

from_where = mass_of_all_nodes[i].data.indexOf(':');
when_stopd = mass_of_all_nodes[i].data.indexOf('>');

for(var j = from_where;j < when_stopd;j++){
string_of_data += mass_of_all_nodes[i].data.charAt(j);
}

break end;
}
}


}
alert('Nothing');

}
} ;
}

kos403 12.02.2014 13:55

Кстати спрошу раз уж на то пошло, а как вывести содержимое комментария находящего между body и head. Насколько я знаю между ними никаких текстовых узлов не создаётся. Но у меня коммент именно там расположен и мне нужно его вывести, может кто сталкивался, подскажите плиз!

выглядит примерно так

</style>
</head>

<!-- js: parse JS Code -->
<body>

danik.js 12.02.2014 14:16

kos403, ты с какой планеты? Во-первых, для кода на форуме есть спец-цеги, во-вторых, че за именование с подчеркиваниями и такие длинные имена? Где ты такое увидил? В-третьих, нафига метка end?
В-четвертых, для какого браузера у тебя .nodeValue используется?

kos403 12.02.2014 14:53

А все понял как между head и body найти нужно использовать document.documentElement - возвратит ссылку на документ html :dance:
Цитата:

Сообщение от danik.js
для кода на форуме есть спец-цеги

Да сори тупанул!
Цитата:

Сообщение от danik.js
во-вторых, че за именование с подчеркиваниями и такие длинные имена

на счёт длинных имён : я считаю что лучше пусть будут длинные названия переменных, зато программа будет понятной и читаться как книга.В крайнем случае код всегда можно закинуть в "сжиматели", "оптимизаторы" которые миними
зируют скрипт, но это уже для компа, а человеку так легче визуально представить информация.
Цитата:

Сообщение от danik.js
нафига метка end

Если функция находит нужную строка она переходит по метке и возвращает результат, забыл там добавить return string_of_data. Если нет, то просто выводится сообщение ниче не найдено и return( тут тоже забыл дописать оператор выхода)

kos403 12.02.2014 15:04

danik помоги пожалуйста с моим предыдущим вопросом,я оставлял на счёт IFrame, очень нужно плиз.

danik.js 12.02.2014 15:07

Цитата:

Сообщение от kos403
Если функция находит нужную строка она переходит по метке и возвращает результат

Нифига не понял. Зачем там метка? Покажи конечный код. И ответь на остальные вопросы пожалуйста. Ты некоторые пропустил.

kos403 12.02.2014 21:11

this.show_Comment = function(from, to){
							var mass_of_all_nodes = 0;
							var length_of_the_collection_of_node = 0;
							
							mass_of_all_nodes = document.body.childNodes;
							length_of_the_collection_of_node = mass_of_all_nodes.length;
								
								for(var i = 0;i < length_of_the_collection_of_node;i++){
										
										if(mass_of_all_nodes[i].nodeType == 8 && mass_of_all_nodes[i].nodeName == "#comment"){
												if(mass_of_all_nodes[i].data.indexOf(from) != '-1' || mass_of_all_nodes[i].nodeValue.indexOf(from) != '-1'){
														
														var from_where = 0;
														var when_stopd = 0;		
														var string_of_data = '';	
														
														from_where = mass_of_all_nodes[i].data.indexOf(from);
														when_stopd = (mass_of_all_nodes[i].data.indexOf(to) + 3);
														
														for(var j = from_where;j < when_stopd;j++){
																string_of_data += mass_of_all_nodes[i].data.charAt(j);			
															}
														
														alert(string_of_data + ' was found in body');	
														return;	
													}
											}		
									} 	
}

Конечная функция получилась вот такой!
где я такое увидел, да видел у некоторых прогеров, которые на С писали, но сам думаю что так и себе понятней и человеку который будет после тебя.
С какой я планеты, да вроде с этой, хотя хз ;)

kos403 12.02.2014 21:13

ну а метка там нужны была для того, что бы если функция успешно завершилась, то есть нашла строку - программа обходила блок с сообщением что ничего не найдено.

danik.js 13.02.2014 08:29

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

Опять же я не понял про nodeValue и nodeName.
Если доступаешься к элементу массива много раз, то почему бы не вынести элемент в переменную?

А вот это:
Цитата:

Сообщение от kos403
                                                          for(var j = from_where;j < when_stopd;j++){
                                                                  string_of_data += mass_of_all_nodes[i].data.charAt(j);         
                                                              }

- вобще пипец. Так на JS не делается. Все гораздо проще (и работать будет быстрее).

Вложенные if'ы - тоже зло. В каком-то проекте крупном, не помню, даже патч не примут если есть три вложенных if'a.

Вот мой вариант (примерно так же напишет любой js-прогер с планеты земля):
this.showComment = function(prefix, suffix) {
    var nodes = document.body.childNodes;
    for (var i = 0; i < nodes.length; i++) {
        var node = nodes[i];
        if (node.nodeType !== node.COMMENT_NODE)
            continue;
        var prefixIndex = node.data.indexOf(prefix);
        if (prefixIndex < 0)
            continue;
        var suffixIndex = node.data.indexOf(suffix);
        var data = node.data.substring(prefixIndex, suffixIndex + 3);
        return alert(data + ' was found in body');
    }
};


Чей на твой взгляд читабельней?
nodes.length не вижу смысла кэшировать.
Если нужна поддержка IE8, то тебе придется самому определить константу COMMENT_NODE.
Откуда число + 3? Че за магия?

kos403 16.02.2014 02:38

danik.js danik спасибо буду мотать на ус, ещё многому предстоит научиться)


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