PHP / JavaScript. Браузер «загружается» навсегда, даже после завершения загрузки всех ресурсов, плюс проблемы с Opera / Chrome - PullRequest
3 голосов
/ 28 мая 2009

У меня есть страница, которая делает следующее:

  1. Браузер загружает очень простую страницу с допустимым заголовком и телом, содержащим только пару сценарий / текст в качестве содержимого.

  2. В теле есть скрипт (script a), который запускает функцию onLoad. Эта функция динамически включает в себя второй скрипт (скрипт b) и запускает в нем функцию, когда она становится доступной.

  3. Второй скрипт - это файл .js, который выполняет различную работу.

Оба сценария анализируются PHP и используют тип содержимого application / x-javascript.

Теперь у меня все это работает нормально, за исключением пары JS икота. JavaScript не является одним из моих сильных языков, поэтому я надеюсь, что это простые проблемы, и кто-то может указать мне правильное направление.

Задача 1: Если я сделаю простое предупреждение («Вы находитесь в сценарии b»); во втором скрипте все работает как положено. Тем не менее, если я делаю что-то еще, он работает нормально, а затем браузер продолжает указывать, что он загружается вечно. Это цветовая анимация в Firefox или вращающаяся вещь в IE.

Я пытался завершить скрипт по-разному, и, похоже, ничего не помогло. Любая идея, как указать браузеру, что скрипт полностью загружен? Это файл .js, который вынужден анализировать через PHP.

Проблема 2: Второй скрипт вообще не включен ни в Opera, ни в Google Chrome. Отлично работает в FF / IE, кроме проблемы с загрузкой. Кто-нибудь может увидеть, использую ли я что-то, что не совместимо при загрузке второго скрипта?

Спасибо!

Обновление:

Спасибо за ответы. У меня на самом деле есть firebug, поэтому я знаю, что все работает правильно (по крайней мере, в FF). На самом деле я не знаю, что скрипт не работает в Opera / Chrome, но ничего не происходит.

Это довольно много кода = o) Я скопирую реальные ответы из firebug и опубликую их, чтобы вы могли точно увидеть, что это за код. Что касается веб-сервера, закрывающего соединение, я тоже так думал, но мне кажется странным, что если я сделаю сценарий b активированным («что угодно»); он выдаст предупреждение и затем прекратит загрузку, но я делаю все точно так же, но делаю скрипт document.write ('что угодно); он будет загружаться вечно.

Вот скрипты, обновленные, скопированные прямо с сетевой вкладки firebug:

Обратите внимание, что Discoverfire.net является внутренним доменом, поэтому вы ничего не сможете загрузить оттуда ...

Исходная HTML-страница:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Welcome!</title>
    <style>body { font-family:arial; }</style>
    <script language="JavaScript" type="text/javascript" src="http://www.discoverfire.net/analytics/l/a.js">
    </script>
    <script language="JavaScript" type="text/javascript">
        document.onload = Start();
        function Start(){
            TAFKing_version = '1.0';
            TAFKing_lkey = '19-8O-KKA8HV';
            TAFKing_Lander();
        }
    </script>
</head>
<body>
    <noscript>
        Oops!  We can't forward you properly because your JavaScript is turned off.<br /><br />
        <a href='http://www.discoverfire.net/analytics/l/noscript/19-8O-KKA8HV.html'>Please click here to continue.</a>
        <img src='http://www.discoverfire.net/analytics/l/imp/19-8O-KKA8HV.png' border='0' alt='tell a friend' />
    </noscript>
</body>
</html>

** Сценарий A (... a.js): http://www.discoverfire.net/analytics/l/a.js **

function TAFKing_Lander(){

    version = TAFKing_version;
    lkey = TAFKing_lkey;

    var scrb = document.createElement('script');
    scrb.type = 'text/javascript';
    scrb.src = 'http://www.discoverfire.net/analytics/l/b.js?lkey='+lkey+'&version='+version+'&cb=4eohe8e65'
;

    document.getElementsByTagName('head')[0].appendChild(scrb);
    Interval = setInterval("Waiter()", 10);

    return;

}

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

Сценарий B (... b.js): http://www.discoverfire.net/analytics/l/b.js?lkey=19-8O-KKA8HV&version=1.0&cb=4eohe8e65

function TAFKing_LanderB(){
    document.write("there are just a whole bunch of doc.writes here that build a simple table");
}

Ответы [ 2 ]

2 голосов
/ 28 мая 2009

Бьюсь об заклад, это не имеет ничего общего со сценариями, но с веб-сервером. Ваше описание, особенно то, что оно затрагивает многие браузеры, а некоторые из них даже не запускают сценарии, заставляет меня поверить, что веб-сервер не закрывает соединение. Возможно, веб-сервер неправильно обрабатывает запросы HTTP / 1.1 Keep-alive.

Попробуйте использовать Firebug в Firefox. Установите его, включите для своей страницы, перезагрузите страницу и проверьте вкладку «Сеть», что действительно поддерживает соединение открытым.

1 голос
/ 28 мая 2009

Это много кода, чтобы пройти. Вы обязательно должны получить Firebug, чтобы помочь вам диагностировать его. Последняя версия даже покажет вам, когда / если произойдут события загрузки.

Firebug также позволит вам выводить сообщения, просто написав console.log('somevar=',var);, чтобы проверить их значения. Вы даже можете использовать консоль для проверки значения после загрузки страницы, поскольку вы используете глобальное пространство имен.

Вне моей головы, я бы удостоверился, что соединение корректно закрывается в php. Также

document.onload = Start ();

назначит результат Start () для onload, а не для Start, который будет определен позже.

Также window.onload является более совместимым / стандартным.

Возможно, вы захотите сохранить выходные данные ваших js-файлов как outputphpA.js и outputphpB.js, напрямую получить их и посмотреть, отличается ли поведение загрузки Это должно помочь диагностировать, если это проблема php.

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