通过JS动态创建一个html DOM元素并显示


Posted in Javascript onOctober 15, 2014

近日,因工作需要,需要通过点击某个元素后, 动态创建一个DOM元素并显示,因此写了一些相关的JS函数,在此记录,以作备忘:

/**//* 
动态创建DOM元素的相关函数支持 
www.jcodecraeer.com 
*/ 
/**//* 
获取以某个元素的DOM对象 
@obj 该元素的ID字符串 
*/ 
function getElement(obj) 
{ 
return typeof obj=='string'?document.getElementById(obj):obj; 
} 
/**//* 
获取某个元素的位置 
@obj 该元素的DOM对象,或该元素的ID 
*/ 
function getObjectPosition(obj) 
{ 
obj=typeof obj==='string'?getElement(obj):obj; 
if(!obj) 
{ 
return; 
} 
var position=''; 
if(obj.getBoundingClientRect) //For IEs 
{ 
position=obj.getBoundingClientRect(); 
return {x:position.left,y:position.top}; 
} 
else if(document.getBoxObjectFor) 
{ 
position=document.getBoxObjectFor(obj); 
return {x:position.x,y:position.y}; 
} 
else 
{ 
position={x:obj.offsetLeft,y:obj.offsetTop}; 
var parent=obj.offsetParent; 
while(parent) 
{ 
position.x+=obj.offsetLeft; 
position.y+=obj.offsetTop; 
parent=obj.offsetParent; 
} 
return position; 
} 
} 
/**//* 
为某个DOM对象动态绑定事件 
@oTarget 被绑定事件的DOM对象 
@sEventType 被绑定的事件名,注意,不加on的事件名,如 'click' 
@fnHandler 被绑定的事件处理函数 
*/ 
function addEventHandler(oTarget, sEventType, fnHandler) 
{ 
if (oTarget.addEventListener) 
{ 
oTarget.addEventListener(sEventType, fnHandler, false); 
} 
else if (oTarget.attachEvent) //for IEs 
{ 
oTarget.attachEvent("on" + sEventType, fnHandler); 
} 
else 
{ 
oTarget["on" + sEventType] = fnHandler; 
} 
} 
/**//* 
从某个DOM对象中去除某个事件 
@oTarget 被绑定事件的DOM对象 
@sEventType 被绑定的事件名,注意,不加on的事件名,如 'click' 
@fnHandler 被绑定的事件处理函数 
*/ 
function removeEventHandler(oTarget,sEventType,fnHandler) 
{ 
if(oTarget.removeEventListener) 
{ 
oTarget.removeEventListener(sEventType,fnHandler,false) 
} 
else if(oTarget.detachEvent) //for IEs 
{ 
oTarget.detachEvent(sEventType,fnHandler); 
} 
else 
{ 
oTarget['on'+sEventType]=undefined; 
} 
} 

/**//* 
创建动态的DOM对象 
@domParams是被创建对象的属性的JSON表达,它具有如下属性: 
@parentNode 被创建对象所属的父级元素(可为元素ID,也可为DOM对象) 
@domId 被创建对象的ID 
@domTag 被创建对象的tag名称,支持常用的布局元素,如div span等,但不支持input\form等特别的元素 
@content 被创建的对象内容 
@otherAttributes 为被创建的对象添加除函数必需的属性外其它属性,如[{attrName:'style.color',attrValue:'red'}] 
@eventRegisters 为被创建的对象添加事件,类似[{eventType:'click',eventHandler:adsfasdf}]的数组 
-经过组合后,该参数具有如下形式: 
{parentNode:document.body,domTag:'div',content:'这是测试的',otherAttributes:[{attrName:'style.color',attrValue:'red'}],eventRegisters:[{eventType:'click',eventHandler:fnHandler}]} 
*/ 
function dynCreateDomObject(domParams) 
{ 
if(getElement(domParams.domId)) 
{ 
childNodeAction('remove',domParams.parentNode,domParams.domId); 
} 

var dynObj=document.createElement(domParams.domTag); 

with(dynObj) 
{ 
//id也可以通过otherAttributes传入,但是出于ID的特殊性,此处仍然采用 
//JSON对象传入,并以DOM ID属性附件 
id=domParams.domId; 
innerHTML=domParams.content; //innerHTML是DOM属性,而id等是元素属性,注意区别 
} 
/**//*添加属性*/ 
if(null!=domParams.otherAttributes) 
{ 
for(var i=0;i<domParams.otherAttributes.length;i++) 
{ 
var otherAttribute =domParams.otherAttributes[i]; 
dynObj.setAttribute(otherAttribute.attrName,otherAttribute.attrValue); 
} 
} 
/**//*end 添加属性*/ 
/**//*添加相关事件*/ 
if(null!=domParams.eventRegisters) 
{ 
for(var i=0;i<domParams.eventRegisters.length;i++) 
{ 
var eventRegister =domParams.eventRegisters[i]; 
addEventHandler(dynObj,eventRegister.eventType,eventRegister.eventHandler); 
} 
} 
/**//*end 添加相关事件*/ 
try 
{ 
childNodeAction('append',domParams.parentNode,dynObj); 
} 
catch($e) 
{ 

} 

return dynObj; 
} 
/**//* 
从父结点中删除子结点 
@actionType 默认为append,输入字符串 append | remove 
@parentNode 父结点的DOM对象,或者父结点的ID 
@childNode 被删除子结点的DOM对象 或者被删除子结点的ID 
*/ 
function childNodeAction(actionType,parentNode,childNode) 
{ 
if(!parentNode) 
{return; } 


parentNode=typeof parentNode==='string'?getElement(parentNode):parentNode; 
childNode=typeof childNode==='string'?getElement(childNode):childNode; 
if(!parentNode || !childNode) 
{return;} 

var action=actionType.toLowerCase(); 
if( null==actionType || action.length<=0 || action=='append') 
{ 
action='parentNode.appendChild'; 
} 
else 
{ 
action='parentNode.removeChild'; 
} 

try 
{ 
eval(action)(childNode); 
} 
catch($e) 
{ 
alert($e.message); 
} 
}

使用示例:

var htmlAttributes= 
[

{attrName:'class',attrValue:'样式名称'} //for IEs

,

{attrName:'className',attrValue: '样式名称'} //for ff

] 

var domParams={domTag:'div', content:'动态div的innerHTML', otherAttributes:htmlAttributes};

var newHtmlDom=dynCreateDomObject(domParams);

//通过setAttribute('style','position:absolute.....................')

//的形式来指定style没有效果,只能通过如下形式,jiong

newHtmlDom.style.zIndex='8888';

newHtmlDom.style.position='absolute';

newHtmlDom.style.left='100px';

newHtmlDom.style.top='200px';
Javascript 相关文章推荐
IE6下CSS图片缓存问题解决方法
Dec 09 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 Javascript
javascript实现倒计时跳转页面
Jan 17 Javascript
jquery validate表单验证的基本用法入门
Jan 18 Javascript
AngularJS 视图详解及示例代码
Aug 17 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
React Native中Navigator的使用方法示例
Oct 13 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
在node中使用jwt签发与验证token的方法
Apr 03 Javascript
开源一个微信小程序仪表盘组件过程解析
Jul 30 Javascript
node.js如何根据URL返回指定的图片详解
Oct 21 Javascript
javascript模拟实现ajax加载框实例
Oct 15 #Javascript
jquery幻灯片插件bxslider样式改进实例
Oct 15 #Javascript
微信分享的标题、缩略图、连接及描述设置方法
Oct 14 #Javascript
js实现select组件的选择输入过滤代码
Oct 14 #Javascript
javascript记录文本框内文字个数检测文字个数变化
Oct 14 #Javascript
返回顶部按钮响应滚动且动态显示与隐藏
Oct 14 #Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
Oct 14 #Javascript
You might like
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
python绘制条形图方法代码详解
2017/12/19 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
Python 实现集合Set的示例
2020/12/21 Python
PHP笔试题
2012/02/22 面试题
金蝶的一道SQL笔试题
2012/12/18 面试题
经济管理专业求职信
2014/06/09 职场文书
三严三实对照检查材料
2014/08/25 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
学习考察心得体会
2014/09/04 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
见习报告怎么写
2014/10/31 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
合理化建议书范文
2015/09/14 职场文书
区域销售大会开幕词
2016/03/04 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers
go设置多个GOPATH的方式
2021/05/05 Golang