Pertanyaan jquery .getscript () callback ketika skrip sepenuhnya dimuat dan dijalankan


Seperti dari halaman api jquery http://api.jquery.com/jQuery.getScript/

Callback Sukses

Callback diaktifkan setelah skrip telah dimuat tetapi belum tentu dijalankan.

$.getScript("test.js", function() {
    foo();
});

jika foo() fungsi tergantung pada test.js, itu tidak dapat dijalankan dengan sukses.

Saya melihat hal yang sama dengan google map api tetapi dalam hal ini Anda dapat menentukan fungsi callback di url skrip ajax. Tetapi secara umum apakah ada cara yang jelas untuk menunggu sampai skrip ajax dieksekusi untuk melakukan panggilan balik?


32
2018-01-28 15:30


asal


Jawaban:


Saya tahu ini adalah pertanyaan lama tetapi saya pikir kedua jawaban yang berisi "selesai" tidak dijelaskan oleh pemiliknya dan mereka sebenarnya adalah jawaban terbaik.

Jawaban yang paling banyak dipilih panggilan untuk menggunakan "async: false" yang pada gilirannya akan membuat panggilan sinkronisasi yang tidak optimal. di sisi lain janji dan janji penangan diperkenalkan ke jquery sejak versi 1.5 (mungkin sebelumnya?) dalam hal ini kami mencoba memuat skrip secara asynchronous dan menunggunya selesai berjalan.

Callback menurut definisi dokumentasi getScript

Callback diaktifkan setelah skrip telah dimuat tetapi belum tentu dijalankan.

apa yang perlu Anda cari adalah bagaimana janji bertindak. Dalam hal ini karena Anda mencari skrip untuk memuat secara asinkron Anda dapat menggunakan "lalu" atau "selesai" lihatlah utas ini yang menjelaskan perbedaannya dengan baik.

Pada dasarnya dilakukan hanya akan dipanggil ketika sebuah janji diselesaikan. dalam kasus kami ketika skrip berhasil dimuat dan selesai berjalan. Jadi pada dasarnya dalam kode Anda itu berarti:

$.getScript("test.js", function() {
    foo();
});

harus diubah menjadi:

$.getScript("test.js").done(function(script, textStatus) {
    console.log("finished loading and running test.js. with a status of" + textStatus);
});

6
2017-09-16 08:15



Anda bisa menggunakan ajax

jQuery.ajax({
        async:false,
        type:'GET',
        url:script,
        data:null,
        success:callback,
        dataType:'script'
    });

Async salah, karena Anda ingin memuat dan menjalankan skrip, setelah itu dalam callback sukses Anda dapat memanggil fungsi foo ()


3
2018-01-28 15:37



$.getScript( "ajaxFile/myjs.js" )
.done(function( s, Status ) {
    console.warn( Status );
})
.fail(function( jqxhr, settings, exception ) {
    console.warn( "Something went wrong"+exception );
});

2
2017-07-06 09:59



$.getScript(...) + setInterval(...) bekerja untuk saya:

$.getScript('https://www.google.com/recaptcha/api.js')
    .done(function () {
        var setIntervalID = setInterval(function () {
            if (window.grecaptcha) {
                clearInterval(setIntervalID);
                console.log(window.grecaptcha);
            };
        }, 300);
    })

Setelah itu variable yang kami cari didefinisikan (dalam kasus saya window.grecaptcha, saya bisa memanggil closure function yang bisa abstracted out.

Semoga berhasil...


2
2017-11-22 03:32



Saya khawatir solusinya membutuhkan polling untuk ketergantungan. Atau script perlu dibungkus dalam callback yang telah ditentukan seperti AMD.


0
2017-07-13 13:32



Saya menghadapi masalah yang sama hari ini dan menemukan solusi berdasarkan janji dan penghitung waktu interval:

$.getScript("test.js", function() {
    var $def = $.Deferred();
    if (typeof foo === 'undefined') { // "foo" isn't available
        var attempts = 0;
        // create an interval
        // that will check each 100ms if the "foo" function
        // was loaded
        var interval = setInterval(function() {
            if (typeof foo !== 'undefined') { // loaded
                window.clearInterval(interval);
                $def.resolve();
            }
            // after X unsuccessfull attempts, abort the operation
            else if (attempts >= 100) {
                window.clearInterval(interval);
                $def.reject('Something went wrong');
            }

            attempts++;
        }, 100);
    }
    else { // "foo" is available
        $def.resolve();
    }
    return $def.promise();
}).then(function() {
    // at this point "foo()" is definitely available.
}).fail(function() {
    // deal with the failure
});

Ideia adalah bahwa Anda memuat skrip yang diberikan yang akan memaparkan beberapa variabel (yang foo berfungsi dalam contoh pertanyaan Anda) yang masih belum ada, jadi setelah skrip dimuat getScript Anda memeriksa apakah variabel ini ada, jika tidak Anda membuat interval yang akan terus memeriksa apakah variabel tersedia, dan hanya ketika kondisi ini dipenuhi Anda menyelesaikan janji.


0
2017-08-18 17:32



$ getScript gunakan seperti ini

$.getScript( "js/jquery.raty.min.js" )
    .done(function( script, textStatus ) {
          console.log( textStatus );
         }
          });

ini bekerja dengan baik untukku


-1
2018-04-08 07:42