это лучшая практика?
Нет. Фактически у вас есть проблемы с HTML-инъекцией, приводящие к ошибкам, и в худшем случае, когда внедренные строки могут содержать пользовательский контент, дыры в безопасности XSS.
Когда вы помещаете текстовое содержимое и значения атрибутов в строку HTML, вы должны кодировать их HTML. В PHP вы должны вызывать htmlspecialchars()
для строк, входящих в HTML, чтобы сделать это. В JavaScript у вас нет встроенной функции экранирования HTML, поэтому вы должны сделать свою собственную, например. используя s.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"')
для строки, входящей в HTML.
OnClick = "SomeFunc (\ '{STRING} \');"
Это совершенно новый уровень избегания беспорядка. В строковом литерале JavaScript внутри атрибута обработчика события вам придется JS-кодировать строку (\
-эскапинг '
и \
плюс несколько символов Юникода для полноты) и , затем HTML -кодировать результаты. В противном случае строка может выйти за пределы строкового литерала и ввести произвольный код JS. Избегайте встроенных атрибутов обработчика событий во всех случаях, но особенно в шаблонах.
Создание содержимого страницы с помощью HTML-строк - отстой. Вы, скорее всего, совершите ошибки, которые могут избежать проблем, и поставить под угрозу безопасность вашего приложения. Вместо этого используйте DOM-подобные методы, и вам не нужно об этом беспокоиться. Кажется, вы используете jQuery, поэтому попробуйте ярлыки создания элемента jQuery 1.4:
$('<tr>').append(
$('<td>').append(
$('<a>', {
href: o.link,
text: o.word,
onclick: function() {
someFunc(o.string);
}
})
)
);
или оставьте пустую строку внутри документа как HTML, но затем скройте ее (display: none
) или отсоедините ее от документа во время запуска (removeChild
или jQuery detach
). Затем, когда вы хотите новую строку, клонируйте пустую строку и внесите необходимые изменения:
var blankRow= $('#blankRow').detach();
...
var newRow= blankRow.clone();
var link= newRow.find('td>a');
link.attr('href': o.link);
link.text(o.word);
link.click(function() {
someFunc(o.string);
});
Если вам необходимо создать контент из строковых шаблонов, убедитесь, что ваша шаблонная функция HTML-по умолчанию экранирует каждую замену, и присоединяйте события, выбирая узлы внутри анализируемого контента для вызова click(function() { ... })
. Или используйте делегирование событий (например, jQuery live()
) для обработки событий без необходимости привязки к новым узлам при добавлении.