2009-07-28 38 views
73

mã JavaScript tôi bắt đầu với:

function doSomething(url) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     success: rssToTarget 
    }); 
}  

Pattern Tôi muốn sử dụng:

//where elem is the target that should receive new items via DOM (appendChild) 
function doSomething(url, elem) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     success: rssToTarget(elem) 
    }); 
} 

Tôi không nghĩ rằng tôi có thể nhận được gọi lại để làm việc theo cách này, phải không? Mô hình thích hợp là gì? Tôi không muốn sử dụng biến toàn cầu nhất thiết để tạm thời giữ tên elem hoặc elem.

+0

http://stackoverflow.com/questions/2602981/jquery-how-to-pass-additional-parameters-to-success-callback-for-ajax-call use invokedata –

+0

Để tham khảo sau này: Bạn cần lưu trữ Hàm gọi lại ('rssToTarget') trong thuộc tính' success' của đối tượng theo nghĩa đen bạn đang chuyển sang '$ .ajax()', vì vậy jQuery có thể gọi hàm đó khi yêu cầu AJAX hoàn tất. Bằng cách thêm '(elem)' vào cuối tên hàm, bạn đang nhầm lẫn gọi 'rssToTarget' và lưu trữ giá trị trả về của nó trong' success'. Trong JS, việc thêm dấu ngoặc đơn ở cuối tên hàm sẽ gọi nó. – BrunoFacca

Trả lời

94

Như thế này ...

function doSomething(url, elem) { 
    $.ajax({ 
    type: "GET", 
    url: url, 
    dataType: "xml", 
    success: function(xml) { 
     rssToTarget(xml, elem); 
    } 
    }); 
} 

trả lời để bình luận của bạn: Does use of anonymous functions affect performance?

+3

aha +1. Bạn có trả bất kỳ giá hiệu suất nào để tạo các hàm anon ở mọi nơi không? – BuddyJoe

+2

Và tôi đoán nó sẽ thực sự là .... thành công: function (xml) {rssToTarget (xml, elem); } – BuddyJoe

+0

Nếu bạn đồng ý, bạn có thể cập nhật câu trả lời không? Cảm ơn Josh – BuddyJoe

30

Các mô hình bạn muốn sử dụng có thể làm việc nếu bạn tạo một closure bên trong chức năng rssToTarget của bạn:

function rssToTarget(element) { 
    return function (xmlData) { 
    // work with element and the data returned from the server 
    } 
} 

function doSomething(url, elem) { 
    $.ajax({ type: "GET", 
     url: url, 
     dataType: "xml", 
     success: rssToTarget(elem) 
     }); 
} 

Khi rssToTarget(elem) được thực hiện, tham số phần tử được lưu trữ trong closure và chức năng gọi lại sẽ được trả lại ned, chờ đợi để được thực hiện.

+0

-1 Bạn không thể thiết lập thành công cho hàm trả về hàm. –

+0

Tôi quên thêm "nhưng yêu cầu tham số" –

+3

tất nhiên bạn có thể trả về một chức năng kiểm tra mã đang chạy! http://jsbin.com/anepo/edit – CMS

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