2011-01-07 12 views
7

Na mojej stronie mam funkcję jQuery, która pobiera dane z innego (zabezpieczonego) serwera zaraz po załadowaniu strony. Korzystanie z połączenia jsonp Obecnie załadować te dane po dokument gotowy imprezy:Sprawdź, czy jQuery jest załadowany, nie używając zdarzenia gotowego dokumentu

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

Co mi się nie podoba w powyższej rozmowy, jest to, że można rzeczywiście jsonp exectued zanim dokument gotowy imprezy, a tym samym spowalnia ładowanie strony. Więc jeśli to jQuery wewnątrz strony (czyli nie przedstawieniu pomocą znacznika script), to poniższy kod działa świetnie i strona ładuje się szybciej:

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

Ale w tym jQuery w każdej stronie jest 23k napowietrznych, które I” Chciałbym tego uniknąć. W jaki sposób mogę przetestować, czy jQuery zostało załadowane i czy tylko wywołuje funkcję initPage() po wczytaniu jquery?

Edycja: Aby być bardziej precyzyjnym, należy wielokrotnie sprawdzać, czy jquery jest załadowany, a następnie exectue zdarzenia. Zadaniem czasomierza może być rozwiązanie ..

Rozwiązanie: Stworzyłem preinit, który sprawdza jQuery. Ładowanie mojej strony nie może być szybsze :). Dziękuję wszystkim!

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); 
       }); 
      }); 
     } 

Odpowiedz

5

myślę, że może po prostu użyć

if (jQuery) { 
    ... 
} 

aby sprawdzić, czy obiekt jQuery istnieje.

Ok, lepiej byłoby:

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

lub

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

EDIT:

Nie martw się o koszty, czy też obiekt jQuery jest załadowany. Jeśli po prostu dołączyć bibliotekę jQuery przy użyciu zwykłego <script src="..."> znacznik, a następnie wykonać kod bez $(document).ready, tak:

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

Będzie ona działać. Część $(document).ready służy tylko do upewnienia się, że DOM został w pełni załadowany zanim spróbujesz zmienić elementy DOM, które nie są jeszcze załadowane. Sama biblioteka jQuery, w tym funkcjonalność Ajax, będzie dostępna od razu.

Teraz, jeśli rozmowa initPage(data) używa DOM, które zakładam, że to robi, ty mógłby umieścić czek na tym, że tak:

<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> 

Jednak nie sądzę, że będzie konieczne w większości sytuacji.

+0

ów prawie to. ale nie wiem, ile czasu zajmie załadowanie jquery. Musiałbym powtórzyć ten czek do momentu załadowania jquery. Mógłbym stworzyć czas, który sprawdza co 10 ms. Ale to nie jest dobre .. – AyKarsi

+1

Ach, czy to masz na myśli? Myślałem, że chciałeś sprawdzić, czy jQuery był w ogóle załadowany. W takim przypadku jestem całkiem pewien, że jquery zakończyło ładowanie przed zamknięciem znacznika '

1

Dopóki umieszczasz znacznik skryptu, który zawiera jQuery powyżej tagu skryptu, który uruchamia twoją funkcję, powinien działać poprawnie.

Owijanie skrypt w ten zamiast funkcji gotowy może pomóc:

(function() { 
    // Your code here 
})(); 
+0

To jest tak samo jak $ (dokument) .ready (function() {}). Tylko skrócona wersja. –

+0

Używam go do uruchamiania funkcji podczas ładowania dokumentu bez dołączonej jQuery. Nie wiedziałem, że jQuery zmienia funkcjonalność tego? – Olical

+0

@Matt To byłoby '$ (function() {...}); :) @ Wolfy87 Jest to przyjemny sposób enkapsulacji kodu, ale niewiele się zmienia. Z drugiej strony uważam, że nasz plakat nie wymaga wielu zmian. –

0

można dodać albo załadować pełną funkcję lub siatki pełną funkcję jak pokazano poniżej, które pomogą Ci zrobić kilka operacji na jqGrid

height : '550', 
    width : '787', 
    loadComplete : function() {} 
    gridComplete:function(){} 
0

hi myślę, że należy najpierw sprawdzić, czy jest jquery i sposób masz zamiar użyć jest zdefiniowana lub nie

if (typeof (jQuery)! = 'Niezdefiniowane' & & typeof ($. Ajax)! = 'Niezdefiniowane') {
// kod będzie tu
}

0

Co ja nie lubię o powyższym rozmowy, jest to, że może faktycznie jsonp być exectued przed dokumentu gotowy zdarzeń

są na pewno o tym ?! należy pamiętać, że nadal mogą mieć obrazy loading..etc
Chyba trzeba użyć:

$(window).load(function() { 
    $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) { 
     initPage(data); 
    }); 
}); 

Link

+0

Rzeczywiście chcę uruchomić jsonp tak wcześnie, jak to możliwe. dokument gotowy oznacza, dom jest gotowy do manipulacji. tak długo jak szanuję dokument gotowy zanim zacznę manipulować, jestem dobry. – AyKarsi

0

używałem footable plugin jQuery. Ten pracował dla mnie:

if ($.fn.footable) 
{...} 

wersja jQuery - 1.9.1 wersja footable - 0,5

Powiązane problemy