Остановить выполнение JavaScript

#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. Хорошая идея. Я удалил эти теги, но другим способом.