在JavaScript中重写jQuery对象的方法教程实例教程教程
程序员文章站
2022-05-29 13:04:32
jquery是一个款非常优秀的类库,它给我们解决了很多的客户端,但是任何东西都不是万能的,当它不能满足我们的需求时我们就需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的...
jquery是一个款非常优秀的类库,它给我们解决了很多的客户端,但是任何东西都不是万能的,当它不能满足我们的需求时我们就需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的功能;比如我现在的web应用程序大多数时候的数据交互都是通过ajax来完成的,这样就可以将一些隐藏字段的数据保存在html标签的属性中,使html标签的代码量减少,如:id,timestamp等等,这些不需要用户输入但又不得不提交的字段,通过表单提交的做法是
<input name="id" value="343" type="hidden" />
把id的值保存在一个隐藏标签中,然后随表单提交。
代码如下所示:
<p> <label data-field="id" data-property="data-id" data-id="343">first name</label><input type="text" data-field="firstname" /> </p>
注意蓝色的部分这个属性名称请不要太在意,您完全可以取一些更简洁名字,现在我们来重写jquery的val方法来读取和设置data-id的值,给$.prototype.val重新定义一个函数,以闭包的形式将基类函数传入,以便在新函数中调用它,看下面这段代码:
<script> $.prototype.val = function (base) { return function () { var s = this, a = "data-property", p = s.attr(a), isset = arguments.length > 0, v = isset ? arguments[0] : null; //这里调用基类方法,当然基类方法在何时调用或者是否要调用取决于您的业务逻辑,在这里我们是要调用的,因为要保持它原有的功能。 if (isset&&typeof(base)=="function") { base.call(s, v); } else { v = base.call(s); } if (p) { if (isset) { s.attr(p, v); return s } else { return s.attr(p) } } else { if (!s.is(":input")) { if (isset) { s.text(v); return s; } else { return s.text(); } } else { return isset ? s : v; } } } //在这里传入基类方法 }($.prototype.val); </script>
这个重写了之后,当在标签中指定了data-property属性时,jquery对象调用val() 等同于调用attr("data-property"),但没有指定data-property也就是默认情况下,如果是非表单元素则是val()等同于text(),如果是表单元素则保持原来的功能也就是读写value属性的值,这样就可以通过这种方式:$("[data-field='id']").val(345)和$("[data-field='id']").val() 读取或者设置它的值了,“data-field” 这个属性将会映射到服务器上对应类型的字段中,关于重写javascript中的jquery的方法就到这里了,其他方法的重写是异曲同工的,大家可以举一反三的思考。
全部代码如下:
<!doctype html> <html xmlns="https://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>在javascript中重写对象的方法</title> <script src="scripts/jquery-1.8.2.min.js"></script> <script src="scripts/jquery-ui-1.8.24.min.js"></script> <script> $.prototype.val = function (base) { return function () { var s = this, a = "data-property", p = s.attr(a), isset = arguments.length > 0, v = isset ? arguments[0] : null; if (isset&&typeof(base)=="function") { base.call(s, v); } else { v = base.call(s); } if (p) { if (isset) { s.attr(p, v); return s } else { return s.attr(p) } } else { if (!s.is(":input")) { if (isset) { s.text(v); return s; } else { return s.text(); } } else { return isset ? s : v; } } } }($.prototype.val); </script> </head> <body> <span id="lbl">hello world!</span> <input type="text" id="txt" value="hello world" /> <input type="checkbox" value="哈哈哈。。。" /> </body> </html>
推荐阅读
-
在JavaScript中操作时间之getYear()方法的使用教程
-
jQuery中ajax的get()方法用法实例教程
-
jQuery中ajax的post()方法用法实例教程
-
jQuery中ajax的load()方法用法实例教程
-
jquery中animate的stop()方法作用实例教程分析
-
jquery中one()方法的用法实例教程
-
JavaScript编程开发中jquery中post方法用法实例教程
-
原生js实现复制对象、扩展对象 类似jquery中的extend()方法教程
-
在JavaScript中重写jQuery对象的方法教程实例教程教程
-
在JavaScript中操作时间之getYear()方法的使用教程