Двойной выход из HTML - PullRequest
       22

Двойной выход из HTML

0 голосов
/ 20 ноября 2011

Я использую библиотеку подсказок, где экранирую HTML и помещаю ее в атрибут title. Когда вы наводите курсор мыши на этот элемент, он удаляет код HTML и помещает его во всплывающую подсказку.

У меня проблемы с рекурсией. У меня есть кнопка во всплывающей подсказке, которая также имеет подсказку. Пример:

nested_toooltip = "<h1>Hi, I'm a tooltip</h1>"
tooltip = '<a title="' + escapeHtml(nested_tooltip) + '">Button</a>"
document.write('<a title="' + escapeHtml(tooltip) + '">Button</a>"')

Когда вы создаете первую подсказку, она удаляет ВСЕ подсказки. И я по существу получаю искаженный HTML. Есть ли умный способ сделать это, когда HTML может быть по существу экранирован дважды? Потому что escapeHtml (escapeHtml (строка)) дает тот же результат, что и escapeHtml (строка).

1 Ответ

0 голосов
/ 20 ноября 2011

Вам нужна правильная escapeHTML функция (эквивалентная PHP htmlentities()).

function escapeHTML(s){
    var d = document.createElement("div");            //Container
    d.innerHTML = "<a></a>";                          //Placeholder
    d.firstChild.setAttribute("title", s);            //Setter
    return d.innerHTML.match(/^<a[^"]+"([^"]*)"/i)[1];//Returns entitied html
}

Объяснение кода:

  • Создание контейнера
  • Сохраните в нем фиктивный элемент (в данном случае <a>)
  • Используйте метод setAttributw для фиктивного элемента, чтобы установить атрибут
  • Получить свойство .innerHTML контейнера,Это вернет фиктивный элемент плюс разрешенную строку.Уберите фиктивный элемент и верните «экранированную» строку.
...