jQuery Plugin: Thêm chức năng Gọi lại


86

Tôi đang cố gắng cung cấp chức năng gọi lại plugin của mình và tôi muốn nó hoạt động theo cách hơi truyền thống:

myPlugin({options}, function() {
    /* code to execute */
});

hoặc là

myPlugin({options}, anotherFunction());

Làm cách nào để xử lý tham số đó trong mã? Nó có được coi là một thực thể đầy đủ không? Tôi khá chắc mình biết mình sẽ đặt mã thực thi ở đâu, nhưng làm cách nào để mã thực thi? Tôi dường như không thể tìm thấy nhiều tài liệu về chủ đề này.


2
Cú pháp thứ hai của bạn gọi hàm thay vì truyền nó. Bạn cần loại bỏ()
SLaks

6
Cá nhân tôi nghĩ rằng bạn nên chỉ định gọi lại như một phần của tham số "tùy chọn". Điều đó đặc biệt đúng nếu nó phát triển rằng có nhiều lý do để cung cấp một cuộc gọi lại.
Pointy

1
Một cái gì đó giống như vậy trông như thế nào, Pointy? Bạn muốn cung cấp câu trả lời-câu trả lời?
dclowd9901

Câu trả lời:


167

Chỉ cần thực hiện lệnh gọi lại trong plugin:

$.fn.myPlugin = function(options, callback) {
    if (typeof callback == 'function') { // make sure the callback is a function
        callback.call(this); // brings the scope to the callback
    }
};

Bạn cũng có thể gọi lại trong đối tượng tùy chọn:

$.fn.myPlugin = function() {

    // extend the options from pre-defined values:
    var options = $.extend({
        callback: function() {}
    }, arguments[0] || {});

    // call the callback and apply the scope:
    options.callback.call(this);

};

Sử dụng nó như thế này:

$('.elem').myPlugin({
    callback: function() {
        // some action
    }
});

Chỉ là một bổ sung cho câu trả lời này. Có một bài giải thích này: jquery-howto.blogspot.com/2009/11/...
RaphaelDDL

@ David Làm thế nào để thêm tham số gọi lại, tôi muốn làm điều này$('.elem').myPlugin({ callback: function (param) { // some action } });
Jeaf Gilbert

2
@JeaffreyGilbert Bạn nên mang theo bối cảnh jQuery là tốt, tôi sẽ làmoptions.callback.call(this, param);
David Hellsing

@David Tôi muốn có hai cuộc gọi lại, được gọi là animateBeforeanimateAfter. xin vui lòng cho tôi biết làm thế nào để sử dụng giải pháp của bạn ??
user007

5

Tôi không biết liệu tôi có hiểu đúng câu hỏi của bạn không. Nhưng đối với phiên bản thứ hai: Điều này sẽ gọi anotherFunctionngay lập tức.

Về cơ bản plugin của bạn phải là một số loại chức năng giống như sau:

var myPlugin = function(options, callback) {
    //do something with options here
    //call callback
    if(callback) callback();
} 

Bạn phải cung cấp một đối tượng hàm dưới dạng gọi lại, vì vậy hoặc function(){...}hoặc anotherFunction(không ()).


4

Mang lại một vụ nổ từ quá khứ.

Cần lưu ý rằng nếu bạn có hai đối số được truyền, ví dụ:

$.fn.plugin = function(options, callback) { ... };

Sau đó, bạn gọi plugin mà không có đối số tùy chọn nhưng với một lệnh gọi lại thì bạn sẽ gặp sự cố:

$(selector).plugin(function() {...});

Tôi sử dụng điều này để làm cho nó linh hoạt hơn một chút:

if($.isFunction(options)) { callback = options }

3

Tôi nghĩ điều này có thể giúp bạn

// Create closure.
(function( $ ) {
  
   // This is the easiest way to have default options.
 
        var settings = $.extend({
            // These are the defaults.
 
            onready: function(){},
 
            //Rest of the Settings goes here...
        }, options );
 
    // Plugin definition.
    $.fn.hilight = function( options ) {
 
        //Here's the Callback
        settings.onready.call(this);
 
        //Your plugin code goes Here
    };
  
// End of closure.
  
})( jQuery );

Tôi đã chia sẻ một bài viết về Tạo Plugin jQuery của riêng bạn. Tôi nghĩ bạn nên kiểm tra xem http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/


1

Thay đổi chức năng plugin của bạn để lấy tham số thứ hai. Giả sử rằng người dùng chuyển một hàm, tham số đó có thể được coi như một hàm thông thường.
Lưu ý rằng bạn cũng có thể đặt lệnh gọi lại thành thuộc tính của tham số tùy chọn.

Ví dụ:

$.fn.myPlugin = function(options, callback) {
    ...

    if(callback)        //If the caller supplied a callback
        callback(someParam);

    ...
});

0

Một ví dụ hơi muộn, nhưng nó có thể hữu ích. Sử dụng các đối số có thể tạo ra cùng một chức năng.

$.fn.myPlugin = function() {
    var el = $(this[0]);
    var args = arguments[0] || {};
    var callBack = arguments[1];
    .....
    if (typeof callback == 'function') {
        callback.call(this);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.