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 相关文章推荐
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
jQuery判断当前点击的是第几个li的代码
Sep 26 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
Nov 13 Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 Javascript
微信小程序 教程之引用
Oct 18 Javascript
理解 javascript 中的函数表达式与函数声明
Jul 07 Javascript
微信小程序实现预览图片功能
Oct 22 Javascript
JS异步错误捕获的一些事小结
Apr 26 Javascript
使用layui的router来进行传参的实现方法
Sep 06 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
Oct 17 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
PHP 502bad gateway原因及解决方案
Nov 13 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
js获取url中"?"后面的字串方法
2014/05/15 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
python如何定义带参数的装饰器
2018/03/20 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python使用代理ip访问网站的实例
2018/05/07 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
Python将string转换到float的实例方法
2019/07/29 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
学习群众路线的心得体会
2014/11/05 职场文书
python 详解turtle画爱心代码
2022/02/15 Python