jQuery原理系列-常用Dom操作详解


Posted in Javascript onJune 07, 2016

1. 事件绑定$(el).bind

ie使用attachEvent,其它浏览器使用addEventListener,不同的是ie多了个on前缀,this绑定在window上,需要用call和apply修正this 的指向。

if (element.addEventListener) {
    element.addEventListener(type, handler, useCapture);
  } else {
    if (element.attachEvent) {
      element.attachEvent("on" + type, function(e){
         handler.call(element,e);
       });
    }
  }

2.获取偏移量 $(el).position();

相对于包含块的偏移量,直接取offsetLeft,offsetTop

{left: el.offsetLeft, top: el.offsetTop}

3.获取相对于根元素的绝对位置$(el).offset()

调用dom元素的getBoundingClientRect方法,这个是鲜为人知的。

var rect = el.getBoundingClientRect();
{
 top: rect.top + document.body.scrollTop,
 left: rect.left + document.body.scrollLeft
}

4.修改css样式 $(el).css({color:"red"})

style属性是无法直接赋值的,但是给style.cssText属性赋值,可以直接赋值到style属性中,为了不覆盖原有的style,我们在原有的cssText后面追加字符

el.style.cssText+="background:red";

5.修改和获取自定义属性$(el).attr(name,val),

dom元素的getAttribute和setAttribute可以修改dom的自定义属性,

el.getAttribute(name)

el.setAttribute(name,val);

另外,jquery还有一个prop方法在设置dom节点的固有属性,例如checkbox,radio的checked属性时,用attr可能设置不成功,这时需要用prop ,prop只能用来读写固有属性,而attr是固有属性和自定义都可以,但是有些特殊的固有属性设置不成功时需要用prop

6.向上查找元素  $(el).parents(selector),$(el).closest(selector)

向上查找元素非常有用,原理是遍历parentNode一直到根节点,判断每一级父节点是否与选择器相匹配,

高级浏览器通过matchesSelector 判断一个dom元素是否匹配某个css 选择器,不同的浏览器有不同的前缀,

var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector ||
element.oMatchesSelector || element.matchesSelector

低版本的ie需要自己实现选择器的判断,为了简化问题,仅以id选择器为例,其它选择器雷同(判断tagName,className,getAtrrbuite等)

var el=current,selector="#id1";
while(el.parentNode!=null){
if("#"+el.id==selector){ //el.webkitMatchesSelector(selector)
return el;
}
el=el.parentNode;
}

7.事件委托 $(selector).live("click",callback)

jQuery的live事件绑定机制非常强大,普通的bind只能在dom元素生成后才能绑定事件,而live则可以在任何时候,即使元素还没有生成时就能绑定事件,使用起来相当的多块好省,live的原理自然是通过事件委托(事件代理)实现的,事件委托是指在父元素或根元素上绑定事件,事件委托可以提升性能,只需要一个点击事件绑定就能处理所有元素的点击事件。通过事件冒泡监听,判断当前点击的元素event.target如果是要查找的目标元素,则触发事件回调函数,event.target只有一个,这会带来一个问题,例如一个li元素包含一个a链接,我想在li元素上绑定事件监听a链接的点击,直接通过event.target是不行的,需要查找父级元素,这就需要借助上一步封装的parents或closest查找父级如果是匹配的目标元素,也要触发事件回调,示例代码如下:

function live(selector,callback){
document.body.addEventListener("click",function(e){
var target=e.target || e.srcElement;
var list=closest(target,selector);//向上查找选择器,需要借助上一步封装的closest或parents函数
if(list.length>0){
callback.call(target,e);
}
});

}

8.判断元素可见性 $(el).is(":visible")

这个是jquery特有的伪类:visible,只要当前元素或其父节点不可见,就会返回false,和向上查找元素的原理一样,一直向上查找到根节点,如果有style.display为none的,或style.visiblity为hidden的祖先元素则返回false,否则返回true,获取style不能直接使用style属性,因为有些样式可能是定义在css文件中的,使用window.getComputedStyle(element)可以得到一个dom元素的计算样式,在ie8以下使用currentStyle获取。

以上这篇jQuery原理系列-常用Dom操作详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用原生JavaScript实现jQuery的$.getJSON的解决方法
May 03 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
May 14 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
浅谈javascript:两种注释,声明变量,定义函数
Oct 05 Javascript
详解vue.js组件化开发实践
Dec 14 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
Mar 02 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
微信小程序tabBar用法实例详解
Dec 04 Javascript
详解Node 定时器
Feb 26 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
Jun 21 Javascript
浅析BootStrap栅格系统
Jun 07 #Javascript
浅谈jQuery 选择器和dom操作
Jun 07 #Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 #Javascript
DOM操作和jQuery实现选项移动操作的简单实例
Jun 07 #Javascript
Knockoutjs 学习系列(二)花式捆绑
Jun 07 #Javascript
Knockoutjs 学习系列(一)ko初体验
Jun 07 #Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 #Javascript
You might like
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php实现的SESSION类
2014/12/02 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python 下载文件的几种方法汇总
2021/01/06 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
测量实习生自我鉴定
2013/09/19 职场文书
大学生入党思想汇报
2014/01/01 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
社会实践评语
2014/04/28 职场文书
住宅质量保证书
2014/04/29 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
五年级作文之想象作文
2019/10/30 职场文书
Docker安装MySql8并远程访问的实现
2022/07/07 Servers