JS写出兼容性Dom操作

一、前言

因为一个很小的项目或者说几个页面却要搭上Jquery,当然很不值,gzip下,好歹也有小几十K。为了能够方便的操作Dom,我们需要写很多兼容性的原生JS。就在我看leaflet的源码的时候,我觉得它的DomUtil写的还是不错的。

二、具体的代码分析

 首先,我们定义一个类,var DomUtil = {  functionName: function(){ }  }; 以下均已字面量的形式表示。

(1)get: 获取一个元素

get: function (id) {         return
			typeof id === 'string' ? document.getElementById(id) : id;     }

很简单吧,只是粗略的返回是元素或者传进来的参数。

(2)getStyle:获取元素的样式

 getStyle: function (el, style) {
        //IE: currentStyle
        //firefox: defaultView
        var value = el.style[style]  (el.currentStyle && el.currentStyle[style]);

        if ((!value  value === 'auto') && document.defaultView) {
            var css = document.defaultView.getComputedStyle(el, null);
            value = css ? css[style] : null;
        }

        return value === 'auto' ? null : value;
    }

(3)create:创建一个元素(可以将其放入父元素)

//创建一个元素(可以将其放入父元素)     create: function (tagName, className, container) {         var el = document.createElement(tagName);         el.className = className;         //是否存在父容器         if (container) {             container.appendChild(el);         }

        return el;     }

(4)remove:移除元素

//移除元素     //先获取父元素,然后父元素移除子元素     remove: function (el) {         var parent = el.parentNode;         if (parent) {             parent.removeChild(el);         }     }

(5)empty:清空元素内部子元素

 //清空元素内部子元素     empty: function (el) {         while (el.firstChild) {             el.removeChild(el.firstChild);         }     }

(6)toFront:将元素取出放在队尾或者说是叠加层的最上面,就像加饼一样,一层一层往上放,但是如果引用的是同一个元素,则在父容器中有且仅存在一个元素。

//置于顶上
    toFront: function (el) {
        el.parentNode.appendChild(el);
    }

(6)toBack:置于队首或者叠加层底部。

    //置于底部
    toBack: function (el) {
        var parent = el.parentNode;
        //insertBefore:insertBefore(newchild,refchild)
        parent.insertBefore(el, parent.firstChild);
    }

(7)hasClass:是否有CSS样式

//返回class集合
    getClass: function (el) {
        return el.className.baseVal === undefined ? el.className : el.className.baseVal;
    }

className.baseVal是获取SVG的一个方法,className是获取带空格类名的集合。

//是否有CSS类
    hasClass: function (el, name) {
        //先判断是否支持了classList,classList包含了has、add、remove等方法
        if (el.classList !== undefined) {
            return el.classList.contains(name);
        }
        var className = L.DomUtil.getClass(el);
        return className.length > 0 && new RegExp('(^\\s)' + name + '(\\s$)').test(className);
    }

上面代码第8行,用正则test测试字符串是否含有此模式。

(8)addClass:增加类样式

//设置class     setClass: function (el, name) {         if (el.className.baseVal === undefined) {             el.className = name;         } else {             // in case of SVG element             el.className.baseVal = name;         }     }
//增加类串
    addClass: function (el, name) {
        if (el.classList !== undefined) {
            var classes = L.Util.splitWords(name);
            for (var i = 0, len = classes.length; i < len; i++) {
                //调用classList的add
                el.classList.add(classes[i]);
            }
        } else if (!L.DomUtil.hasClass(el, name)) {
            var className = L.DomUtil.getClass(el);
            //setClass,覆盖之前的类串
            L.DomUtil.setClass(el, (className ? className + ' ' : '') + name);
        }
    }

(9)removeClass:移除class

//移除class     removeClass: function (el, name) {         if (el.classList !== undefined) {             el.classList.remove(name);         } else {             //以字符串的形式替换             L.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' ')));         }     }

(10)设置透明度

 //设置透明度
    setOpacity: function (el, value) {
        //如果存在opactity的属性
        if ('opacity' in el.style) {
            el.style.opacity = value;

        } else if ('filter' in el.style) {//存在filter

            var filter = false,
                filterName = 'DXImageTransform.Microsoft.Alpha';

            // filters collection throws an error if we try to retrieve a filter that doesn't exist
            try {
                filter = el.filters.item(filterName);
            } catch (e) {
                // don't set opacity to 1 if we haven't already set an opacity,
                // it isn't needed and breaks transparent pngs.
                if (value === 1) { return; }
            }

            value = Math.round(value * 100);

            if (filter) {
                filter.Enabled = (value !== 100);
                filter.Opacity = value;
            } else {
                el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
            }
        }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索el
, function
, js json el
, 元素
, name
, value
, classname
, js获取元素classname
, leaflet
, 移除name
移除CSS类
js dom操作、angularjs操作dom元素、angularjs dom操作、vuejs操作dom项目例子、vue.js dom操作,以便于您获取更多的相关知识。

时间: 2024-08-29 10:21:03

JS写出兼容性Dom操作的相关文章

如何写出兼容性很好的页面

写出好的页面前首先你要把HTML4与HTML5学会了,然后CSS,CSS3也有一定的掌握. 通常情况下,不同类型的网站都去认认真真的排版后,对前端就有一定的掌握程度,对写静态页面问题就不大了.至于个数嘛,3个完整网站以上. 提醒:如果要写出非常好的页面,js是必不可少的,这对初学前端的人来说,就有点难度了,但也别胆怯,按照学习的先后进度来学习,先学HTML+CSS,再学习HTML5+CSS3,学到一定程序后,再去接触javascript,我相信就算是自学,HTML+CSS 2个月左右,javas

js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动_javascript技巧

用JS写出遮罩层登陆框和对联广告并自动跟随滚动条滚动保持让用户一直可以看到 好了,天色已晚废话不多说,代码特别详细 有注释,请看代码. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://

简单实现JS对dom操作封装_javascript技巧

这篇文章主要介绍了JS简单实现对dom操作封装,下面就直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>

javascript-js里大量的DOM操作,性能会大量损失吗?

问题描述 js里大量的DOM操作,性能会大量损失吗? 如题,比如大量的创建DMO节点.字符串拼接等,这些会造成大量的性能损失吗?请详细解释一下,谢谢 解决方案 dom操作肯定是占资源的,大量dom操作最好是创建DocumentFragment,然后修改好DocumentFragment后再一次行插入到dom树中,而不是每次都appendChild,innerHTML+=进行操作 http://www.zhihu.com/question/27260165 解决方案二: 会 dom操作本身就比较损

如何判断出一个js对象是否一个dom对象_javascript技巧

我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有DOM对象的各种属性或特征,比如是否有nodeType属性,有tagName属性,等等.判断的特征越多,也就越可靠,因为毕竟我们自定义的js对象也可以有那些属性.还有其他方法吗? 在DOM Level2标准中定义了一个HTMLElement对象,它规定所有的DOM对象都是HTMLElement的实例,

DOM操作原生js 的bug,使用jQuery 可以消除的解决方法_javascript技巧

js的 bug 类型:  Uncaught TypeError:Cannot set/read property 'xxx' of null 在进行DOM操作的时候比较容易发生这个错误,比如: 1.  document.getElementById('test1').style.display='none' 2.  document.getElementById('test1').onclick=function(){/*相关代码*/} 假如DOM中无此 test1对象,将会抛出上面的错误,发生

ie 10-iE 10 的兼容性问题 有一个页面 用用js写的 用IE10打开的时候 无法正常显示

问题描述 iE 10 的兼容性问题 有一个页面 用用js写的 用IE10打开的时候 无法正常显示 iE 10 的兼容性问题 有一个页面 用用js写的 用IE10打开的时候 无法正常显示 但是点击切换兼容性视图就能正常显示了 有什么办法 让他一加载这个页面就自动切换为 兼容性视图 解决方案 这种显示问题,如果不同浏览器不兼容的话,肯定的代码问题.你看下你的代码对于相应的div或者样式框都没有设置高和宽 解决方案二: IE11能跑IE10应该没问题吧..如果是ckeditor.js报错,建议你升级c

前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)_jquery

项目背景:.Net 3.5+MySQL+jQuery+WebService 在公司做这个项目已经6个多月了,总结一些问题,也算是抛砖引玉吧,希望园子里更多的朋友一起分享一些技巧. 1. WebService方法返回值不能为void. 当WebService方法返回值为void时,FF和Chrome会持续等待,认为这个请求没有结束,而在IE中一切是正常的. 2.当input的type="button"时或者使用button时,点击后会触发form的submit. 当时查找页面刷新的问题找

js中confirm实现执行操作前弹出确认框的方法_javascript技巧

本文实例讲述了js中confirm实现执行操作前弹出确认框的方法.分享给大家供大家参考.具体实现方法如下: 现在在删除或其它操作前弹出确定提示,我们有很多方法,最基本的就是利用js自带的函数confirm来操作了 最简单的用法如下: 鼠标事件使用confirm 复制代码 代码如下: <a href="#" onclick= "if(confirm( '是否确定! ')==false)return   false; ">点击确定</a> 想简单