Issue # 1
Escape / Encoding
Когда анализатор HTML находит <script>
, он начнет анализировать содержимое, пока не найдет </script>
, который присутствует в:
document.write("<script src='links7.js?'+Math.random()+></script>
Таким образом, вам нужно изменить исходный код, чтобы он не анализировался как конец элемента скрипта:
document.write("<script src='links7.js?'+Math.random()+></scri" + "pt>");
В идеале, HTML-код должен был бы избежать всего вашего встроенного JavaScriptкод, который также смягчил бы эту проблему:
document.write("<script src='links7.js?'+Math.random()+></script>");
Но, честно говоря, выполнение этого действительно раздражает очень быстро .
Лучшее средство экранирования всего содержимого символов внутриваш встроенный JavaScripts должен использовать элемент CDATA
(символьные данные):
<script type="text/javascript">
<![CDATA[
document.write("<script src='links7.js?'+Math.random()+></script>");
]]>
</script>
Конечно, поскольку элемент CDATA
находится внутри элемента <script>
, анализатор JS пытается выполнить его каккода, и не знает, что делать с синтаксисом, таким как < ! [ CDATA [
, поэтому, чтобы обойти эту проблему, вам нужно обернуть элемент CDATA
в комментарии JS:
<script type="text/javascript">
//<![CDATA[
-or-
/* <![CDATA[ */
//]]>
-or-
/* ]]> */
</script>
Я рекомендую вторую форму, используя многострочные комментариив этом случае не будет никаких проблем с вашим кодом, если пробел по ошибке по каким-либо причинам будет проанализирован (я видел некоторые Системы управления контентом, которые пропускают переводы строк в их Rich Text Editors).
Еще одно предупреждение с CDATA
элемент CDATA
, как и элемент script
, перестает переносить свое содержимое по первому знаку закрывающего тега (]]>
), поэтому будьте осторожны, чтобы не написать что-то вроде:
lorem = ipsum[dolor[sit]]>amet;
потому что это убьет ваш CDATA
элемент.
Чтобы избежать всех этих проблем, храните ваши скрипты JavaScript во внешних .js
файлах, где они принадлежат, когда это возможно.
Я понимаю, что для простых однострочников может быть предпочтительнее избегать внешнего файла, в этом случае вы должны использовать элемент <![CDATA[ ]]>
или даже HTML экранировать ваш JavaScript.
Issue # 2
Цитата
Строка, которую вы указали для document.write
:
document.write("<script src='links7.js?'+Math.random()+></script>");
, неправильно отформатирована для выполнения чего-либо, кроме определения статической строки <script src='link7.js?'Math.random()+></script>
.
Если вы хотите выполнить Math.random()
, вам нужно иметь строку до и строку после:
'<script src="links7.js?' + Math.random() + '"></script>'
Вы можете заметить, что я поменял местами использование '
и "
.Мне обычно нравится видеть, как "
используется в атрибутах HTML, и ненавидят , когда нужно экранировать \"
литералы, поэтому я использую '
для строковых литералов как можно чаще в JS.
Кроме того, вы должны заметить открывающую и закрывающую цитату для атрибута src
.DOM может дать точное представление о том, когда и где заканчивается атрибут, но не выдвигайте его на тот случай, если это вызовет некоторую поломку в вашем коде.