如何向一些jQuery对象添加函数,而不是向其他对象添加函数
How to add functions to some jQuery objects, but not others?
假设我有一个<ul>
列表:
<ul class="products">
...
</ul>
我想用jQuery选择它,然后添加一些函数到该对象。例如,我想添加一个addProduct(productData)
函数和一个deleteProduct(productId)
函数。但是,我希望函数只添加到由选择器返回的对象中。例如,像这样:
var productList = $.extend($('ul.products'), {
addProduct: function(productData) {
// add a new li item
},
deleteProduct: function(productId) {
// delete li with id
}
});
我如何使用jQuery做到这一点?这里的关键点是,我只想将函数添加到jQuery选择器返回的实例中。换句话说,我不想修改jQuery的原型或创建插件,因为这会使函数在所有地方都可用,而我只想将函数添加到一个特定的实例中。
如果你只希望addProduct
和deleteProduct
方法的特点,单一的 jQuery对象,那么你得到的将工作良好;但是你必须保持对jQuery对象的引用/只使用它一次,以保留addProduct
和deleteProduct
方法的存在。
然而,这些addProduct
和deleteProduct
方法对于特定的jQuery对象是唯一的;这些方法不会存在于您创建的任何其他jQuery对象上;
var productList = $.extend($('ul.products'), {
addProduct: function(productData) {
// add a new li item
},
deleteProduct: function(productId) {
// delete li with id
}
});
// Using this particular jQuery object (productList) will work fine.
productList.addProduct();
productList.removeProduct();
// However, addProduct() does not exist on new jQuery objects, even if they use
// the same selector.
$('ul.products').addProduct(); // error; [object Object] has no method 'addProduct'
要做到这一点,最好的方法是回到基础并定义单独的addProduct
和deleteProduct
函数,它们接受jQuery对象。如果您想将这些函数限制为它们只在ul.products
选择器上工作,您可以执行;
function addProduct(obj) {
obj = obj.filter('ul.products');
// do something with `obj` (its a jQuery object)
}
建议使用这种方法,因为它保持了jQuery.fn
API的一致性;否则,您将addProduct
和removeProduct
添加到一些 jQuery.fn
实例中,而不是其他实例,或者使它们在其他实例中使用冗余。使用这种方法,addProduct
和removeProduct
总是在那里,但是如果他们不想使用它们,不要妨碍任何人。
<标题> 历史笔记
这个答案最初写于2011年11月,当时jQuery 1.7刚刚发布。从那时起,API发生了很大的变化。以上答案与当前 2.0.0版本的jQuery有关。
在1.9之前,有一个很少使用的方法叫做jQuery.sub
,它是与你想做的事情相关的(但是除非你改变你的方法,否则它不会帮助你)。这将创建一个新的jQuery构造函数,因此您可以执行;
var newjQuery = jQuery.sub();
newjQuery.fn.addProduct = function () {
// blah blah
};
newjQuery.fn.deleteProduct = function () {
// blah blah
};
var foo = newjQuery('ul.products');
foo.deleteProduct();
foo.addProduct();
var bar = jQuery('ul.products');
bar.deleteProduct(); // error
bar.addProduct(); // error
要小心,$
方法别名将引用旧的jQuery
对象,而不是newjQuery
实例。
jQuery.sub
在1.9中被从jQuery中移除。
您可以创建自己的jQuery方法,如下所示:
$.fn.addProduct = function(){
var myObject = $(this);
// do something
}
// Call it like:
$("ul.products").addProduct();
这有点棘手,因为你正在制作非常特定于列表的方法。因此,为了确保这一点,您至少应该添加一些对对象类型的检查,并正确处理代码,如果当前对象是,比如输入元素。
另一种方法是创建一个普通的Javascript方法,接收列表作为参数。这样,您可以创建一个更特定于列表的方法。
我认为你想给那个DOM对象添加一个函数。
$(function(){
// [0] gets the first object in array, which is your selected element, you can also use .get(0) in jQuery
$("#test")[0].addProduct = function(info){
alert("ID: " + this.id + " - Param: " + info);
};
$("#test")[0].addProduct("productid");
});
上面的脚本会提示"ID: test - Param: productid"
一个实例:http://jsfiddle.net/jJ65A/1/
或普通javascript
$(function(){
document.getElementById("test").addProduct = function(info){
alert(info);
};
});
我想可能只是在jQuery中使用委托:
$(".parentclass").delegate("childclass","eventname",function(){});
- 为JS函数添加延迟
- 如何向这个javascript/jquery函数添加参数
- 在Jquery中分离后,如何将相同的函数添加回代码中
- 为什么我要将函数添加到对象原型中,而不是将其添加到对象中
- 正在向构造函数添加作用域变量
- 必应地图没有'当我向函数添加另一个参数时,t显示
- 向函数添加多条语句
- 将JS函数添加到并行队列中
- Javascript - 如何向对象构造函数添加属性
- 将点击函数添加到动态 HTML 链接
- 如何将 JavaScript 函数添加到 Active 类中
- 如何将回调函数添加到 .map 方法
- 使用JavaScript函数添加多个DIV元素
- 如何将函数添加到动态创建的Selectable(jqueryui)中
- 将jquery函数添加到Angular ng repeat中
- Javascript对象/名称空间-如何访问从嵌套函数添加的属性(包括示例)
- 如何在javascript中向回调函数添加附加参数
- AngularJS将函数添加到作用域
- 如何在不向现有JavaScript函数添加代码的情况下向该函数添加回调函数
- 原型-var x=[]-将函数添加到x上