在JavaScript中重写jQuery对象的方法实例教程


Posted in Javascript onAugust 25, 2014

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>

希望本文所述对大家的web前段设计有所帮助。

Javascript 相关文章推荐
javascript String 的扩展方法集合
Jun 01 Javascript
js 处理数组重复元素示例代码
Dec 27 Javascript
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
javascript事件模型介绍
May 31 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
Vue2.0 http请求以及loading展示实例
Mar 06 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
May 07 Javascript
深入理解Node内建模块和对象
Mar 12 Javascript
JavaScript实现星级评价效果
May 17 Javascript
微信小程序实现批量倒计时功能
Nov 01 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
一个支持任意尺寸的图片上下左右滑动效果
Aug 24 #Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 #Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 #Javascript
js获取checkbox复选框选中的选项实例
Aug 24 #Javascript
jQuery异步加载数据并添加事件示例
Aug 24 #Javascript
Jquery通过JSON字符串创建JSON对象
Aug 24 #Javascript
Jquery中扩展方法extend使用技巧
Aug 24 #Javascript
You might like
php mssql 时间格式问题
2009/01/13 PHP
php+mysql事务rollback&amp;commit示例
2010/02/08 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
php内嵌函数用法实例
2015/03/20 PHP
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
js表单登陆验证示例
2016/10/19 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
Python简单实现Base64编码和解码的方法
2017/04/29 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
五种Python转义表示法
2020/11/27 Python
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
给领导的致歉信范文
2014/01/13 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
党支部活动策划方案
2014/08/18 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
Python 中random 库的详细使用
2021/06/03 Python
MySQL的Query Cache图文详解
2021/07/01 MySQL
MySQL GTID复制的具体使用
2022/05/20 MySQL
redis lua限流算法实现示例
2022/07/15 Redis