jQuery是一个很好的类库,它给我们解决了很多的客户端编程,任何东西都不是万能的,当它不能满足我们的需求时我们需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的功能;我现在的web应用程序大多数时候的数据交互都是通过Ajax来完成的,这样就可以将一些隐藏字段的数据保存在HTML标签的属性中,使HTML标签的代码量减少,如:ID,Timestamp等等,这些不需要用户输入但又不得不提交的字段,通过表单提交的做法是 <input name="ID" value="343" type="hidden" /> 把ID的值保存在一个隐藏标签中,然后随表单提交。

<div>

<label data-field="id" data-property="data-id" data-id="343">First Name</label><input type="text"  data-field="FirstName" />

</div>

注意蓝色的部分这个属性名称请不要太在意,您完全可以取一些更简洁名字,现在我们来重写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="http://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>

最新文章

  1. [LeetCode] Valid Number 验证数字
  2. sharepoint2013用场管理员进行文档库的爬网提示&quot;没有权限,拒绝&quot;的解决方法
  3. iOS //清除本地缓存
  4. 由于某IP大频率提交评论导致服务器宕机
  5. HTML &lt;!DOCTYPE&gt; 标签 布局引用的几种方法 行级元素与块级元素
  6. hive的常用命令
  7. 3. Windows根据端口查进程---ADB 相关报错 ADB server didn&#39;t ACK cannot bind &#39;:5037&#39;
  8. 如何获得iphone设备的剩余空间
  9. Linux下搭建Oracle11g RAC(9)----创建RAC数据库
  10. java.io.serializable
  11. Qt深入:不能不知道的Type、Attribute和Flags
  12. Codeforces Round#344
  13. [放松一下] 经典高清电影合集 170G BT种子下载
  14. Orchard网上商店模块
  15. Java对象与类中的一个小练习
  16. php下redis的安装教程
  17. java项目部署常用linux命令
  18. Django+Vue打造购物网站(九)
  19. js实现根据文本下标位置添加特殊标识
  20. BeanWrapper

热门文章

  1. Hibernate(五)
  2. request内置对象在JSP
  3. nest
  4. MVC SignalR Hub初学
  5. ZOJ3084_S-Nim
  6. ios基础动画、关键帧动画、动画组、转场动画等
  7. 【Mybatis】简单的mybatis增删改查模板
  8. java利用poi读取excel异常问题
  9. BZOJ4974 字符串大师(kmp)
  10. P2766 最长不下降子序列问题