2009-07-20 39 views
9

tôi có chức năng jquery nàygửi một hàm jquery gọi lại bên trong một biến

function example(file, targetwidget, callback){ 

    $(targetwidget).load(file, {limit: 25}, function(){ 
     $("#widget_accordion").accordion({fillSpace: true}); 
    }); 
} 

nó hoạt động ok khi tôi làm:

example('http://example.com/', "#divid", callback); 

nhưng tôi muốn gửi chức năng gọi lại bên trong (gọi lại) biến số tức là: thay vì sử dụng $ ("# widget_accordion"). accordion ({fillSpace: true}); bên trong hàm callback Tôi muốn gửi nó:

example('http://example.com/', "#divid", '$("#widget_accordion").accordion({fillSpace: true});'); 

và sau đó là chức năng phải có cái gì đó như:

function example(file, targetwidget, callback){ 

$(targetwidget).load(file, {limit: 25}, function(){ 
    callback; 
}); 

nhưng điều đó không làm việc

Cảm ơn trước sự giúp đỡ của bạn

+0

Bạn đã thử gọi lại(); ? –

+0

Tôi đã thử nó nhưng vấn đề là gọi lại là: $ ("# widget_accordion"). Accordion ({fillSpace: true}); –

Trả lời

19

Để chuyển cuộc gọi lại, biến cần phải có chức năng loại. Bất kỳ điều nào trong số này cũng sẽ hoạt động:

function example(file, targetwidget, callback) { 
    $(targetwidget).load(file, {limit:25}, callback); 
} 

// Call it by providing the function parameter via inline anonymous function: 
example('http://example.com/', "#divid", function() { 
    $("#widget_accordion").accordion({fillSpace: true}); 
}); 

// Or, declare a function variable and pass that in: 
var widgetCallback = function() { 
    $("#widget_accordion").accordion({fillSpace: true}); 
}; 

example('http://example.com/', "#divid", widgetCallback); 

// Or, declare the function normally and pass that in: 
function widgetCallback() { 
    $("#widget_accordion").accordion({fillSpace: true}); 
} 

example('http://example.com/', "#divid", widgetCallback); 
+0

để thêm vào câu trả lời tuyệt vời này, bạn có thể muốn thêm xác thực cho điều này là tốt, tôi đề nghị sử dụng jquery's $ .isFunction() (http://api.jquery.com/jQuery.isFunction/) – Eman

2

bạn cần phải gọi hàm bên trong cuộc gọi lại

function example(file, targetwidget, callback){ 

$(targetwidget).load(file, {limit: 25}, function(){ 
    callback(); 
}); 
+0

nhưng gọi lại = $ ("# widget_accordion"). Accordion ({fillSpace: true}); Tôi sẽ thử nó –

+0

bạn vẫn cần phải gọi hàm bằng cách gọi nó bằng() – redsquare

+0

giả định gọi lại thực sự là một hàm hợp lệ! – redsquare

1

này nên làm việc:

$(targetwidget).load(file, {limit: 25}, callback); 
+0

nó không hoạt động vì giá trị bên trong gọi lại là dạng văn bản jquery điểm xem –

1

tốt .. Bạn làm theo cách này:

function example(file, targetwidget, callback){ 

$(targetwidget).load(file, {limit: 25}, function(){ 
    if(typeof(callback)==='function'){ 
    callback.call(this, 'other parameters'); 
    } 
}); 

Các paramenters của callback sẽ giúp bạn để gửi dữ liệu trở lại chức năng gọi lại. CHÚ Ý, đừng quên từ khóa this!

+0

Tôi nhận được một lỗi ở đây: callback.call không phải là một hàm –

+0

thì ... có vẻ như gọi lại thực sự không phải là một hàm :) –

1

Vì bạn đang đi qua một chuỗi văn bản bạn sẽ cần phải eval nó:

function example(file, targetwidget, callback){ 

    $(targetwidget).load(file, {limit: 25}, function(){ 
     eval(callback); 
    }); 

Edit:

nếu bạn muốn sử dụng cuộc gọi(), bạn sẽ phải làm điều đó như thế này:

function callback() { 
    $("#widget_accordion").accordion({fillSpace: true}); 
} 

function example(file, targetwidget, callback){ 

    $(targetwidget).load(file, {limit: 25}, function(){ 
     if(typeof(callback)==='function'){ 
      callback.call(this); 
     } 
    }); 

example('http://example.com/', "#divid", callback); 

Để cuộc gọi hoạt động, bạn sẽ phải chuyển một hàm và không phải chuỗi. Nhưng bằng cách gói biểu thức jQuery của bạn bên trong một hàm, nó sẽ được chạy khi hàm được gọi. Gọi một hàm có thể được thực hiện bằng phương thức .call().

+1

trả lời 3 phút trước googletorp 666 ● 10 -> và tất cả chúng ta đều biết eval là xấu! – peirix

+0

Nó hoạt động nhưng có cách nào tốt hơn để làm điều đó? –

+0

Vâng, đọc nhận xét của tôi http://stackoverflow.com/questions/1153241/send-a-jquery-callback-function-inside-a-variable/1153272#1153272. Chỉ cần sử dụng call() thay vì eval() –

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