2012-03-10 3 views
-2

В принципе у меня есть в моем вебсайте script.js, что делает это:Почему document.write не дожидаясь загрузки?

if (someVar){ 
    document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>'); 
} 

Теперь я хотел бы атаковать некоторое поведение:

if (someVar){ 
    document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>'); 

    $(document).ready(function(){ 
    //> Do stuff 
    }); 
} 

Но я получил необъявленную функцию $ в консоли

+0

Почему обратная косая черта? –

+0

иначе браузер перестает читать скрипт.js –

+0

Разве вы не окружаете блок 'script' с помощью' CDATA' или комментария HTML? Лучше всего будьте осторожны с * всем *, который выглядит как объект HTML, а затем ... –

ответ

2

document.write записывает заданную строку после вызова скрипта. Если вы хотите привязать к $(document).ready(), вы можете переместить эту часть кода в отдельный файл, который включен в fter файл с функцией document.write.

+0

это идеальное объяснение .. – dynamic

1

document.write не осведомлен о содержании; то есть, если вы используете его для добавления элемента <script> на страницу, он не будет ждать, пока содержимое этого элемента будет загружено и выполнено до продолжения.

Если вы хотите, чтобы динамически загружать библиотеку JavaScript с обратным вызовом, то я предлагаю использовать Request.js или аналогичную библиотеку, которая позволит вам достичь своих целей, как это:

require(["jquery"], function($) { 
    $(function() { 
     alert('ready'); 
    }); 
}); 
+0

Единственный точный _and_ полезный ответ. –

0

document.write фактически переписывает источник вашего документа. По этой причине вы НИКОГДА не должны его использовать.

Надлежащим образом прикрепить тег сценария, как это:

jqueryScript = document.createElement('script'); 
jqueryScript.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'); 
document.body.appendChild(jqueryScript); 
//do your jquery stuff 

Больше чтения о том, почему вы никогда не должны использовать document.write: Why is document.write considered a "bad practice"?

+3

Ваше мнение о 'document.write' не решает проблему. И он не перезаписывает источник, если он вызван при загрузке страницы, что и делается здесь. Как вы добавляете скрипт, он будет асинхронным, поэтому ваш «материал jQuery» должен быть в обратном вызове вместо того, чтобы просто помещаться после 'appendChild()'. –

+0

Просто для записи, я не высказываю свое мнение по document.write. Я заявляю, что принята лучшая практика. Если вы дадите document.write какую-либо часть ответа на собеседование, ожидайте, что вы не получите эту работу. Если бы не вопрос: «Какой метод javascript вы никогда не должны использовать, если только у кого-то не была ваша бабушка под прицелом?» –

+0

О, добро. * * Это может быть неправильно использовано/неправильно понято, поэтому никогда не используйте его »* менталитет просто глупо. Хорошее применение. Независимо от вашего мнения о 'document.write', ваше решение по-прежнему не решает проблему. Он представит ту же проблему '' '' 'undefined'. –

-1

Внешний скрипт не блокирует код, JQuery не доступен немедленно. Вам необходимо сделать это:

<script> 
if (someVar){ 
   document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>'); 
} 
</script> 
<script> 
If (someVar){ 
  $(document).ready(function(){ 
     //> Do stuff 
  }); 
} 
</script> 
Смежные вопросы