Diğer her şey yüklenene kadar bir jquery betiğini geciktirme


112

Bir jquery betiğim var ve sayfadaki diğer javascript'ler de dahil olmak üzere (üzerinde hiçbir kontrolüm olmayan) işlerini bitirdikten sonra yalnızca bir kez çalıştırmam gerekiyor.

Belki de $ (document) seçeneğinin bir alternatifi olduğunu sanıyordum. Zaten ama bulamadım.

Yanıtlar:


217

$(document).ready()Bir sayfada birden çok kez olabilir . Kod göründüğü sırada çalıştırılır.

$(window).load()Etkinliği kodunuz için kullanabilirsiniz, çünkü bu, sayfa tamamen yüklendikten ve çeşitli $(document).ready()işleyicilerdeki tüm kodun çalışması bittikten sonra gerçekleşir.

$(window).load(function(){
  //your code here
});

1
Bu yöntemi kullanarak harici komut dosyalarını içe aktarabilir miyim?
chrism

1
Elbette, bunu zaten $ (document) .ready () içinde yapıyorsanız, bu farklı olmayacak.
Jose Basilio

7
Bu cevap benim için faydalı oldu çünkü jquery kodunun sırayla çalıştırıldığını fark etmemiştim
Sevenearths

1
Çok teşekkür ederim! Bu, sayfa (görünüşe göre) henüz yüklenmediği için doğru yüksekliği almadığı .height () sorunumu düzeltti.
Jon

6
JQuery 3.0'da, $(window).on('load', function() { });$ (window) .load () kullanımdan kaldırıldığı için sözdizimini kullanmanız gerekir .
Alex H

13

Bu kod bloğu sorunumu çözüyor,

<script type="text/javascript">
  $(window).bind("load", function () {
    // Code here
  });
</script>


JQuery'nin zaten yüklü olup olmadığını görmek için bir jQuery işlevini nasıl çalıştırabilirsiniz? Bu, yalnızca jQuery kontrolden önce yüklendiğinde çalışır.
HelpNeeder

11

$(document).ready()Sayfanın yukarıdan aşağıya doğru sıralanması için birden çok sayıda tetiklenir . Sonuncusu $(document).ready()sayfada en son ateşlenecektir. Sonuncusunun içinde, $(document).ready()diğerlerinin ardından yeni bir özel olayı tetikleyebilirsiniz.

Yeni özel etkinlik için kodunuzu bir olay işleyicisine sarın.

<html>
<head>
<script>
    $(document).on("my-event-afterLastDocumentReady", function () {
        // Fires LAST
    });
    $(document).ready(function() {
        // Fires FIRST
    });
    $(document).ready(function() {
        // Fires SECOND
    });
    $(document).ready(function() {
        // Fires THIRD
    });
</script>
<body>
... other code, scripts, etc....
</body>
</html>

<script>
    $(document).ready(function() {
        // Fires FOURTH
        // This event will fire after all the other $(document).ready() functions have completed.
        // Usefull when your script is at the top of the page, but you need it run last
        $(document).trigger("my-event-afterLastDocumentReady");
    });
</script>

3

Gönderen burada :

// Add jQuery 
var GM_JQ = document.createElement('script'); 
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript'; 
document.getElementsByTagName('head')[0].appendChild(GM_JQ); 

// Check if jQuery's loaded 
function GM_wait() 
{ 
    if(typeof unsafeWindow.jQuery == 'undefined') 
    { 
        window.setTimeout(GM_wait,100); 
    } 
    else 
    { 
        $ = unsafeWindow.jQuery; 
        letsJQuery(); 
    } 
} 

GM_wait(); 

// All your GM code must be inside this function 
function letsJQuery() 
{
    // Do your jQuery stuff in here    
} 

Bu, kullanmak için jQuery yüklenene kadar bekleyecektir, ancak aynı konsepti kullanarak diğer komut dosyalarınızdaki değişkenleri ayarlayabilir (veya komut dosyanız değilse onları kontrol ederek) onları kullanmak için yüklenene kadar bekleyebilirsiniz.

Örneğin, sitemde bunu eşzamansız JS yüklemesi ve jQuery kullanarak onlarla herhangi bir şey yapmadan önce bitene kadar beklemek için kullanıyorum:

<script type="text/javascript" language="JavaScript"> 
    function js(url){
        s = document.createElement("script");
        s.type = "text/javascript";
        s.src = url;
        document.getElementsByTagName("head")[0].appendChild(s);
    }       

    js("/js/jquery-ui.js");
    js("/js/jrails.js");
    js("/js/jquery.jgrowl-min.js");
    js("/js/jquery.scrollTo-min.js");
    js("/js/jquery.corner-min.js");
    js("/js/jquery.cookie-min.js");
    js("/js/application-min.js");

    function JS_wait() {
        if (typeof $.cookie == 'undefined' || // set in jquery.cookie-min.js
            typeof getLastViewedAnchor == 'undefined' || // set in application-min.js
            typeof getLastViewedArchive == 'undefined' || // set in application-min.js 
            typeof getAntiSpamValue == 'undefined') // set in application-min.js
        { 
            window.setTimeout(JS_wait, 100); 
        }
        else 
        { 
            JS_ready(); 
        }
    }

    function JS_ready() {
        // snipped
    };

    $(document).ready(JS_wait);
</script> 

Bu yalnızca jQuery yüklenene kadar bekleyecek ve sayfanın diğer özelliklerini göz ardı edecektir. @Require direktifini desteklemeyen greasemonkey'in eski sürümleri için yapılan bir hacklemeden başka bir şey değildir.
Cheekysoft

1
Kodumu, diğer kod yüklenene kadar beklemek için jQuery ile aynı kavramı nasıl kullandığımın bir örneği olarak ekledim.
Chris Doggett

1

Javascript çerçevelerinin tuhaf bir karışımı nedeniyle, diğer çerçevelerden birinin sağladığı bir olay dinleyicisini kullanarak komut dosyasını başlatmak zorunda kaldım.


4
Bir çözüm bulduğunuza sevindim, ancak cevabınız daha fazla ayrıntı olmadan başkaları için yararlı değil ...
Andrew

1

En $().readyson istediğiniz jQuery işlevini çalıştırarak tüm başlatma işlevlerini yüklemeyi denediniz mi?

Belki kullanabilirsiniz setTimeout()üzerinde$().ready size yük istediğini işlevselliği çağırarak, çalıştırmak istediğini fonksiyonu.

Veya, setInterval()diğer tüm yükleme işlevlerinin tamamlanıp tamamlanmadığını görmek için aralık kontrolünü kullanın ve kontrol ettirin (durumu bir boole değişkeninde saklayın). Koşullar karşılandığında aralığı iptal edebilir ve yükleme işlevini çalıştırabilirsiniz.


Bununla ne demek istediğinden emin değilim. Tüm komut dosyalarını bir jquery betiği aracılığıyla içe aktarmamı ve betiğimi en sona koymamı mı öneriyorsunuz? Öyleyse bu neye benzerdi (Ben ticaretle tasarımcıyım, bu yüzden büyük kelimeler kullanmayın :))
chrism

$ (belge) .ready (function () {callLoadFunction1 (); callLoadFunction2 (); calljQueryLoadFunction ();});
Richard Clayton

diğer komut dosyalarının tümü harici dosyalardır, bu yüzden bunun işe yarayacağından emin değilim, değil mi?
chrism

@chrism: İkinci örneğime bakın. Herhangi bir şey yapmadan önce diğer harici JS dosyalarının yüklendiğini gösteren değişkenler ayarlanana kadar bekler. JS_ready () yöntemime son olarak çalıştırmak istediğiniz kodu koydunuz. Tam olarak aradığınız şeyi yapar.
Chris Doggett

2
Sadece kullanın$(window).load(function(){...})
Ryan Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.