.ready () срабатывает после window.beforeunload - PullRequest
3 голосов
/ 12 октября 2010

У нас есть несколько мест, где мы включаем встроенные блоки <script>, которые запускают код, обернутый $(document).ready().Некоторые из этих блоков используют методы, зависящие от других внешних сценариев.Во время обычного выполнения страницы этот метод работает нормально, но когда пользователь уходит со страницы до того, как она полностью загрузится, запускается событие $(document).ready(), и IE выдает "Object does not support this property or method" ошибок влево и вправо.

Через некоторыеВ ходе тестирования я обнаружил, что событие window.beforeunload запускается до любого из событий ready, поэтому я хотел бы иметь возможность предотвратить запуск событий ready в этот момент.В идеале я хотел бы иметь решение, которое обобщает, поэтому мне не нужно изменять весь встроенный код.

Если это невозможно, предложите обернуть весь встроенный код в блоки try-catch,определить, все ли внешние скрипты были загружены перед выполнением встроенного кода и т. д.

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Закончилось следующим решением:

<script type="text/javascript">
 window.onbeforeunload = function(){
  $.readyList = null;
 }
</script>

Он немного более хакерский, чем я бы предпочел, но он выполняет свою работу.

1 голос
/ 12 октября 2010

Встроенные скрипты не должны передаваться повсюду, если плагины загружаются после факта.

Лучший способ, IMO, настроить ваши страницы следующим образом:

<html>
    <head>
        <title></title>
    </head>
    <body>
        <div id="content">
        </div>
        <script src="jquery.js"></script>
        <script src="jquery.customerPlugins.js"></script>
        <script>
            $(function(){
               // all inline would go here!
            });
        </script>
        <script src="main.js"></script>
    </body>
</html>

Но если это не вариант, вы могли бы (но, вероятно, не должны) (непроверенный код ниже):

<html>
    <head>
        <title></title>
        <script src="jquery.js"></script>
        <script>
            var readyQueue = [];
        </script>
    </head>
    <body>
        <script>
            readyQueue.push(function(){
               $("body").append("<div />").customPlugin();
            });
        </script>
        <div id="content">
            <script>
                readyQueue.push(function(){
                   $("#content").customPlugin();
                });
            </script>
        </div>
        <script src="jquery.customPlugins.js"></script>
        <script>
            // do something like this...
            $(function(){
               var fn;
               while(fn = readyQueue.shift()){
                   fn();
               }
               // if you want to continue to use readyQueue in code 
               // below/after this you could do something like the following:
               readyQueue = {"push": function(fn){
                   fn();
               })};
               // this would execute immediately:
               readyQueue.push(function(){
                   alert('Hello');
               });
            });
        </script>
        <script src="main.js"></script>
    </body>
</html>

Пока вы это делаете, проверьте html5boilerplate.com .

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