2009-09-02 61 views
6

Làm cách nào để gọi hàm từ bên trong hàm, do đó nó sẽ trở thành đệ quy? Dưới đây là mã của tôi, tôi đã thêm một nhận xét mà tôi muốn để bắt đầu đệ quy:Hàm đệ quy JQuery?

$('a.previous-photos, a.next-photos').click(function() { 
    var id = $('#media-photo img').attr('id'); 
    var href = $(this).attr('href'); 
    href = href.split('/'); 
    var p = href[href.length - 1]; 
    var url = '/view/album-photos/id/' + id + '/p/' + p; 

    $.get(url, function(data) { 
     $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>'); 
    }); 

    // here I want to call the function again 

    return false; 
}); 

Trả lời

10

Bạn có thể thực hiện cuộc gọi đệ quy đến một chức năng ẩn danh bằng cách làm

arguments.callee(....); 

Xem here để biết thêm.

+0

Có thể lấy mẫu hoàn chỉnh không? Tôi chưa thể thực hiện công việc này, tuy nhiên ... – krdluzni

+0

Trang web được liên kết có ví dụ về việc tạo một hàm giai thừa đệ quy ẩn danh. – jimr

+1

agruments.callee không được chấp nhận. xem http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript –

3

Something của loại này nên làm các trick, nhưng có phải là một cách đẹp hơn để thiết lập nó:

function myfunc() { 
    var id = $('#media-photo img').attr('id'); 
    var href = $(this).attr('href'); 
    href = href.split('/'); 
    var p = href[href.length - 1]; 
    var url = '/view/album-photos/id/' + id + '/p/' + p; 

    $.get(url, function(data) { 
     $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>'); 
    }); 

    if(!cond){//you need a condition, or it'll recurse indefinitely. 
     myfunc(); 
    } 

    return false; 
} 

$('a.previous-photos, a.next-photos').click(function(){myfunc();}); 
1

Từ Javascript 1.2 trở đi bạn có thể sử dụng arguments.callee(...) để thực hiện một cuộc gọi đệ quy đến một chức năng ẩn danh

// here I want to call the function again 
arguments.callee(); 
1

Đặt mã của bạn trong một định dạng plugin jQuery và gọi riêng của mình ví dụ ...

(function($) { 
$.fn.togglethis = function() { 
    $(this).animate({opacity:"1.0"}, 1000, function() { 
     /* Code Here */ 
     return $(this); 
    }); 

} 
})(jQuery); 
$(document).ready(function() { 
    $("#togglethis").togglethis(); 
}); 

Chèn mã mong muốn của bạn vào nơi nhận xét.

4

Câu trả lời hàng đầu đã lỗi thời. Hiện tại (tháng 8 năm 2012) callee không được dùng ít nhất trong Firefox. Sử dụng callee đã lỗi thời. Hiện nay (tháng 8 năm 2012) callee là "... phản đối bởi ECMA-262." (Xem discussion)

Có hai vấn đề bạn đang chạy vào:

  1. xử lý chức năng sẽ chỉ được thông qua sự kiện này vật.
  2. chức năng không được đặt tên, vì vậy bạn không thể đề cập đến nó cho đệ quy

Giải pháp cho 2:

Đây là dễ dàng hơn của cả hai. Thông thường, lý do sử dụng các hàm ẩn danh là giữ một không gian tên sạch sẽ. Dấu ngoặc đơn xác định một không gian tên cục bộ, vì vậy sau khi đặt tên cho hàm, nó sẽ không thể truy cập được bên ngoài dấu ngoặc đơn. Sau đây sẽ làm việc cho bạn:

$('.someclass').onClick(function dosomething(){ 
    ... your code ... 
    dosomething() //again 
}); 
dosomething() // will cause scope error, function not defined 

Giải pháp cho 1:

Đây là khó khăn hơn một chút. Vì điều duy nhất được truyền cho hàm là đối tượng sự kiện bạn sẽ cần phải mở rộng để truyền các giá trị. May mắn thay, nó chỉ ra rằng jQuery có một hệ thống just for this!

$('.someclass').on('click', {myvar: 0}, function dosomething(event){ 
    ... your code ... 
    event.data.myvar = event.data.myvar + 1; 
    dosomething(event) //again 
}); 

Lưu ý: điều này đặc biệt hữu ích khi bạn phải đính kèm và tách trình xử lý để ngăn vòng lặp vô hạn như DOMSubtreeModified.

$('.someclass').on('DOMSubtreeModified.mynamespace', {myvar: 0}, function myfunc(event){ 
    $(this).off('DOMSubtreeModified.mynamespace'); 
    ... Some Code that changes .someclass subtree ... 
    event.data.myvar = event.data.myvar + 1; 
    $(this).on('DOMSubtreeModified.mynamespace', {myvar: event.data.myvar}, myfunc); 
});