#javascript
#javascript
Вопрос:
пытаюсь добавить метод math.random() в мое встроенное объявление js, чтобы предотвратить кэширование связанного файла javascript.
Проблема в том, что я продолжаю получать синтаксические ошибки. Я думаю, что я близок, но мои усилия по отладке оказываются тщетными. Код выглядит следующим образом:
<script type="text/javascript">
document.write("<script src='links7.js?' Math.random() ></script>");
</script>
есть предложения?
Ответ №1:
Проблема # 1
Экранирование / кодирование
Когда анализатор 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(amp;quot;amp;<script src='links7.js?' Math.random() amp;>amp;</scriptamp;>amp;quot;);
Но, честно говоря, это очень быстро раздражает.
Лучшим средством экранирования всего содержимого символов в ваших встроенных 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>
Я рекомендую вторую форму, используя многострочные комментарии, чтобы не было никаких проблем с вашим кодом, если пробелы по каким-либо причинам ошибочно обрабатываются (я видел некоторые системы управления контентом, которые переводят новые строки в своих редакторах расширенного текста).
Еще одно предостережение CDATA
: CDATA
элемент, как script
и элемент, перестает переносить свое содержимое при первом знаке его закрывающего тега ( ]]>
) , поэтому будьте осторожны, чтобы не писать что-то вроде:
lorem = ipsum[dolor[sit]]>amet;
потому что это убьет ваш CDATA
элемент.
Чтобы избежать всех этих проблем, храните свои JavaScripts во внешних .js
файлах, где они принадлежат, когда это возможно.
Я понимаю, что для простых однострочников может быть предпочтительнее избегать внешнего файла, и в этом случае вам следует использовать <![CDATA[ ]]>
элемент или даже HTML, экранирующий ваш JavaScript.
Проблема # 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 может дать хорошее представление о том, когда и где заканчивается атрибут, но не нажимайте на него на случай, если это приведет к некоторой поломке в вашем коде.
Комментарии:
1. Ах, я всегда удивлялся, почему все используют строки из двух частей для
</script>
тегов.2. но разве мне не пришлось бы обернуть это в тег script? <script type=»text/javascript»> document.write(«<script src=’links7.js?’ Math.random() ></script> </script>
3. Кроме того, другая проблема с вашим кодом заключается в том, что у вас есть неправильные кавычки в вашей строке, построенной с использованием
document.write
. Убедитесь, что вы используете хороший текстовый редактор с подсветкой синтаксиса, чтобы вы могли видеть, когда вы правильно экранировали строку, а когда нет.4. Я думаю, что это должно быть что-то вроде этого, потому что я получаю ошибки синтаксического анализа с другими предложениями.
5. Это потрясающе. Устранены синтаксические и синтаксические ошибки. Спасибо за информацию. Очень признателен.
Ответ №2:
Шаг за шагом:
начните с того, как вы хотите, чтобы код выглядел:
<script src="links7.js?89736459827345"></script>
Затем поместите его в литеральную строку:
'<script src="links7.js?89736459827345"></script>'
Изолируйте случайную часть в отдельной строке:
'<script src="links7.js?' '89736459827345' '"></script>'
Замените случайную часть случайным выражением:
'<script src="links7.js?' Math.random() '"></script>'
Поместите что-нибудь в закрывающий тег сценария, чтобы он не мешал тегу сценария, в который он войдет:
'<script src="links7.js?' Math.random() '"></scr' 'ipt>'
Поместите его в document.write
вызов:
document.write('<script src="links7.js?' Math.random() '"></scr' 'ipt>');
И тег script вокруг него:
<script type="text/javascript">
document.write('<script src="links7.js?' Math.random() '"></scr' 'ipt>');
</script>
Ответ №3:
У вас проблема с открытыми / закрытыми кавычками. Попробуйте:
document.write("<script src='links7.js?" Math.random() "'></script>");
Ответ №4:
<script type="text/javascript">
document.write("<script src='links7.js?" Math.random() "'></script>");
</script>
Предложение: используйте IDE с подсветкой кода.