2011-01-17 40 views
40

Tôi biết rằng bạn có thể thêm chức năng jQuery mới bằng cách $.fn.someFunction = function()Thêm jQuery chức năng đến các yếu tố cụ thể

Tuy nhiên, tôi muốn thêm chức năng để chỉ các yếu tố cụ thể. Tôi cố gắng cú pháp này và nó không hoạt động $('.someElements').fn.someFunction = function()

Tôi muốn làm điều này vì vậy mà tôi có thể gọi hàm như một nơi nào đó trong mã $('someElements').someFunction();

+0

Tôi không chắc chắn điều này có khả thi không, nhưng nếu có, tại sao bạn muốn làm tê liệt mã của mình? Nếu bạn muốn giới hạn nó cho một số bộ chọn nhất định, hãy sử dụng các bộ chọn đó. Hoặc, nhớ cache kết quả từ '$ ('. SomeElements')' và gọi hàm này là biến cộng với '.someFunction()' sau đó. – Robert

+0

Vấn đề là $ (...). Fn không tồn tại, chỉ $ .fn. Và chỉ cần thiết lập $ (...). SomeFunction không có tác dụng tương tự, bởi vì nó sẽ không chạy nó trên mỗi phần tử trong bối cảnh riêng của nó. –

+0

@ Rober - vâng cuối cùng tôi chỉ lưu trữ kết quả và sử dụng tham chiếu để gọi hàm được thêm vào. – peter

Trả lời

41

Sử dụng .bind().trigger()

$('button').bind('someFunction',function() { 
    alert('go away!') 
}); 


$('button').click(function(){ 
    $(this).trigger('someFunction'); 
}); 

Tính đến jQuery 1.7, phương pháp .on() là ưa thích phương pháp cho gắn trình xử lý sự kiện vào quảng cáo ocument.

+2

và để lấy dữ liệu được hàm trả về thay vì chuỗi jquery sử dụng phương thức triggerHandler – r043v

+8

chỉ cần cập nhật tại đây, 'bind' không được dùng nữa và được thay thế bằng 'on' – DMTintner

+0

có! nó được nêu ở đó trên liên kết được cung cấp ... – Reigel

0

Tôi có một ý tưởng mà tôi nghĩ có thể làm việc để làm chặt chẽ với những gì bạn muốn, nhưng nó không hiệu quả, và kết luận của tôi là điều này là không thể.

Ý tưởng của tôi là để làm những gì bạn đã cố gắng, nhưng trên một đối tượng jQuery lưu trữ, ví dụ:

var a = $("a"); 
a.fn.someFunc = function() {...}; 
a.someFunc();

Nhưng kể từ $(...).fn không tồn tại, đó là không thể.

18

yo có thể làm các việc trên với điều này:

$.fn.testFn = function(){ 
    this.each(function(){ 
     var className = $(this).attr('class'); 
     $(this).html(className); 
    });  
}; 

$('li').testFn(); //or any element you want 

Test: http://jsfiddle.net/DarkThrone/nUzJN/

+4

anh ấy biết rằng ... – Reigel

+2

cần có một sự trở lại này để chuỗi – qwertymk

+0

@qwertymk: tôi biết, nó là để làm cho một điểm, không phải để xác định một plugin jQuery toàn bộ. @Reigil: ibidem, tôi đã cố gắng để maka điểm, rằng điều này có thể đã đạt được thông qua jQuery. Toàn bộ câu trả lời không có ý nghĩa gì cả. Bạn có thể chọn tập hợp chính xác với $ (..) thay vì duyệt qua tất cả DOM phù hợp để loại bỏ thông qua một tiêu chí mới. – DarkThrone

0

Tôi cũng không chắc chắn với câu trả lời của mình nếu điều này sẽ giúp bạn nhưng chỉ cần thử cách sử dụng .live?

$(selector).live(click,function(){ 
    //some codes here 
}); 
9

Yo, cần làm điều tương tự, đã đưa ra điều này. nguyên nhân tốt đẹp của nó, bạn phá hủy các yếu tố và chức năng đi poof! Tôi nghĩ ...

var snippet=jQuery(".myElement"); 
snippet.data('destructor', function(){ 
    //do something 
}); 
snippet.data('destructor')(); 
7

@ Câu trả lời của Reigel thật tuyệt vời! Tuy nhiên bạn cũng có thể sử dụng cú pháp $.fn và để chức năng của bạn chỉ xử lý một số yếu tố:

$.fn.someFunction = function(){ 
    this.each(function(){ 
     // only handle "someElement" 
     if (false == $(this).hasClass("someElement")) { 
      return; // do nothing 
     } 

     $(this).append(" some element has been modified"); 

     return $(this); // support chaining 
    });  
}; 

// now you can call your function like this 
$('.someElement').someFunction();    

Xem jsfiddle làm việc: http://jsfiddle.net/AKnKj/3/

5

tôi thực sự đã có trường hợp sử dụng này là tốt, nhưng với một đối tượng lưu trữ. Vì vậy, tôi đã có một đối tượng jQuery, một menu có thể chuyển đổi, và tôi muốn đính kèm hai hàm vào đối tượng đó, "mở" và "đóng". Các chức năng cần thiết để bảo toàn phạm vi của phần tử và chính nó, vì vậy tôi muốn this làm đối tượng trình đơn. Dù sao, bạn chỉ có thể thêm các hàm và các biến tất cả các ô, giống như bất kỳ đối tượng javascript nào khác. Đôi khi tôi quên điều đó.

var $menu = $('#menu'); 
$menu.open = function(){ 
    this.css('left', 0); 
    this.is_open = true; // you can also set arbitrary values on the object 
}; 
$menu.close = function(){ 
    this.css('left', '-100%'); 
    this.is_open = false; 
}; 

$menu.close(); 
+0

Đây là một cách tuyệt vời để xử lý nó. Đặc biệt điều này hữu ích nếu bạn đã thêm một cái gì đó vào DOM (tức là một cửa sổ bật lên) và bạn chỉ muốn các hàm có mặt cho một phần tử DOM đó. Vì vậy, khi bạn xóa cửa sổ bật lên, các chức năng sẽ biến mất cùng với nó. Bạn cũng có thể làm theo cách này: '$ ('# menu') [0] .open = function() {...};' Để bạn có thể nắm được và gán một hàm tùy ý cho tất cả trong một bước . – JaredC

-1

Tôi đã làm điều này và hoạt động tốt của nó ..

function do_write(){ 
    $("#script").append("<script> $(\'#t"+(id_app+4)+"\').change(function(){ alert('Write Your Code here'); });<\/script>"); 
    console.log("<script> $(\'#t"+(id_app+4)+"\').change(function(){ alert('hello'); });<\/script>"); 
} 

và chức năng cuộc gọi từ chức năng động của bạn mà đang tạo ra một điều khiển năng động trong html

3

Nếu bạn đang muốn chức năng này chỉ dành cho selectors Đặc biệt, đây sẽ làm việc cho bạn. Tôi đã có một kịch bản mà tôi đã cần điều này và nó hoạt động độc đáo.

$('.my-selector').each(function(){ 

    $(this).init.prototype.getUrl = function(){ 
     // do things 
    }; 
}) 

thì sau này bạn có thể làm

$('.my-selector').getUrl() 

mà không cần phải định nghĩa nó như là một plugin, hoặc sử dụng dữ liệu hoặc bind/sự kiện/cò.

Rõ ràng, bạn có thể thay đổi chức năng để trả lại đối tượng chứa nếu bạn muốn sử dụng nó trong chaining được kết bằng cách quay this

$('.my-selector').each(function(){ 

    $(this).init.prototype.getUrl = function(){ 
     // do things 
     return this; 
    }; 
}) 
+1

điều này sẽ đính kèm getUrl để jquery không chỉ cho rằng yếu tố –

+0

Rất thích tại sao sau 3 năm, một người nào đó xuống phiếu này. Một lời giải thích sẽ tốt đẹp –

2

Các giải pháp rõ ràng nhất là gán một chức năng như tài sản của đối tượng:

obj.prop("myFunc", function() { 
    return (function(arg) { 
    alert("It works! " + arg); 
    }); 
}); 

Sau đó gọi nó trên đối tượng theo cách này:

obj.prop("myFunc")("Cool!"); 

Lưu ý: chức năng của bạn là giá trị trả về của cái bên ngoài, xem: http://api.jquery.com/prop/#prop-propertyName-function

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