Функция Javascript недоступна при динамическом написании сценария - PullRequest
2 голосов
/ 11 марта 2010

, поэтому у меня есть внешний файл javascript, давайте назовем его something.js и я document.write его в документе. По какой-то причине я не могу получить доступ к функции в Safari или FireFox.

Это выглядит примерно так:

<script type="text/javascript">
    document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
    myFunction();
</script>

, так что это говорит о том, что myFunction имеет значение null, но если я добавлю тот же самый вызов функции в конец чего-то .js, это сработает. Сейчас это не точный сценарий, поэтому я знаю, что в данном конкретном случае это не лучший способ сделать это.

Ответы [ 7 ]

3 голосов
/ 11 марта 2010

Вот как я это делаю:

<script type="text/javascript" language='javascript'>
  document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="something.js"><\/script>');
  var contentloadtag=document.getElementById("contentloadtag");
  contentloadtag.onreadystatechange=function(){
    if (this.readyState=="complete") { myFunction(); }
  }
</script>

Действительно, это имеет смысл только во время загрузки страницы. Если вы неоднократно загружаете скрипт динамически, вы, вероятно, захотите использовать другой подход, а именно JSONP.

2 голосов
/ 11 марта 2010

Я думаю, это происходит потому, что myFunction(); вызывается до того, как весь файл .js, содержащий его, загружен в браузер, попробуйте отложить myFunction(); вызов на несколько секунд и повторите тест, чтобы убедиться, что это проблема. *

0 голосов
/ 29 июня 2010

Самый простой способ сделать это - написать два блока.

<script type="text/javascript">
    document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
    myFunction();
</script>

Когда используется document.write , текст записывается непосредственно в документ, сразу после тега . По этой причине, когда браузер обнаруживает тег , он ожидает завершения загрузки скрипта, прежде чем продолжить работу по странице. Любой document.write , который происходит в загруженном скрипте, может повлиять на остальную часть страницы (например, если вы выполните «document.write ('

')», это повлияет на остальную часть макет).

Итак, если вы используете два тега , первый обнаруживается браузером и использует document.write для вывода нового тега . Как только этот тег будет завершен, браузер продолжит просмотр страницы и сразу же обнаружит новый динамически добавленный тег . Этот тег указывает браузеру загрузить внешний Javascript. Браузер будет ожидать выполнения второго оригинального тега , пока этот тег не завершит загрузку. Тогда ваша функция myFunction будет доступна.

Причина, по которой все это выполняется в одном теге , не работает, потому что document.write не происходит до тех пор, пока не закончится работа ( myFunction пока недоступно). Причина, по которой он работает с двумя тегами , заключается в том, что браузер ожидает, пока каждый тег не будет запущен подряд, а document.write помещает новый тег в строку.

0 голосов
/ 11 марта 2010

Это работает?

<script type="text/javascript">
document.write(unescape("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
document.write("<"+"script type='text/javascript>myFunction();<"+"/script>");
</script>
0 голосов
/ 11 марта 2010

Я бы обычно не писал два отдельных ответа, но это совсем другой ответ, с такой же вероятностью это сработает. Позвоните на something_ready() внизу чего-нибудь .js. Не определяйте something_ready() в нечто .js, определите это в вашем HTML-документе.

Так что нет таймеров, нет ненужных проверок.

    <script type="text/javascript">
        document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));

        function something_ready(){
            myFunction();
        }
    </script>

Это сработает, это просто предполагает, что у вас есть доступ к нечто .js, чего у вас нет. Если нет, другой ответ, который я предоставил, будет работать.

0 голосов
/ 11 марта 2010
  1. Поместите свой динамический script блок в head вашего документа (если это не так уже есть)
  2. Удалить звонок myFunction().
  3. поставить myFunction() звонить в другой script блок где-то ниже документ.

Шаг 1 - это лучшая практика, но я не думаю, что какой-либо браузер захлебнется, если вы динамически включите файл JS в какой-то другой пункт в документе.

Ключевым моментом является то, что вы не можете использовать включенный код JS из того же блока скрипта, который выполняет включение.

Это работает в Firefox, я не могу поручиться за Safari.

<html>
    <head>
        <script type="text/javascript">
            document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
        </script>
    </head>
    <body>
        <script type="text/javascript">
            myFunction();
        </script>
    </body>
</html>
0 голосов
/ 11 марта 2010

После печати тега включения сценария с использованием document.write браузер продолжает выполнение (пытаясь вызвать myFunction()) до загрузки внешнего сценария. Итак, ваш скрипт еще не доступен.

...