Cố gắng kích hoạt sự kiện onload trên thẻ script


100

Tôi đang cố gắng tải một bộ tập lệnh theo thứ tự, nhưng sự kiện tải không kích hoạt đối với tôi.

    var scripts = [
        '//cdnjs.cloudflare.com/ajax/libs/less.js/1.3.3/less.min.js',
        '//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.min.js',
        MK.host+'/templates/templates.js'
    ];

    function loadScripts(scripts){
        var script = scripts.shift();
        var el = document.createElement('script');
        el.src = script;
        el.onload = function(script){
            console.log(script + ' loaded!');
            if (scripts.length) {
                loadScripts(scripts);
            }
            else {
                console.log('run app');
                MK.init();
            }
        };

        $body.append(el);
    }

    loadScripts(scripts);

Tôi đoán các sự kiện gốc như el.onload không kích hoạt khi jQuery được sử dụng để nối phần tử vào DOM. Nếu tôi sử dụng bản địa document.body.appendChild(el)thì nó sẽ kích hoạt như mong đợi.


truy cập: thi liên kết: stackoverflow.com/questions/4845762/… Đây là sử dụng
fuull

Câu trả lời:


143

Bạn nên thiết lập các srcthuộc tính sau khi các onloadsự kiện, f.ex:

el.onload = function() { //...
el.src = script;

Bạn cũng nên nối tập lệnh vào DOM trước khi đính kèm onloadsự kiện:

$body.append(el);
el.onload = function() { //...
el.src = script;

Hãy nhớ rằng bạn cần kiểm tra readystatehỗ trợ của IE. Nếu bạn đang sử dụng jQuery, bạn cũng có thể thử getScript()phương pháp: http://api.jquery.com/jQuery.getScript/


11
điều đó thực sự không khắc phục được nó. Nhưng nếu tôi chỉ sử dụng document.body.appendChild(el)thay vì $ ('body'). Append (el); thì sự kiện onload sẽ kích hoạt như mong đợi.
chovy

34
bạn có thể giúp tôi hiểu tại sao việc đặt hàng lại quan trọng không?
chovy

12
@David Tại sao không nối phần tử sau cùng, như được khuyến nghị ở những nơi như html5rocks.com/en/tutorials/speed/script-loading ? Điều đó sẽ làm cho thứ tự bạn thêm trình nghe sự kiện và đặt srcở đó không liên quan.
Stuart P. Bentley

3
Tôi tò mò: Tại sao việc đính kèm một phần tử vào DOM trước khi đặt thuộc tính onloadsrc?
Jake Wilson

1
Nếu tập lệnh được lưu vào bộ nhớ cache, thì ngay sau khi bạn thêm src, mục sẽ được tải và tải lên không kích hoạt. Thêm onload trước src sẽ đảm bảo rằng onload kích hoạt cho các tập lệnh được lưu trong bộ nhớ cache.
JonShipman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.