Sự khác biệt giữa jQuery.extend và jQuery.fn.extend?


83

Tôi đang cố gắng hiểu cú pháp plugin jquery, vì tôi muốn hợp nhất hai plugin thành một. Đèn nháy cũng cần có khả năng dừng lại trong khoảng thời gian hoặc chạy một số lần.

Dù sao, cú pháp này có giống với

jQuery.fn.extend({
    everyTime: function(interval, label, fn, times) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, times);
        });
    },
    oneTime: function(interval, label, fn) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, 1);
        });
    },

điều này

$.fn.blink = function(options)
    {

bởi vì có vẻ như phương thức đầu tiên (không có =) là một cách để đặt nhiều phương thức cùng một lúc. Thê nay đung không? Ngoài ra trong khi tôi ở đây Lý do gì để thêm các phần tử và một số logic vào đối tượng jquery?

jQuery.extend({
    timer: {
        global: [],
        guid: 1,
        dataKey: "jQuery.timer",

(đây là từ plugin hẹn giờ)


Nếu học tập tùy chỉnh phát triển jQuery plugin của bạn tôi khuyên bạn nên đọc chủ đề này stackoverflow.com/questions/1117086/...
CrandellWS

Câu trả lời:


89

jQuery.extend được sử dụng để mở rộng bất kỳ đối tượng nào với các chức năng bổ sung, nhưng jQuery.fn.extend được sử dụng để mở rộng đối tượng jQuery.fn, trên thực tế nó thêm một số chức năng plugin trong một lần (thay vì gán từng chức năng riêng lẻ).

jQuery.extend :

var obj = { x: function() {} }

jQuery.extend(obj, { y: function() {} });

// now obj is an object with functions x and y

jQuery.fn.extend :

jQuery.fn.extend( {
        x: function() {},
        y: function() {}
});

// creates 2 plugin functions (x and y)

1
cảm ơn, điều đó đã rõ ràng về việc gán nhiều đối tượng, nhưng tôi vẫn không chắc khi nào người ta nên sử dụng jquery.extend. Tại sao bạn lại chuyển một cái gì đó mà bạn làm trong fn.extend vào jquery.extend? Tôi cũng có thể đăng một câu hỏi mới cho vấn đề này, bởi vì tôi đã hỏi hai câu hỏi.
Richard

13
jQuery.extend () thực sự là một hàm tiện lợi có thể được sử dụng trong mã javascript của riêng bạn để mở rộng các đối tượng theo cách chung chung. Nó là một phần của các chức năng "tiện ích" trong jQuery (không được sử dụng cho thao tác DOM)
Philippe Leybaert

74
jQuery.extend({
    abc: function(){
        alert('abc');
    }
});

sử dụng: $.abc(). (Không cần bộ chọn giống như $.ajax().)

jQuery.fn.extend({
    xyz: function(){
        alert('xyz');
    }
});

sử dụng: $('.selector').xyz(). (Yêu cầu bộ chọn như $('#button').click().)

Chủ yếu nó được sử dụng để thực hiện $.fn.each().

Tôi hy vọng nó sẽ giúp.


20

Sự khác biệt giữa jQuery.extend và jQuery.fn.extend?

Trên thực tế, không có gì ngoài tham chiếu cơ sở của họ. Trong nguồn jQuery , bạn có thể đọc:

jQuery.extend = jQuery.fn.extend = function() { … };

Vì vậy, làm thế nào nó hoạt động? Các tài liệu đọc:

Hợp nhất nội dung của hai hoặc nhiều đối tượng với nhau thành đối tượng đầu tiên.

Nó chỉ là một vòng lặp for-in-loop sao chép các thuộc tính, kết hợp với một cờ để đệ quy các đối tượng lồng nhau. Và một tính năng khác:

Nếu chỉ một đối số được cung cấp $.extend(), điều này có nghĩa là đối số đích đã bị bỏ qua

 // then the following will happen:
 target = this;

Vì vậy, nếu hàm được gọi trên jQuerychính nó (không có đích rõ ràng), nó sẽ mở rộng không gian tên jQuery. Và nếu hàm được gọi trên jQuery.fn(không có đích rõ ràng), nó sẽ mở rộng đối tượng nguyên mẫu jQuery nơi chứa tất cả các phương thức (plugin).


Ủng hộ của tôi !!!! đến điều này. tôi đã nhìn vào mã nguồn để xem cách jQuery riêng của mình mở rộng
dekdev

15

Bài đăng trên blog này có mô tả tốt:

$.fn.extend({
myMethod: function(){...}
});
//jQuery("div").myMethod();

$.extend({
myMethod2: function(){...}
});
//jQuery.myMethod2();

Báo giá:

Theo nguyên tắc chung, bạn nên mở rộng đối tượng jQuery cho các hàm và đối tượng jQuery.fn cho các phương thức. Một hàm, trái ngược với một phương thức, không được truy cập trực tiếp từ DOM.


1
Việc truy cập một phương thức 'trực tiếp từ DOM' có nghĩa là gì?
Dan Nissenbaum

1
directly from the DOMđề cập đến khái niệm JavaScript rất cơ bản của cuộc gọi hàm so với thuộc tính đối tượng / cuộc gọi nguyên mẫu (trên trình bao bọc jQuery xung quanh các đối tượng DOM gốc). Xem ví dụ và cố gắng tìm ra sự khác biệt và suy nghĩ về lý do tại sao mã trong các ví dụ không thể hoán đổi cho nhau.
gavenkoa

10
$.fn.something= function{};

trỏ đến jQuery.prototype và cho phép truy cập các phần tử dom thông qua "this". Bây giờ bạn có thể sử dụng $(selector).something();Vì vậy, điều này hoạt động như chức năng plugin như$(selector).css();

$.something = function{};

thêm một thuộc tính hoặc chức năng vào chính đối tượng jQuery và bạn không thể sử dụng "this" để truy cập dom Bây giờ bạn có thể sử dụng nó như $.something() ; điều này hoạt động như một chức năng tiện ích như$.trim()

nhưng

$.fn.extend({function1(), function2()}) and  $.extend({function1(), function2()}) 

cho phép thêm nhiều hơn 1 hàm cùng lúc, ngoài ra chúng có thể được sử dụng để hợp nhất hai ký tự đối tượng trong trường hợp chúng tôi cung cấp nhiều hơn một đối tượng.

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.