如何向某些 jQuery 对象添加函数,而不向其他对象添加函数?

2024-02-28

假设我有一个<ul> list:

<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 and deleteProduct方法来突出这一点singlejQuery 对象,那么你所拥有的就可以正常工作;但是你必须保留对该 jQuery 对象的引用/只使用它一次,以保留该对象的存在addProduct and deleteProduct方法。

然而,这些addProduct and 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 and deleteProduct函数,它接受 jQuery 对象。如果您想将这些功能限制为仅适用于ul.products选择器,你可以这样做;

function addProduct(obj) {
    obj = obj.filter('ul.products');

    // do something with `obj` (its a jQuery object)
}

建议采用这种方法,因为它可以保持jQuery.fnAPI一致;否则你会添加addProduct and removeProduct to some jQuery.fn实例而不是其他实例,或者使它们的使用在其他实例中变得多余。然而采用这种方法addProduct and removeProduct总是在那里,但如果他们不想使用它们,请不要妨碍任何人。


历史笔记

这个答案最初写于 2011 年 11 月,当时 jQuery 1.7 发布。从那时起,API 发生了很大变化。上面的答案与currentjQuery 2.0.0 版本。

在1.9之前,有一个很少使用的方法叫做jQuery.sub http://api.jquery.com/jQuery.sub/曾经存在过,即related到你想要做的事情(但不会帮助你,除非你改变你的方法)。这会创建一个新的 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 中删除。现在可以使用了作为插件 http://jquery.com/upgrade-guide/1.9/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向某些 jQuery 对象添加函数,而不向其他对象添加函数? 的相关文章

  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 如何让 jquery Tooltipster 插件适用于新创建的 DOM 元素?

    我正在使用 Tooltipster 插件http calebjacob com tooltipster http calebjacob com tooltipster 这很棒 但我已经动态生成了插入到 DOM 中的内容 工具提示程序似乎没有
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • IE 中的 jQuery .width(val) 错误 - 无效参数

    通过ajax加载内部div book table 后 我想调整正文的宽度以适应更大的内容 var new width parseInt book table css width 407 body width new width 在 FF 和
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • Select2 下拉列表动态添加、删除和刷新项目

    这让我发疯 为什么 Select2 不能在其页面上实现清晰的方法或示例如何在 Select2 上进行简单的 CRUD 操作 我有一个 select2 从 ajax 调用获取数据
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas

随机推荐

  • 尝试使用 Firebase 进行电话身份验证时出现 FirebaseAuthInvalidUserException。 (ERROR_INVALID_USER_TOKEN)

    当我尝试使用测试仪电话号码 通过 firebase 对用户进行身份验证时 出现以下异常 当我尝试发送 OTP 时收到以下警告 W BiChannelGoogleApi FirebaseAuth getGoogleApiForMethod r
  • 如何设置拖动X限制

    我正在研究一些可拖动 可放置的栏 因此它只能拖动 x 因为这是选择栏 问题是选择按钮可拖动超出舞台限制 我只想在阶段限制内拖动 我尝试了一些方法 hitTestPoint 和 newshape 但它不起作用 define lock on y
  • 如何在python中将MPI信息传递给ctypes

    我的动机是将 MPI 信息有效地从 python 传递到通过 ctypes 调用的 C 函数 我在 python 中使用 mpi4py 进行 MPI 绑定 我想通过一个用 C 编写并通过 python 中的 ctypes 调用的简单示例 M
  • 有没有办法确定 Android 应用程序是在运行时进行生产签名还是调试签名?

    有没有办法确定 Android 应用程序是在运行时进行生产签名还是调试签名 private static Boolean isDebugBuild null protected boolean isDebugBuild if isDebug
  • Pip 安装到自定义目标目录并排除特定依赖项

    我正在寻找一种使用 pip 或类似方法将 python 包列表安装到自定义目标目录 例如 mypath python pkgs 的方法 但也排除 黑名单specific依赖关系 我想排除特定的依赖项 因为它们已经从不同的安装路径 例如 an
  • keras的model.fit中tf.Print没有结果

    我写了那个损失 用于测试 keras 中的自定义损失 def loss y true y pred loss tf reduce sum y true tf log y pred loss tf Print loss loss loss r
  • 如何在python中删除文件的部分内容?

    我有一个名为 a txt 的文件 如下所示 我是第一线我是第二线 这里可能还有更多行 我在空行下方 我是一条线更多线路在这里 现在 我想删除空行上方的内容 包括空行本身 我怎样才能以 Pythonic 的方式做到这一点 基本上 您无法从文件
  • 嵌入式 Jetty - 启动 Jetty 服务器后添加上下文

    在没有指定上下文和上下文处理程序的情况下启动jetty实例 然后在服务器启动后继续向其添加上下文是否正确 尽管我能够使用可变的 HandlerCollection 来执行此操作 并且日志显示服务器和上下文已启动且可用 但我无法使用 URL
  • 在设计时隐藏私有子控件属性

    我有一个带有一些私有子控件的容器控件 如何在设计时隐藏属性浏览器以显示控件 它还在设计时在每个控件上显示一个锁和一个方形图标 我尝试为控件设置
  • PHP中HTTP请求完成后执行代码?

    PHP提供了注册关闭函数的机制 register shutdown function shutdown func 问题是在最新版本的 PHP 中 该函数仍然在请求期间执行 我有一个平台 如果重要的话 在 Zend Framework 中 整
  • Ehcache并发修改异常+Spring+Struts应用

    在我的应用程序中 ehcache 配置如下 应用程序数据区域 java import statements public class AppDataRegion Variable for region identifier private
  • Android RSA 加密与 OAEP 使用 SHA-256 进行主摘要和 MGF1 摘要

    根据规范 我需要对两个摘要 主摘要和 MGF1 摘要 使用带有 SHA 256 的 RSA ECB OAEPPadding 密码 安卓密码学 https developer android com guide topics security
  • java try 块的范围应该尽可能严格吗?

    有人告诉我 使用 Java try catch 机制会产生一些开销 因此 虽然有必要将抛出已检查异常的方法放入 try 块中来处理可能的异常 但从性能角度来看 限制 try 块的大小以仅包含那些可能抛出异常的操作是一种很好的做法 我不太确定
  • 在数据库表中存储视图计数

    每次访问数据库记录时存储视图计数的适当且最有效的方法是什么 我有桌子ITEMS包含以下字段 id item name 每个项目都有自己的永久链接 http domain com item name http domain com item
  • CSS 动画属性在动画后保留

    我试图让 CSS 动画属性在完成后保留 这可能吗 这就是我正在努力实现的目标 当用户登陆页面时 该元素应该隐藏 3秒后 或其他时间 它应该淡入 一旦动画完成 它应该停留在那里 这是一个小提琴尝试 http jsfiddle net GZx6
  • SVN将服务器端的数据存储在哪里?

    我已经在我的 Web 主机服务器上创建了一个 svn 存储库 并成功向其中提交文件并更新了文件 但我似乎实际上无法在服务器上找到这些文件 我的 svn 仓库位于 svn my first repo 其中包含以下内容 README txt c
  • 在 Python 中将图像中的颜色映射到颜色列表中最接近的成员

    我有一个 19 种颜色的列表 它是一个大小为 numpy 的数组 19 3 colors np array 0 0 0 0 0 255 255 0 0 150 30 150 255 65 255 150 80 0 170 120 65 12
  • 如何使用 iTextSharp 获取 pdf 文件中的部分目标页码?

    我有一个 pdf 文件 其中包含索引页 其中包含目标页面部分 我可以获得章节名称 第 1 1 节 第 5 2 节 但无法获取目标页码 For ex http www mikesdotnetting com Article 84 iTextS
  • 使用 VB.NET 创建 ODBC DSN

    我想为数据库创建 ODBC DSN 每当用户设置应用程序时 该数据库将包含在我的应用程序文件夹中 我想知道如何使用所有必需的参数创建 ODBC 以便运行安装程序时要做的第一件事是将数据库连接到应用程序 我尝试过使用默认的 VB NET 安装
  • 如何向某些 jQuery 对象添加函数,而不向其他对象添加函数?

    假设我有一个 ul list ul class products ul 我想用 jQuery 选择它 然后向该对象添加一些函数 例如 我想添加一个addProduct productData 函数和一个deleteProduct produ