Почему этот Javascript не работает с Opera или Chrome? - PullRequest
4 голосов
/ 07 июня 2009

Спасибо за чтение.

У меня есть несколько скриптов, которые скомпилированы следующим образом:

scriptone.js

function FunctionOne(){

    // Do a bit of work...

    // Include a second javascript file, scripttwo.js
    // that contains a function called FunctionTwo.js
    var scrb = document.createElement('script');
    scrb.type = 'text/javascript';
    scrb.src = 'http://www.example.com/scripttwo.js?bunchofargs=varied';

    // Append it to the head.
    document.getElementsByTagName('head')[0].appendChild(scrb);

    // Can't run the second function directly, because it may not be loaded quite yet,
    // So use the Waiter function.
    Interval = setInterval("Waiter()", 10);

    // All done.
    return;

}

function Waiter(){
    if(window.FunctionTwo) {
        clearInterval(Interval);
        FunctionTwo();
    }
}

scripttwo.js

function FunctionTwo(){
    document.write('something based on calling page');
}

Это прекрасно работает с FF и IE, но не с Opera или Chrome. В Chrome / Opera, кажется, все работает нормально в первом сценарии. Однако ничего, что должно происходить в scripttwo.js, на самом деле не происходит. Это как если бы scripttwo.js не был включен.

Есть идеи, почему это не работает с Opera или Chrome?

Возможно, я использую что-то несовместимое или есть функции безопасности, о которых я не знаю? Все файлы находятся в одном домене.


Примечание Отличные ответы - большое спасибо!

FuncionOne - это просто опечатка, в настоящем коде я использую более подходящие имена функций, но я изменил их здесь для удобства чтения. Это может быть масштаб, хотя я согласен с Джо Уайтом, что это не должно быть проблемой. С JavaScript (один из моих слабых языков), кто знает? FunctionOne вызывается из заголовка или текста HTML-документа.

Мне также нравится идея добавить FuncTwo в конец второго скрипта, чтобы вообще избежать таймера. Чище и так очевидно, как только кто-то указывает вам на это ...

Я обновлюсь после того, как поработаю над этим следующим.

Обновите снова:

Привет всем,

У меня теперь он работает в FF, IE и Chrome, но Opera, похоже, вообще отказывается загружать любые файлы .js. Я думаю, что это просто какая-то проблема с Opera ( Opera: файл .js не загружается ), и он будет работать с остальными тремя Дайте вам знать, как это получается.

Ответы [ 4 ]

3 голосов
/ 08 июня 2009

у меня в Опере работает ..

Вместо использования скрипта Waiter вы можете использовать событие:

scrb.onload = function() { FunctionTwo() }
scrb.onreadystatechange = function() { FunctionTwo() }

Вторая строка для работы Internet Explorer. Проблема в том, что Opera, похоже, обрабатывает оба этих события, поэтому FunctionTwo () будет выполняться дважды. Есть разные способы обойти это. Обнаружение браузера, некоторая глобальная переменная и т. Д.

2 голосов
/ 07 июня 2009

Вы могли бы просто добавить FunctionTwo () в конец scripttwo.js. Затем он будет запускаться при загрузке без дополнительной сложности интервала.

1 голос
/ 08 июня 2009

Думаю, проблема в области действия Interval. Он определен внутри FunctionOne, но не в глобальной области видимости. Итак, я подозреваю, что когда дело доходит до выполнения Waiter, Opera и Chrome обнаруживают, что Interval равен undefined и просто молча выпадает из FunctionTwo (может, останавливает скрипт?) FF и IE могут просто игнорировать это.

(Кстати, что clearInterval должен делать канонически, когда получает неопределенное значение параметра?).

1 голос
/ 07 июня 2009

Некоторые вопросы / комментарии, которые могут дать вам ответ:

  • Что называет FuncionOne (обратите внимание на ваше написание)?

  • Таймеры грязные и не всегда рекурсируют (стреляют снова, если не остановлены). Я бы реорганизовал Waiter(), чтобы проверить, что Interval все еще существует, и если нет, создайте рекурсив window.setInterval.

  • В этой заметке может потребоваться явно указать window.setInterval, не пропуская window.

  • Работает ли область действия Interval? Вы определяете это внутри функции. Традиционная логика гласит, что clearInterval(Interval); в Waiter() не будет иметь доступа ... Но JS немного грязный, как это. Opera и Chrome могут быть немного менее грязными, чем вы ожидаете. Простое определение его вне какой-либо области действия должно исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...