Javascript 将函数添加到jQuery元素

Javascript 将函数添加到jQuery元素,javascript,jquery,Javascript,Jquery,我正在尝试使用jQuery向对象添加函数。 不幸的是,这并不像预期的那样有效。 我刚开始使用jQuery并阅读文档,但我需要一个提示,告诉我应该朝哪个方向解决问题 多谢各位 <ul id="ul_list"> <li id="li_a">a</li> </ul> $("#li_a").speak = function () { alert("Hello I'm a!"); }; var button = $('<button

我正在尝试使用jQuery向对象添加函数。 不幸的是,这并不像预期的那样有效。 我刚开始使用jQuery并阅读文档,但我需要一个提示,告诉我应该朝哪个方向解决问题

多谢各位

<ul id="ul_list">
    <li id="li_a">a</li>
</ul>
$("#li_a").speak = function () {
    alert("Hello I'm a!");
};

var button = $('<button/>').html('speak');
button.click(function () {
    $('#li_a').speak();
});
button.appendTo("body");

a

$(“#li_a”).speak=函数(){
警惕(“你好,我是一个!”;
};
var按钮=$('').html('speak');
按钮。单击(函数(){
$('liu a')。说();
});
按钮。附件(“主体”);

您添加的成员函数不正确。要做到这一点,你需要。您需要连接到
$.fn.speak

$.fn.speak = function () {
    alert("Hello I'm a!");
};

var button = $('<button/>').html('speak');
button.click(function () {
    $('#li_a').speak();
});
$.fn.speak=函数(){
警惕(“你好,我是一个!”;
};
var按钮=$('').html('speak');
按钮。单击(函数(){
$('liu a')。说();
});
试试这个JSFIDLE:

(函数($){
$.fn.speak=函数(){
警惕(“你好,我在说话!”);
归还这个;
};
}(jQuery));
var按钮=$('').html('speak');
按钮。单击(函数(){
$('li')。每个(函数(){
$(this.speak();
});
});

按钮。附件(“主体”)您所做的工作不起作用,因为jQuery的
$
函数每次调用它时都返回一个新的类似数组的对象,该对象包含元素。变异其中一个只会更改其实例,下次调用
$
获取元素时,它是一个全新的数组

您可以使用jQuery的
data
函数将函数存储在对象中:

$("li_a").data("speak", function() {
    alert("Hello I'm a!");
});
并称之为

button.click(function () {
    $("li").each(function () {
        $(this).data("speak")();
    });
});
请注意必须如何在循环中调用函数-我们首先在“speak”下访问数据,然后调用它

当您希望每个元素具有不同的行为时,此方法非常有效。如果它们的行为都相似,那么您最好像其他答案所描述的那样扩展
$.fn
,因为这样做会将行为分配给所有对象。

谢谢您的帮助

我找到了解决我问题的办法,也许不是最好的办法,但对我很有效

<ul id="ul_list">
    <li id="li_a">a</li>
</ul>   
$('#li_a') [0].speak = function () {
  alert('Hello I\'m a!');
};
var button = $('<button/>').html('speak2');
button.click(function () {
  var el = $('#li_a') [0];
  if (typeof el.speak == 'function') el.speak(); 
});
button.appendTo('body');

a

$('#li_a')[0]。speak=函数(){
警惕(‘你好,我是一个!’);
};
var按钮=$('').html('speak2');
按钮。单击(函数(){
var el=$('liu a')[0];
if(typeof el.speak=='function')el.speak();
});
按钮。附加到(“主体”);

使用[0]我可以得到DOM元素。

谢谢。你是对的,我需要每个元素有不同的行为。我把你的建议放在我的示例中,但是使用这个数据函数,我无法获得原始对象的引用。这是我建议的一部分。我删除了您拥有的
p
元素,但是您可以用与
li
sThank you相同的方式实现它的行为。但我需要的是在speak函数中引用原始元素的方法。例如,如果lis是可拖动的(我认为这在jQueryUI中是可能的),speak应该能够返回实际位置。一个选项是在循环中调用对象时将对象(或任何相关信息)传递到它自己的speak函数中。