2011-10-18 27 views
6

Làm cách nào để xóa các chức năng ẩn danh được đặt để kích hoạt thông qua cuộc gọi jquery document.ready()?Xóa tài liệu jquery.ready() gọi

Ví dụ:

<script type="text/javascript"> 
    //some code sets a doc ready callback 
    $(document).ready(function() 
    { 
     alert('ready'); 
    }); 

    //my attempt to prevent the callback from happening 
    window.onload = null; 
    $(document).unbind("ready"); 

</script> 

Cảnh báo xảy ra bất kể những nỗ lực của tôi để phá vỡ nó. Có cách nào để làm điều này không ??

+0

Có thể đặt nhiều hàm '' 'ready''', vì vậy tôi không ngạc nhiên khi' '' unbind''' không công việc. Một giải pháp hacky sẽ là thiết lập một biến toàn cục và bọc mọi thứ bên trong hàm '' 'ready''' trong' '' if''' để kiểm tra giá trị - chỉ cần thay đổi giá trị và trong khi '' 'ready' '' chức năng vẫn sẽ chạy, nội dung của nó sẽ không ... – JoLoCo

Trả lời

5

Có thể bạn sẽ nhận được câu trả lời phù hợp nhất nếu bạn mô tả vấn đề bạn đang thực sự cố gắng giải quyết.

jQuery không có cách được ghi lại công khai để hoàn tác hoặc chặn trình xử lý document.ready(). Nếu bạn kiểm soát mã, bạn có thể sử dụng một biến toàn cầu và một điều kiện như thế này:

var skipReady = false; 
$(document).ready(function() 
{ 
    if (!skipReady) { 
     alert('ready'); 
    } 
}); 

// skip the document.ready code, if it hasn't already fired 
skipReady = true; 

Hoặc, nếu bạn muốn hack vào jQuery một chút (ngoài các giao diện tài liệu), bạn có thể làm điều này:

$(document).ready(function() { 
    alert("ready"); 
}); 

// stop the ready handler 
$.isReady = true; 

Bạn có thể xem công việc cuối cùng tại đây: http://jsfiddle.net/jfriend00/ZjH2k/. Điều này làm việc vì jQuery sử dụng thuộc tính: $.isReady để theo dõi xem nó đã kích hoạt trình xử lý sẵn sàng hay chưa. Đặt nó thành sự thật làm cho nó nghĩ rằng nó đã bắn chúng để nó sẽ không làm mọi việc một lần nữa.

+0

Tôi không kiểm soát mã. Tôi đang tạo một đoạn mã javascript có thể được đưa vào trang web của khách hàng sẽ thay thế một số nội dung của họ. Thật không may họ có callbacks đang mong đợi một số nội dung được thay thế để có, do đó một lỗi. Tôi nghĩ nếu tôi có thể ghi đè lên các cuộc gọi sẵn sàng cho tài liệu của họ bằng cách nào đó, thì điều này sẽ giải quyết vấn đề. –

+0

Wow - bạn đang cố chặn tất cả mã khởi tạo jQuery.ready. Tôi hy vọng bạn biết những gì bạn đang làm vì rất nhiều thứ có thể phá vỡ nếu bạn làm điều đó. Điều gì về mã init hợp pháp mà không cần phải chạy? Dù sao, tôi đã thêm một tùy chọn khác có thể được thực hiện mà không cần sửa đổi mã bên trong trình xử lý sẵn sàng. Dường như với tôi như bạn nên để cho các mã sẵn sàng thường xuyên và nội dung trang thường xuyên chạy và THEN, sau khi nó đã thực hiện, bạn thay thế các công cụ trong trang. – jfriend00

+0

Vâng, tôi hiểu điều này có vẻ đáng sợ như thế nào, nhưng chúng tôi được phép làm điều này. Tôi đang mở để hack vào jquery một chút, nhưng chúng tôi có một số mã khác mà không cần phải chạy trên doc.ready. Ví dụ thứ hai dường như làm chính xác những gì tôi cần ... mặc dù có vẻ như phản trực quan - thiết lập là đúng để làm cho tôi nghĩ rằng chúng tôi đang kích hoạt doc.ready ... –

0

$ (tài liệu) .ready() phụ thuộc vào sự kiện onLoad được kích hoạt bởi trình duyệt nghĩa là bạn không thể ngăn nó xảy ra. Nếu alert() được xác định bởi một số điều kiện thì tôi sẽ sử dụng câu lệnh if/else để quyết định xem nó có được gọi hay không.

+1

Đây không phải là trường hợp. $ (document) .ready() được tạo bởi jQuery và có nhiều cách để ngăn chặn nó xảy ra. – jfriend00

1

này hoạt động:

$(document).bind("ready", function() { alert("hey!"); }); 
$(document).unbind("ready"); 

Có vẻ như một lỗi với tôi - tất cả các sự kiện khác trong jQuery có thể được cởi ra. Bỏ qua điều này là không phù hợp.

Không phải là một câu trả lời trực tiếp như các thiếu sót, nhưng đây là một số thông tin liên quan từ jQuery docs:

Cả ba cú pháp sau là tương đương:

  • $(document).ready(handler)
  • $().ready(handler) (đây là không được đề xuất)
  • $(handler)

Ngoài ra còn có $(document).bind("ready", handler). Điều này hoạt động tương tự như phương thức đã sẵn sàng nhưng với một ngoại lệ: Nếu sự kiện sẵn sàng đã kích hoạt và bạn cố gắng .bind("ready") trình xử lý ràng buộc sẽ không được thực hiện. Xử lý sẵn sàng bị ràng buộc theo cách này được thực hiện sau khi bất kỳ ràng buộc bởi ba phương pháp khác ở trên.

+0

Rất tuyệt! Vì vậy, tôi tự hỏi sự khác biệt giữa việc gọi $ (tài liệu) .ready (...) so với $ (tài liệu) .bind ("ready", ...). Quá xấu tài liệu unbind nói nó chỉ ảnh hưởng đến những callbacks đã được thiết lập thông qua một cuộc gọi bind(). –

+0

@ShaneN - Sự khác biệt là trình xử lý '.bind (" ready ", handler)' sẽ không được gọi nếu sự kiện 'ready' đã được kích hoạt. Họ cũng được gọi là cuối cùng, sau khi bất kỳ xử lý bị ràng buộc theo cách phổ biến hơn. – gilly3

+0

Tốt nhất tôi có thể biết khi xem mã nguồn, trình xử lý '$ (document) .bind (" ready ")' sẽ được gọi sau khi các trình xử lý sẵn sàng khác và chúng là những người duy nhất có thể được loại bỏ bằng '$ (tài liệu) .unbind() '. Bạn không thể loại bỏ một trình xử lý '$ (document) .ready()' với unbind khi chúng được lưu trữ khác nhau. – jfriend00

0

Câu hỏi cũ, nhưng đã qua sự cần thiết phải làm điều này gần đây để ngăn chặn tài liệu.đã có mã tôi không kiểm soát chạy trong một số trường hợp nhất định. Điều này có thể đạt được bằng cách ủy nhiệm chức năng sẵn sàng của jQuery, giống như một điệp viên thử nghiệm.Công việc sau sẽ hoạt động:

var ready = $.prototype.ready; 

// proxy the ready function 
$.prototype.ready = function (fn, allowed) { 
    allowed = allowed || false; 

    if (allowed) { 
     ready.call(this, fn); 
    } 
}; 

Tất cả cuộc gọi đến $(document).ready giờ đây sẽ bị bỏ qua. Bạn có thể ghi đè hành vi này bằng cách chuyển đúng như đối số thứ hai: $(document).ready(fn, true)

Các vấn đề liên quan