Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить некорректный HTML (https://javascript.ru/forum/misc/16757-poluchit-nekorrektnyjj-html.html)

poorking 21.04.2011 02:13

Получить некорректный HTML
 
Здравствуйте.
Понадобилась написать несложный парсер. И хотелось бы задавать тегу css класс, писать там все что вздумается, скриптом искать элементы с этим классом и придавать нужный вид тому что внутри тега.

Текст внутри тега может содержать некорректный хтмл, поэтому с помощью innerHTML его получать нельзя, т.к. браузер сам закрывает теги и прочее.

Чтобы браузер не парсил содержимое тега, появилась мысль заключить в коммент содержимое тега, но опять же, придется обращаться к innerHTML (comment = document.createComment(myelem.innerHTML)),
потом появилась мысль добавить текстовые ноды в начале и конце содержимого тега "<!--" и "-->" соответственно, получить innerHTML, а потом отделить их. Но тогда браузер заменит угловые скобки на мнемоники и комментарий не получится.

Подскажите есть ли возможность получить текст внутри тега без изменений?

poorking 21.04.2011 04:48

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

UPD
Проверил на синтакс хайлайтере http://alexgorbatchev.com/SyntaxHighlighter/
строку var a = "<span style = \"color: red\">";

Как и ожидал, та же проблема

Kolyaj 21.04.2011 10:05

Можно класть в textarea, но лучше всё-таки в JavaScript сразу.

monolithed 21.04.2011 10:35

Цитата:

Сообщение от poorking
И хотелось бы задавать тегу css класс, писать там все что вздумается, скриптом искать элементы с этим классом и придавать нужный вид тому что внутри тега.

использование пространств имен еще никто не отменял

poorking 21.04.2011 11:08

Kolyaj,
С текстареа очень удобно кстати, получать textarea c нужным css классом или другим каким атрибутом, брать value, div с подсвеченным кодом, прятать или удалять textarea , ставить рядом div.

Если напрямую в javascript помещать код требующий подсветки, то тоже возникает проблема, возьмем ту же строку
var a = "<span style = \"color: red\">";
alert(a);

Экранированные кавычки преобразуются в обычные, то есть я получу уже не исходный текст.

Пока что это лучший вариант на мой взгляд, спасибо

Kolyaj 21.04.2011 11:33

Цитата:

Сообщение от poorking
то тоже возникает проблема

Нет никакой проблемы, если строку прогонять через json_encode (если у вас php).
<? $str = "Произвольная строка для JS"; ?>
<script type="text/javascript">
    var str = <?= json_encode($str) ?>;
</script>

poorking 21.04.2011 12:30

Нет, я все преобразования на клиенте делаю, просто получаю все
<textarea class = "marked"></textarea>
и их заменяю на другие созданные элементы.

А почему так хуже? Мне кажется это удобно, просто требующий изменения текст помещать в textarea с нужным классом
<textarea class = "marked">
	<span>
	var a = "<span style = \"color: red\">";
</textarea>

Примерно так делаю
(function(){
		var textareas = document.getElementsByTagName("TEXTAREA"), i = textareas.length;
		
		var markedSnippets = [], snippet, text;
		
		while(i --){
			snippet = textareas[i];
			if(/\b(marked)\b/.test(snippet.className)){
				markedSnippets.push(snippet);
			}
		}
		
		i = markedSnippets.length;
		
		
		
		while(i --){
			//HTMLEntities API [url]http://javascript.ru/blog/I-zone/Razbiraem-ponyatie-mnemoniki-praktike[/url].
			text = HTML.encode(HTML.decode(markedSnippets[i].value));
			
			/*
				Тут делаю нужные замены в text
			*/
			
			markedSnippets[i].parentNode.insertBefore(
				newDOM("DIV",
					{
						properties:{
							
							innerHTML: text,
							style:{
								whiteSpace: "pre"
							}
						}
					}
				),
			markedSnippets[i]);
			
			markedSnippets[i].style.display = "none";
		}	
	}())

Kolyaj 21.04.2011 13:53

Цитата:

Сообщение от poorking
А почему так хуже?

Ну например в строке может встретиться </textarea>

poorking 21.04.2011 14:26

Правда ведь. Ну тогда и правда остается один вариант, напрямую брать текст

x-yuri 28.04.2011 07:23

Цитата:

Сообщение от poorking
А почему так хуже? Мне кажется это удобно, просто требующий изменения текст помещать в textarea с нужным классом

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

правда непонятно, зачем тебе некорректный html


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