Как сохранить HTML как есть при использовании innerHTML Javascript - PullRequest
0 голосов
/ 23 сентября 2011

все работает нормально, decodeURIComponent (xmlhttp.responseText) возвращается в виде html из скрипта синтаксического анализа, как проверено с предупреждением, в консоли нет ошибок, но замена html в редакторе

retHTML.innerHTML =decodeURIComponent(xmlhttp.responseText);

кажетсяиметь «функцию» перевода моего html в кодированный html (& to &) и т. д. Я не уверен, почему команда, которая говорит, что это внутренний html, помешает вам фактически использовать html?innerText просто усиливает это, а не возвращает свободный текст HTML, как подразумевается.Как мне вернуть возвращенный html обратно в div как html, который я запрашиваю?

function setHTML(retHTML)
{
retHTML.innerText =retHTML.innerHTML; }

function setTEXT(retHTML)
{
var tmpTXT =encodeURIComponent(retHTML.innerText);
var xmlhttp;
xmlhttp=new XMLHttpRequest(); 
xmlhttp.onreadystatechange=function()
{ retHTML.innerHTML =decodeURIComponent(xmlhttp.responseText);  }
xmlhttp.open("POST","path.php",true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send('send=' + tmpTXT); }

тестовая разметка следующим образом

<object width="853" height="510">
<param name="movie" value="http://www.youtube.com/v/iaysTVcounI?version=3&amp;hl=en_US&amp;rel=0">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always">
<embed src="http://www.youtube.com/v/iaysTVcounI?version=3&amp;hl=en_US&amp;rel=0&amp;autoplay=1" type="application/x-shockwave-flash" width="853" height="510" allowscriptaccess="always" allowfullscreen="true">
</object> 

должно быть

<object width="853" height="510">
<param name="movie" value="http://www.youtube.com/v/iaysTVcounI?version=3&hl=en_US&rel=0">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always">
<embed src="http://www.youtube.com/v/iaysTVcounI?version=3&hl=en_US&rel=0&autoplay=1" type="application/x-shockwave-flash" width="853" height="510" allowscriptaccess="always" allowfullscreen="true">
</object>

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

innerHTML - это анализатор, когда вы пишете в него, и сериализатор, когда вы читаете, а не простое свойство, которое хранит текст.

Когда вы пишете в innerHTML, он преобразует исходный текст HTML в объекты DOM, такие как Element, Attr и TextNode. Именно эти DOM-объекты отражают реальное состояние документа в окне браузера, а , а не все, что выглядит как источник HTML.

При записи любая информация, которая не имеет значения для «набора информации», хранящегося в DOM, теряется. Это включает в себя такие вещи, как регистр (независимо от того, был ли ваш тег <b> или <B>), порядок атрибутов, пробелы внутри тегов, ссылки на сущности и символы (т. Е. Сказали ли вы café, caf&#233; или caf&eacute; - это все то же самое для анализатора HTML) и многое другое.

Чтение только что написанного innerHTML приведет к повторной сериализации проанализированного DOM и вернет вам что-то, что не обязательно будет той же строкой, что и вставленная вами. Если вы допустили ошибки в исходном HTML, вы ' Вы также обнаружите, что выходные данные были исправлены, чтобы отразить то, что сделал анализатор HTML, чтобы иметь возможность прочитать то, что вы вставили. Таким образом, неверный пустой амперсанд обязательно превратится в &amp;.

(Я не уверен, к какому типу «редактора» вы обращаетесь, но если это <textarea>, то он дополнительно исправит < до &lt; в любом HTML-коде, который вы в него пишете, потому что текстовая область не может содержать разметку. Также довольно странно и не нужно, чтобы вы передавали обратно закодированные данные в формате responseText; вы уверены, что это происходит?)

ETA:

должно быть значением = "http://www.youtube.com/v/iaysTVcounI?version=3&hl=en_US&rel=0"

Нет, не должно. Это не правильный HTML. Экранирование от & s до &amp; - абсолютно правильная, обязательная вещь.

0 голосов
/ 24 сентября 2011

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

retHTML.innerHTML ='';  
retHTML.execCommand('insertHTML',false,xmlhttp.responseText);
...