2011-09-14 31 views
5

Tôi đang sử dụng hàm load() của jQuery để tải một số trang vào vùng chứa. Đây là mã:jQuery .load() Cách ngăn tải hai lần từ việc nhấp đúp vào

$('div.next a').live('click',function() { 

    $('.content').load('page/3/ #info','',function(){ 
     //do something 
    }); 

return false; 

}); 

Tất cả mọi thứ làm việc tốt nhưng vấn đề là khi tôi nhanh chóng nhấn đúp chuột vào liên kết div.next, từ giao diện điều khiển tôi thấy rằng nó tải trang hai lần vì tôi đã làm một cú nhấp đúp nhanh chóng. Tôi thậm chí có thể làm cho nó 3 lần nhấp chuột và nó sẽ được tải lên 3 lần và hiển thị trong giao diện điều khiển smth như thế:

GET http://site/page/3/  200  OK 270ms 
GET http://site/page/3/  200  OK 260ms 

Câu hỏi của tôi là làm thế nào để ngăn chặn nhấp đúp như vậy và không để tải các trang mục tiêu nhiều hơn sau đó một lần không vấn đề đã được nhấp bao nhiêu lần.

Cảm ơn bạn.

+0

Bạn có muốn liên kết này có thể nhấp lại khi tải trang không? –

+0

ngược lại, tôi muốn bị tắt sau khi được nhấp và sau đó được kích hoạt khi trang được tải vào vùng chứa. – devjs11

Trả lời

1

Bất cứ điều gì xảy ra với JavaScript tốt? Tại sao tất cả các bạn đang cố gắng tìm ra nó với jQuery thuần túy?

var hasBeenClicked = false; 

$('div.next a').live('click',function() { 

    if(!hasBeenClicked){ 
     hasBeenClicked = true; 
     $('.content').load('page/3/ #info','',function(){ 
      //do something 
      //If you want it clickable AFTER it loads just uncomment the next line 
      //hasBeenClicked = false; 
     }); 
    } 

    return false; 
}); 

Là một mặt lưu ý, never never không bao giờ sử dụng.live(). Sử dụng .delegate thay thế như:

var hasBeenClicked = false; 

$('div.next').delegate('a','click',function() { 

    if(!hasBeenClicked){ 
     hasBeenClicked = true; 
     $('.content').load('page/3/ #info','',function(){ 
      //do something 
      //If you want it clickable AFTER it loads just uncomment the next line 
      //hasBeenClicked = false; 
     }); 
    } 

    return false; 
}); 

Tại sao? Paul Irish giải thích: http://paulirish.com/2010/on-jquery-live/

Để trả lời bình luận của bạn ...

Điều này có thể xảy ra nếu bạn có chức năng đại diện của mình lồng vào bên trong cuộc gọi của bạn AJAX (.load(), .get(), vv). div.next phải ở trên trang để hoạt động. Nếu div.next không phải là trên trang web, và điều này không được lồng nhau, chỉ làm điều này:

$('#wrapper').delegate('div.next a','click',function() { 

http://api.jquery.com/delegate/

Đại biểu cần chọn được phụ huynh của các yếu tố tự động thêm vào. Sau đó, tham số đầu tiên của đại biểu (div.next a trong ví dụ cuối cùng) là phần tử cần tìm trong phần tử đã chọn (#wrapper). Trình bao bọc cũng có thể là body nếu nó không được bao bọc trong bất kỳ phần tử nào.

+0

Phiên bản của bạn hoạt động như một sự quyến rũ nhưng chỉ với .live(). .delegate không nhận ra các liên kết từ trang được tải trong trường hợp của tôi. Bất kỳ ý tưởng tại sao điều đó lại xảy ra? – devjs11

+0

Cập nhật câu trả lời của tôi, nhìn vào phía dưới –

+0

Nếu điều đó vẫn không giúp với đại biểu, tôi có thể xem phần còn lại của mã của bạn không? –

1

Bạn có thể unbind sự kiện click với die():

$(this).die('click').click(function() { return False; }); 

Hoặc bạn có thể cung cấp cho các phần tử một lớp .clicked khi nó được nhấp:

$(this).addClass('clicked'); 

Và kiểm tra xem lớp đó tồn tại khi thực hiện bạn logic:

$('div.next a').live('click',function() { 
    if (!$(this).is('.clicked')) { 
     $(this).addClass('clicked'); 

     $('.content').load('page/3/ #info','',function(){ 
      //do something 
     }); 
    } 

    return false; 
}); 
+0

Nếu tôi sử dụng: không (.clicked), nó hoạt động nếu tôi nhấp một lần nhưng nếu tôi thực hiện nhấp đúp, nó sẽ chuyển đến trang/3/và không tải trang trong vùng chứa hoạt động như url bình thường. Bất kỳ ý tưởng tại sao? – devjs11

+0

Rất tiếc, đã quên mất 'return false'. Kiểm tra mã cập nhật. – Blender

+0

Điều đó tiếp tục chuyển đến trang nếu nhấp nhanh hai lần ... Một lần nhấp hoạt động tốt. Kỳ dị. – devjs11

1

Bạn co uld thử sử dụng phương pháp jquery one:

$("a.button").one("click", function() { 
     $('.content').load('page/3/ #info','',function(){ 
       //do something 
     }); 
}); 
+0

Tôi đã thử phương pháp này trước đây nhưng nó vẫn lặp lại tải trên nhấp đúp và gấp ba lần – devjs11

+0

+1: Tôi không biết về chức năng này! Nhưng làm thế nào để bạn ngăn chặn yếu tố 'a' nhảy lên đầu trang khi được nhấp lại? – Blender

+0

Hmm .. trên mỗi tài liệu jquery, nó không nên làm điều đó (lặp lại logic chức năng trên các nhấp chuột tiếp theo). Điểm tốt w/trang nhảy trở lại. Hãy để tôi cho rằng một số suy nghĩ. – SBerg413

1

Lưu trữ xem bạn có đang đợi tải trong biến hay không.

(function() { 
    var waitingToLoad = false; 
    $('div.next a').live('click',function() { 

    if (!waitingToLoad) { 
     waitingToLoad = true; 
     $('.content').load('page/3/ #info','',function(){ 
      waitingToLoad = false; 
      //do something 
     }); 
    } 
    return false; 
    }); 

})() 
Các vấn đề liên quan