#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть:
$('body').data('data1', '<script type="text/javascript">console.debug('execute');</script><div>example</div>');
и:
<div id="content"></div>
когда я делаю:
$(document).ready(function () {
$('#content').html($('body').data('data1'));
});
затем выполняется JavaScript. Как предотвратить выполнение? Возможно ли это?
Комментарии:
1. На самом деле, вы получаете синтаксическую ошибку. И даже если вы это исправите, чего вы ожидали, что произойдет? Если вы не хотите, чтобы скрипт запускался, тогда зачем вы вставляете его в DOM?
2. Извините за эту синтаксическую ошибку. Я писал по памяти. Этот пример является примером большой проблемы. Просто я должен также хранить JS-коды.
Ответ №1:
Вы должны удалить script
теги из вашей HTML-строки.
var p = new DOMParser(),
doc = p.parseFromString("<html><body>...</body></html>", "text/xml");
$('script', doc).remove();
Это работает с Firefox / Chrome, хотя я не знаю о других браузерах. Обратите внимание, что это будет работать только с правильно сформированным (x) html.
РЕДАКТИРОВАТЬ: Если вам также нужен JS, вы можете изменить предыдущий код таким образом:
var scripts = [];
$('script', doc).remove().each(function() {
scripts.push($(this).html());
});
Имейте в виду, вам даже не нужно удалять script
теги. Теперь, когда ответ находится в отдельном документе DOM, он не испортит ваши собственные сценарии, и вы сможете получить доступ к любому контенту, который вам нужен, с помощью простого $('selector', doc)
jQuery.
Ответ №2:
Единственный способ остановить выполнение скрипта — это удалить его из ваших данных. Прототип фреймворка делает это, используя регулярное выражение, подобное приведенному ниже:
<script[^>]*>([\S\s]*?)</script>
Комментарии:
1. Хм, не разбирать HTML с помощью регулярных выражений? Пожалуйста?
2. Я знаю, что это отвратительно. Однако это работает довольно хорошо. Он скопирован прямо из исходного кода прототипа. Выполнение этого таким образом означает, что это будет работать с искаженным XHTML, а также будет работать во всех браузерах.
3. Хорошая идея. Я удалил эти теги, но другим способом.