Birden fazla $ (document) .ready (function () {…}) olabilir mi; bölümler?


240

Başlangıçta çok fazla fonksiyonum varsa, hepsi tek bir altında olmak zorunda mı:

$(document).ready(function() {

veya bu tür birden fazla ifadem olabilir mi?


1
Özellikle her biri $ (belge) .ready () içeren birden fazla js dosyası yüklemeniz gerektiğinde gerekli. işlevi
Abdillah

@leora Bu soru bir röportajda soruldu: D Teşekkürler
eirenaios

Yanıtlar:


288

Birden fazla olanınız olabilir, ancak her zaman yapılacak en iyi şey değildir. Okunabilirliği ciddi şekilde etkileyeceğinden, onları fazla kullanmamaya çalışın. Bunun dışında tamamen yasal. Aşağıya bakın:

http://www.learningjquery.com/2006/09/multiple-document-ready

Şunu deneyin:

$(document).ready(function() {
    alert('Hello Tom!');
});

$(document).ready(function() {
    alert('Hello Jeff!');
});

$(document).ready(function() {
    alert('Hello Dexter!');
});

Bunun buna eşdeğer olduğunu göreceksiniz, yürütme sırasına dikkat edin:

$(document).ready(function() {
    alert('Hello Tom!');
    alert('Hello Jeff!');
    alert('Hello Dexter!');
});

Ayrıca, bir $(document).readyblok içinde tanımlanan bir fonksiyonun başka bir bloktan çağrılamayacağını da belirtmek gerekir $(document).ready, sadece bu testi çalıştırdım:

$(document).ready(function() {
    alert('hello1');
    function saySomething() {
        alert('something');
    }
    saySomething();

});
$(document).ready(function() {
    alert('hello2');
    saySomething();
}); 

çıktı:

hello1
something
hello2

25
Birden fazla $ (document) .ready () ifadesi kullanırken yürütme sırasına güvenmek akıllıca değildir. Her birinin daha önce idam edilmiş ya da yapılmamış diğerlerinden bağımsız olarak yürütmesi gerekmektedir.
James

@AoP - Sırayla yürütülmezlerse, ne kadar mantıklı olduğunu bilmiyorum, o zaman uygulama bağlamında tamamen anlamsız, bu yüzden birden fazla $ (belge) .ready kullanarak (bloklar tamamen kırılacaktı).
karim79

7
@ karim79 şüphesiz bu (OP'nin sorusu), birden çok başlangıç ​​endişesi olan karmaşık bir kod parçası yazarken geçerlidir - yani yükleme tamamlandığında her zaman çalıştırılan bazı kodlar ve bazıları yalnızca bazı içerik düğümlerinde gerekli olan? Böyle bir durumda, bağlam silolanmış ve yürütme sırası önemsiz olmalıdır - 'DOM için hazır' olayına öncekinin üzerine yazmadan atayabilmek, sipariş davranışından bağımsız olarak yararlı bir özellik haline gelir.
tehwalrus

1
Bir hazır blokta tanımlanan bir fonksiyonla ilgili olarak başka bir hazır bloktan çağrılabilir olmama durumu - bu, fonksiyonu tanımladığınız şekilde doğrudur, ancak bunun yerine saySomething = function () {} olarak tanımladıysanız, onu çağırabilirsiniz. Tuhaf, değil mi? jsfiddle.net/f56qsogm burada test edin.
ferr

2
Küresel olarak erişilebilir pencere nesnesine işlev ekliyor çünkü bence böyle davranıyor. Aksi takdirde, bu hazır işleve yerel olarak dahil edilen bir bildirim işlevidir.
ferr

19

Birden çok kullanabilirsiniz. Ancak bir belgenin içinde birden fazla işlev de kullanabilirsiniz. Zaten:

$(document).ready(function() {
    // Jquery
    $('.hide').hide();
    $('.test').each(function() {
       $(this).fadeIn();
    });

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});

Sayfaya ekli kod üzerinde tam denetime sahipseniz bu sorun olmaz. Birisi bunu sayfaya eklenmiş başka bir dosyaya zaten yazdıysa, bunu böyle beyan etmeye hazırsınız.
James Wiseman

Ne söylemeye çalıştığından emin değilim. Ancak bunu kafanıza koyarsanız ve başka 15 harici JS eklerseniz, hepsi bir (veya birden fazla belge.yükleme) içerir, yine de sadece bir tane gibi çalışır. Her fonksiyonun / değişkenin kepçesinin $ (document) .ready-fonksiyonunun kapanış paranteziyle bittiği belirtilmelidir.
Mickel

2
Sadece diğer halkın, belgeye hazır işlevi önceden bildirilmiş olan sayfaya eklenmiş yazılı modüller içerdiğini söylemeye çalıştığımız için, tüm kodunuzu tek bir işleve taşıma lüksüne sahip olamayabilirsiniz (ki bu, ideal olur) ). Bununla birlikte, kodun bakımını eşit derecede zorlaştırabileceğimiz On Ready Bloating'i alacağımız için burada çok fazla şeye sahip olmaktan da dikkatli olacağım.
James Wiseman

1
Ah, şimdi anlıyorum. Evet, buna katılıyorum. Sadece bunun mümkün olduğunu kanıtlamak için bir örnek belirtti;)
Mickel

15

Evet, kolayca birden fazla bloğunuz olabilir. Değerlendirme sırası beklediğiniz gibi olmayabileceğinden, aralarındaki bağımlılıklara dikkat edin.


11

Evet , birden fazla $ (belge) .ready () çağrısı yapmak mümkündür. Ancak, hangi yolla infaz edileceğini bildiğinizi sanmıyorum. (kaynak)


14
eklenen sipariş eklendi
redsquare

Teşekkürler, bunu açıklığa kavuşturmak iyidir, çünkü - konuyla ilgili genel bilgeliğe rağmen - jQuery ready () sayfası (yazarken :) yapıp yapamayacağınızı gerçekten söylemez. Bununla birlikte , bir cümlenin satırları arasında okursanız, bu bir tür Tamam anlamına gelir:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit


3

Evet, mükemmel tamam. Ama bir sebep olmadan yapmaktan kaçının. Örneğin, javascript dosyalarım dinamik olarak oluşturulduğunda global site kurallarını ayrı sayfalardan ayrı olarak bildirmek için kullandım, ancak tekrar tekrar yapmaya devam ederseniz okumayı zorlaştıracaksınız.

Ayrıca bazı yöntemlere başka bir yöntemden erişemezsiniz. jQuery(function(){}); çağrıdan bu yüzden bunu yapmak istememenizin başka bir nedeni.

Eski ile window.onloadolsa da, bir işlev her belirlediğinizde eskisini değiştireceksiniz.


2

Evet yapabilirsin.

Birden çok belgeye hazır bölüm, özellikle onu kullanan aynı sayfadan çıkmış başka modülleriniz varsa kullanışlıdır. Eski window.onload=funcdeklarasyonda, çağırılacak bir işlevi her belirlediğinizde, eskisinin yerini alır.

Şimdi belirtilen tüm işlevler, hangi belge hazır bölümünde belirtildiklerinden bağımsız olarak sıraya alınır / istiflenir (biri onaylayabilir mi?).


Evet, doğrudur, işlevler önceki $ (belge) .ready işlevlerini değiştirmekten daha sıraya girmiştir.
Deeksy

2

Ben gitmek için en iyi yolu adlandırılmış işlevlere geçiş yapmak olduğunu düşünüyorum (bu konuda daha fazla bilgi için bu taşma kontrol edin) . Bu şekilde onları tek bir olaydan arayabilirsiniz.

Şöyle ki:

function firstFunction() {
    console.log("first");
}

function secondFunction() {
    console.log("second");
}


function thirdFunction() {
    console.log("third");
}

Bu şekilde, bunları tek bir hazır fonksiyona yükleyebilirsiniz.

jQuery(document).on('ready', function(){
   firstFunction();
   secondFunction();
   thirdFunction();

});

Bu, console.log dosyasına aşağıdakileri çıktılar:

first
second
third

Bu şekilde işlevleri diğer etkinlikler için yeniden kullanabilirsiniz.

jQuery(window).on('resize',function(){
    secondFunction();
});

Çalışan sürüm için bu kemanı kontrol edin


0

Yasaldır, ancak bazen istenmeyen davranışlara neden olur. Örnek olarak, MagicSuggest kütüphanesini kullandım ve projemin bir sayfasına iki MagicSuggest girişi ekledim ve girişlerin her başlatılması için ayrı belge hazır işlevleri kullandım. İlk Giriş başlatma işe yaradı, ancak ikincisi değil ve aynı zamanda hata vermedi, İkinci Giriş görünmedi. Bu nedenle, her zaman bir Belge Hazır Fonksiyonu kullanmanızı öneririm.


0

Belgeye dahil işlevleri html dosyalarının içine yerleştirebilirsiniz. İşte jquery kullanan bir örnek:

Dosya: test_main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-1.10.2.min.js"></script>
</head>

<body>
    <div id="main-container">
        <h1>test_main.html</h1>
    </div>

<script>
    $(document).ready( function()
    {
        console.log( 'test_main.html READY' );
        $("#main-container").load("test_embed.html");
    } );
</script>

</body>
</html>

Dosya: test_embed.html

<h1>test_embed.html</h1>
<script>
    $(document).ready( function()
    {
        console.log( 'test_embed.html READY' );
    } );
</script>

Konsol çıkışı:

test_main.html READY                       test_main.html:15
test_embed.html READY                      (program):4

Tarayıcı şunu gösterir:

test_embed.html


0

Bunu aşağıdaki şekilde de yapabilirsiniz:

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
 $(document).ready(function(){
     $("#hide").click(function(){
     $("#test").hide();
     });
     $("#show").click(function(){
     $("#test").show();
     });
 });
</script>
</head>

<body>
<h2>This is a test of jQuery!</h2>
<p id="test">This is a hidden paragraph.</p>
<button id="hide">Click me to hide</button>
<button id="show">Click me to show</button>
</body>

önceki yanıtlar, tek bir .ready bloğunun içinde birden çok adlandırılmış işlev veya .ready bloğunda tek bir adlandırılmamış işlev kullanılarak .ready bloğunun dışında başka bir adlandırılmış işlev kullanıldığını gösterdi. Bu soruyu .ready bloğu içinde birden fazla isimsiz fonksiyona sahip olmanın bir yolu olup olmadığını araştırırken buldum - sözdizimini doğru alamadım. Sonunda anladım ve test kodumu göndererek başkalarının sahip olduğum aynı sorunun cevabını bulmalarına yardımcı olacağını umdum


Bunun diğer cevaplardan nasıl farklı olduğunu anlatabilir misiniz?
Stephen Rauch

emin: önceki yanıtlar tek bir .ready bloğu içinde birden çok adlandırılmış işlev veya .ready bloğunda adlandırılmamış tek bir işlev, .ready bloğu dışında başka bir adlandırılmış işlev kullanılarak gösterildi. Bu soruyu .ready bloğu içinde birden fazla isimsiz fonksiyona sahip olmanın bir yolu olup olmadığını araştırırken buldum - sözdizimini doğru alamadım. Sonunda anladım ve test kodumu göndererek başkalarının sahip olduğum aynı sorunun cevabını bulmalarına yardımcı olacağını umdum.
JEPrice

Üzgünüm, soruda demek istedim. Metin kutusunun sol alt tarafında bir düzenleme düğmesi bulunur. Çözümünüzün neden farklı / daha iyi olduğunu açıklamak gelecekteki okuyucunun "Neden" i daha çabuk anlayabileceğinden çok daha iyi bir yanıt verir. Teşekkürler.
Stephen Rauch
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.