DOM库及常用方法封装

节点
| nodeType | nodeName | nodeValue | |
|---|---|---|---|
| 元素节点 | 1 | 大写的标签名 | null |
| 文本节点 | 3 | #text | 文本内容 |
| 注释节点 | 8 | #comment | 注释内容 |
| document | 9 | #document | null |
DOM元素的增、删、改、移动
<div id="box">
<div id="father"></div>
</div>
添加:
容器.appendChild(元素)
将元素添加到指定容器的末尾
var title = document.createElement('h3');
title.innerHTML = 'woshi nibaba';
father.appendChild(title);
容器.insertBefore(新元素,旧元素)
在指定容器内 将新元素插入到旧元素的前面
father.insertBefore(newTit, title);
移除:
容器.removeChild(元素)
在指定容器内 删除元素节点
father.removeChild(title);
替换:
容器.replaceChild(新元素,旧元素)
在指定容器内 用新元素替换掉 旧元素
box.replaceChild(title, father);
联想:参数是新,旧的函数,基本都是新的在前,旧的在后,唯有字符串方法的 str.replace() 第一个参数是旧的(str中的待替换的字符串或者相应的正则表达式),第二个参数是新的(替换成什么)
克隆:
要克隆的元素.cloneNode()
返回值就是克隆后的元素,默认只克隆当前元素 不会克隆子孙后代元素,如果为cloneNode(true) 则会克隆当前元素及子孙后代元素
移动:
利用DOM映射的特性
<div id="outer">
<div id="middle">
<div id="inner"></div>
</div>
</div>
<script>
setTimeout(function(){
outer.appendChild(inner);
}, 2000)
</script>
属性节点
创建:
目标对象.setAttribute("属性名","属性值")
会显示在html元素的标签内
获取:
目标对象.getAttribute("属性名")
自定义属性
obj.name="xxx
不会显示在html中
联想:jquery中获取表单元素自带的属性,比如checked等,需要使用ele.prop('checked'),ele.prop('checked', 'checked'); 不能用attr(),attr一般用于自己添加的属性节点。
// 创建文档碎片
var frg = document.createDocumentFragment();
DOM库
var kirin = (function () {
var isStanderBrowser = !!window.getComputedStyle;
/**
* 类数组转换为数组
* @param likeAry
* @returns {*} 数组
*/
function listToArray(likeAry) {
if (isStanderBrowser) {
return Array.prototype.slice.call(likeAry);
} else {
var ary = [];
for (var i = 0; i < likeAry.length; i++) {
ary[ary.length] = likeAry[i];
}
return ary;
}
}
/* JSON字符串转换为为JSON对象
* @params: JSON字符串
* @return: JSON对象
* */
function jsonParse(jsonStr) {
return window.JSON ? JSON.parse(jsonStr) : eval('(' + jsonStr + ')');
}
/**
* 获取或者设置浏览器盒子模型的属性值
* @param attr 属性
* @param value 值
* @returns 只传属性就是获取值,都传就是设置
*/
function win(attr, value) {
if (typeof value === 'undefined') {
return document.documentElement[attr] || document.body[attr];
}
document.documentElement[attr] = value;
document.body[attr] = value;
}
/**
* 求元素相对于body的偏移量
* @param ele 元素
* @returns {{left: 左偏移, top: 上偏移}}
*/
function offset(ele) {
var l = null;
var t = null;
l += ele.offsetLeft;
t += ele.offsetTop;
var par = ele.offsetParent;
while (par) {
l += par.offsetLeft + par.clientLeft;
t += par.offsetTop + par.clientTop;
par = par.offsetParent;
}
return {left: l, top: t};
}
/**
* 获取元素已经生成的样式值,兼容IE
* @param ele 元素
* @param attr 想要获取样式的属性
* @returns {Number} 样式值
*/
function getCss(ele, attr) {
var val = null;
if (isStanderBrowser) {
val = window.getComputedStyle(ele)[attr];
} else { // ie
if (attr == 'opacity') {
val = ele.currentStyle.filter; // alpha(opacity=55.5)
var reg = /^alpha\(opacity=(\d+(?:\.\d+)?)\)$/;
val = reg.test(val) ? reg.exec(val)[1] / 100 : 1;
} else {
val = ele.currentStyle[attr];
}
}
var reg = /^-?\d+(\.\d+)?(px)?$/;
return reg.test(val) ? parseFloat(val) : val;
}
/**
* 设置盒子模型的css样式
* @param ele 元素
* @param attr 元素样式属性名
* @param value 设置的值
*/
function setCss(ele, attr, value) {
if (attr == 'opacity') {
ele.style.opacity = value;
ele.style.filter = 'alpha(opacity=' + value * 100 + ')';
return;
}
if (attr == 'float') {
ele.style.cssFloat = value;
ele.style.styleFloat = value; //ielow
return;
}
var reg = /width|height|top|left|right|bottom|(margin|padding)(Left|Right|Top|Bottom)?/;
if (reg.test(attr)) {
if (!isNaN(value)) {
value += 'px';
}
}
ele.style[attr] = value;
}
/**
* 根据类名获取元素(兼容ielow)
* @param className 类名
* @param context 确定查询范围,不传是document
* @returns {*} 返回符合的元素集合
*/
function getElesByClass(className, context) {
context = context || document;
if (isStanderBrowser) {
return listToArray(context.getElementsByClassName(className));
}
// for ielow
var classNameAry = className.replace(/(^ +| +$)/g, '').split(/ +/);
var tags = context.getElementsByTagName('*');
var ary = [];
for (var i = 0; i < tags.length; i++) {
var curTag = tags[i];
var isGoodTag = true;
for (var j = 0; j < classNameAry.length; j++) {
var curClass = classNameAry[j];
var reg = new RegExp('(^| +)' + curClass + '( +|$)');
if (!reg.test(curTag.className)) {
isGoodTag = false;
break;
}
}
isGoodTag && ary.push(curTag);
}
return ary;
}
/**
* 批量设置元素样式
* @param ele 元素
* @param group {width: 100px, float: left}
*/
function setGroupCss(ele, group) {
if (Object.prototype.toString.call(group) == '[object Object]') {
for (var key in group) {
setCss(ele, key, group[key]);
}
}
}
/**
* 把getCss、setCss、setGroupCss集成为一个方法
* @param ele 元素名
* @returns {Number} 如果是获取样式,就返回样式值
*/
function css(ele) {
var secondParam = arguments[1];
var thirdParam = arguments[2];
if (typeof secondParam == 'string') {
if (typeof thirdParam == 'undefined') {
return getCss(ele, secondParam);
}
setCss(ele, secondParam, thirdParam);
}
secondParam = secondParam || [];
if (secondParam.toString() == '[object Object]') {
setGroupCss(ele, secondParam);
}
}
/**
* 获取n到m间的随机整数
* @param n
* @param m
* @returns {number}
*/
function getRandom(n, m) {
if (isNaN(n) || isNaN(m)) {
return Math.random();
}
return Math.round(Math.random() * (m - n) + n);
}
/**
* 判断元素是否有一个类名
* @param ele
* @param className
* @returns {boolean}
*/
function hasClass(ele, className) {
return new RegExp('(^| +)' + className + '( +|$)').test(ele.className);
}
/**
* 给元素添加类
* @param ele
* @param className
*/
function addClass(ele, className) {
var classAry = className.replace(/(^ +| +$)/g, '').split(/ +/);
for (var i = 0; i < classAry.length; i++) {
if (!hasClass(ele, classAry[i])) {
ele.className += ' ' + classAry[i];
}
}
}
/**
* 给元素移除类
* @param ele
* @param className
*/
function removeClass(ele, className) {
var classAry = className.replace(/^ +| +$/g, '').split(/ +/);
for (var i = 0; i < classAry.length; i++) {
var curClass = classAry[i];
if (hasClass(ele, curClass)) {
var reg = new RegExp('(^| +)' + curClass + '( +|$)', 'g');
ele.className = ele.className.replace(reg, ' ');
}
}
}
/**
* 获取上一个哥哥元素节点
* @param ele
* @returns {*}
*/
function prev(ele) {
if (isStanderBrowser) {
return ele.previousElementSibling;
}
var pre = ele.previousSibling;
while (pre && pre.nodeType != 1) {
pre = pre.previousSibling;
}
return pre;
}
/**
* 获取下一个弟弟元素节点
* @param ele
* @returns {*}
*/
function next(ele) {
if (isStanderBrowser) {
return ele.nextElementSibling;
}
var nex = ele.nextSibling;
while (nex && nex.nodeType != 1) {
nex = nex.nextSibling;
}
return nex;
}
/**
* 获取所有哥哥元素节点
* @param ele
* @returns {Array.<*>}
*/
function prevAll(ele) {
var ary = [];
var pre = prev(ele);
while (pre) {
ary.push(pre);
pre = prev(pre);
}
return ary.reverse();
}
/**
* 获取所有弟弟元素节点
* @param ele
* @returns {Array}
*/
function nextAll(ele) {
var ary = [];
var nex = next(ele);
while (nex) {
ary.push(nex);
nex = next(nex);
}
return ary;
}
/**
* 获取所有兄弟元素节点
* @param ele
* @returns {Array.<*>}
*/
function siblings(ele) {
return prevAll(ele).concat(nextAll(ele));
}
/**
* 获取当前元素的索引
* @param ele
* @returns {Number}
*/
function index(ele) {
return prevAll(ele).length;
}
function children(ele, tagName) {
var ary = [];
if (isStanderBrowser) {
ary = listToArray(ele.children);
} else {
var childs = ele.childNodes;
for (var i = 0; i < childs.length; i++) {
if (childs[i].nodeType == 1) {
ary.push(childs[i]);
}
}
}
if (typeof tagName == 'string') {
for (var i = 0; i < ary.length; i++) {
if (ary[i].nodeName !== tagName.toUpperCase()) {
ary.splice(i, 1);
i--;
}
}
}
return ary;
}
return {
listToArray: listToArray,
jsonParse: jsonParse,
win: win,
offset: offset,
getCss: getCss,
setCss: setCss,
css: css,
getElesByClass: getElesByClass,
getRandom: getRandom,
hasClass: hasClass,
addClass: addClass,
removeClass: removeClass,
prev: prev,
next: next,
prevAll: prevAll,
nextAll: nextAll,
siblings: siblings,
index: index,
children: children
}
})();
DOM库及常用方法封装的更多相关文章
- 你不需要 jQuery,但你需要一个 DOM 库
写这篇文章的目的,一方面是介绍一下自己编写的模块化 DOM 库 domq.js,另一方面是希望大家对 jQuery 有一个正确的认识,即使 jQuery 已经逐渐退出历史舞台,但是它的 API 将会以 ...
- java Map常用方法封装
java Map常用方法封装 CreationTime--2018年7月16日15点59分 Author:Marydon 1.准备工作 import java.util.HashMap; impo ...
- HttpClient 常用方法封装
简介 在平时写代码中,经常需要对接口进行访问,对于 http 协议 rest 风格的接口请求,大多使用 HttpClient 工具进行编写,想着方便就寻思着把一些常用的方法进行封装,便于平时快速的使用 ...
- 手写一个虚拟DOM库,彻底让你理解diff算法
所谓虚拟DOM就是用js对象来描述真实DOM,它相对于原生DOM更加轻量,因为真正的DOM对象附带有非常多的属性,另外配合虚拟DOM的diff算法,能以最少的操作来更新DOM,除此之外,也能让Vue和 ...
- 大家都能看得懂的源码 - 那些关于DOM的常见Hook封装(一)
本文是深入浅出 ahooks 源码系列文章的第十四篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 上一篇我们探讨了 ahooks 对 DOM 类 Hooks 使用 ...
- 大家都能看得懂的源码 - 那些关于DOM的常见Hook封装(二)
本文是深入浅出 ahooks 源码系列文章的第十五篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本篇接着针对关于 DOM 的各个 Hook 封装进行解读. us ...
- JS基石之-----常用方法封装的js库
解析 URL Params 为对象 let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E ...
- 对xlslib库与libxls库的简易封装
一.简介 xlslib库是用来创建excel文件.libxls是用来读取excel文件的,在使用C++或者QT语言来设计对excel文件的读取.都需要事先下载这两个库编译成功后再进行程序设计的.之所以 ...
- MyBridgeWebViewDemo【集成JsBridge开源库的的封装的webview】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用的是第三方库lzyzsd/JsBridge,但是不同的是,将自己封装的MyBridgeWebView通过继承BridgeWebV ...
随机推荐
- iOS开发之解决CocoaPods中“.h”头文件找不到的问题,简单粗暴的方法
如果是拖进工程中的framework或者第三方文件,如果找不到,删除了重新添加或者修改search path地址,如果不知道怎么修改,在工程文件夹中,找到对应的文件,然后将文件拖到修改文件地址的位置, ...
- Jmter安装和配置
一.安装JDK 安装JDK 选择安装目录 安装过程中会出现两次安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文 ...
- iOS数组的去重,判空,删除元素,删除重复元素 model排序 等
一: 去重 有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型.今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下. 1.利用NSDiction ...
- Linux下升级安装Python-3.6.2版本
本文主要介绍在Linux(CentOS)下将Python的版本升级为3.6.2的方法 众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的 ...
- 正确的使用margin:0 auto与body{text-align:center;}实现元素居中(转)
body{text-align:center}与margin:0 auto的异同? text-align是用于设置或对象中文本的对齐方式.一般情况下我们设置文本对齐方式的时候需要用此属性进行设置 我们 ...
- 【Python爬虫学习笔记(1)】urllib2库相关知识点总结
1. urllib2的opener和handler概念 1.1 Openers: 当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例).正常情况下,我们使 ...
- discuz数据库迁移,改密码后,相关配置文件修改
网上看到这篇文章,觉得有用就收藏下 网站系统需要修改的位置有两处 Discuz 和 UC-center ①路径:/wwwroot/config/config_global.php 这个根据你网站安装的 ...
- Android:BroadcastReceiver
参考:<第一行代码:Android> 郭霖(著) Broadcast分类 注册方式: 动态广播 在代码中注册receiver 一定要手动在onDestroy()时调用unregiste ...
- BZOJ4832: [Lydsy1704月赛]抵制克苏恩(记忆化&期望)
Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 ...
- 【DUBBO】Dubbo原理解析-服务发布
转载:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41651205 服务发布方在spring的配置文件中配置如下: <bean ...