Почему атрибут html возвращается как 'htmldecoded', даже если он закодирован в html source? - PullRequest
0 голосов
/ 05 мая 2009

Я использую заголовок атрибута html, чтобы установить некоторые подсказки, подобные этому:

 <a href... title="Go to next chapter">Go</a>

Затем плагин jquery просматривает все атрибуты [title] и создает красивые подсказки. Очень упрощенный новый div создан по ссылке выше

<div style="position:absolute...">Go to next chapter</div>

Проблема в том, что заголовок редактируется пользователем, поэтому он может писать все, что захочет. Сначала я подумал, что html-кодирование в порядке, но оказалось, что я ошибался. Если у меня есть

<a id="a" title="&lt;script&gt;alert(10);&lt;/script&gt">Go</a>

тогда подсказка div выглядит следующим образом:

<div style="position:absolute..."><script>alert(10)</script></div>

1) Почему браузер декодирует атрибут title при запросе его значения?

2) И как я могу это решить? (Я знаю, что одним из решений является двойная HTML-кодировка, но это здорово)

Как это проверить: рассмотрите этот код

<html>  
 <body>  
  <!-- encoding once, this doesn't work -->
  <a id="a" title="&lt;script&gt;alert(10);&lt;/script&gt">atitle</a>  
  <!-- encoding twice, this works -->
  <a id="b" title="&amp;lt;script&amp;gt;alert(10);&amp;lt;/script&amp;gt">btitle</a>  

  <script>  
   function w(x){ document.write(x.attributes["title"].value);}  
   w(a);  // shows alert
   w(b);  // outputs it correctly into the page
  </script>  
 </body>  
</html>

1 Ответ

1 голос
/ 05 мая 2009

1) Значение атрибута является декодированным значением - это единственный способ, который имеет смысл, если вы об этом думаете. Если вы установите значение javascript равным "\ n", то предупредите об этом, хотите ли вы вернуть "\ n" или настоящую новую строку? Атрибут title - это текст ... вам просто нужно кодировать его HTML, чтобы написать.

2) Вы можете дважды закодировать его или использовать текстовый узел:

var node = document.createTextNode(x.attributes['title'].value);
document.appendChild(node);

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

...