версия jquery - 1.9.1, версия footable - 0.5

ем сайте есть функция jquery, которая извлекает данные с другого (защищенного) сервера сразу после загрузки страницы. Используя вызов jsonp, я загружаю эти данные после события готовности документа:

<script type="text/javascript">
    $(document).ready(function () {
       $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
            initPage(data);
        });
    });
</script>

Что мне не нравится в приведенном выше вызове, так это то, что jsonp может быть запущен до события готовности документа, тем самым замедляя загрузку страницы. Так что, если я включаю jquery внутри страницы (т.е. не ссылаясь на тег script), то следующий код прекрасно работает, и страница загружается быстрее:

<script type="text/javascript">
    $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
        $(document).ready(function () {
            initPage(data);
        });
    });
</script>

Но включение jquery в каждую страницу - это лишние 23 КБ, которых я бы хотел избежать. Как я могу проверить, был ли загружен jquery, и только исключительная функция initPage (), когда был загружен jquery?

Редактировать: чтобы быть более точным, мне нужно несколько раз проверить, загружен ли jquery, а затем выполнить событие. Таймер работа может быть решением ..

Решение: я создал preinit, который выполняет проверку jquery. Загрузка моей страницы не может быть быстрее :). Всем спасибо!

   function preInit() 
   {
       // wait until jquery is loeaded
       if (!(typeof jQuery === 'function')) {
           window.setTimeout(function () {
               //console.log(count++);
               preInit();
           }, 10);  // Try again every 10 ms..
           return;
       }
           $.getJSON(_secureHost + '/base/members/current.aspx?callback=?',
            function (data) {
                $(document).ready(function () {
                    initPage(data);
                });
            });
       }

Ответы на вопрос(2)

который включает в себя jQuery, над тегом script, который выполняет вашу функцию, он должен работать нормально.

Обертывание вашего скрипта вместо функции готовности может помочь:

(function() {
    // Your code here
})();
 Spiny Norman07 янв. 2011 г., 10:32
@Matt Это было бы$(function() {...}); :) @ Wolfy87 Это хороший способ инкапсуляции кода, но он мало что меняет. Опять же, я не думаю, что наш плакат нуждается в большом изменении.
 Sondre07 янв. 2011 г., 10:32
Я думаю, что Мэтт ошибочно принимает его за $ (function () {// code}); что является сокращением jQuery для document.ready
 Olical07 янв. 2011 г., 10:27
Я использую его для запуска функций, когда документ загружается без jQuery. Я не знал, что jQuery меняет функциональность этого?
 Matt Asbury07 янв. 2011 г., 10:23
Это то же самое, что и $ (document) .ready (function () {}). Просто сокращенная версия.
 Olical07 янв. 2011 г., 10:33
@ Spiny Norman Хороший вопрос, я думаю, что он будет работать сам по себе, я не уверен, что он нуждается в / any / инкапсуляции.
Решение Вопроса

Я думаю, что вы могли бы просто использовать

if (jQuery) {
   ...
}

чтобы увидеть, существует ли объект jQuery.

Ок, лучше бы:

if (typeof jQuery !== 'undefined') {
   ...
}

или же

if (typeof jQuery === 'function') {
   ...
}

РЕДАКТИРОВАТЬ:

Не беспокойтесь о накладных расходах или о том, загружен ли объект jQuery. Если вы просто включите библиотеку jQuery с помощью обычного<script src="..."> тег, а затем выполнить свой код без$(document).ready, нравится:

<script type="text/javascript">
   $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
        initPage(data);
    });
</script>

Это будет работать.$(document).ready Это только для того, чтобы убедиться, что DOM полностью загружен, прежде чем вы попытаетесь изменить элементы DOM, которые еще не загружены. Сама библиотека jQuery, включая функциональность Ajax, будет тут же.

Теперь, если вашinitPage(data) Вызов использует DOM, который я предполагаю, вымог поставьте галочку, вот так:

<script type="text/javascript">
    function initPage(data) {
        var $domObject = $('#your-dom-object');
        if ($domObject.length === 0) { // Dom object not loaded yet.
            window.setTimeout(function() {
                initPage(data);
            }, 0); // Try again after other stuff has finished.
            return;
        }
        // Do your regular stuff here.
    }
</script>

Однако я не думаю, что это было бы необходимо в большинстве ситуаций.

 Spiny Norman07 янв. 2011 г., 10:44
Ну вот. Я думаю, что это больше, чем вы хотите сделать, хотя я все еще думаю, ягни.
 AyKarsi07 янв. 2011 г., 11:30
таймер был путь!
 AyKarsi07 янв. 2011 г., 10:22
это почти это. но я не знаю, сколько времени потребуется, чтобы загрузить jquery. Мне придется повторять эту проверку, пока не загрузится jquery. Я мог бы создать время, которое проверяет каждые 10 мс или около того ... Но это нехорошо ...
 Spiny Norman07 янв. 2011 г., 10:28
Ах, это то, что вы имеете в виду? Я думал, вы имели в виду, что вы хотите проверить, был ли загружен jQuery. В этом случае я уверен, что jquery завершит загрузку к тому времени, как вы выйдете из<script src="jquery.js"> тег. Итак, просто удалите$(document).ready(function () { ... }); вокруг вашего$.getJSON позвони и у тебя все будет хорошо.

Ваш ответ на вопрос