JS动态创建DOM元素的方法


Posted in Javascript onJune 09, 2015

本文实例讲述了JS动态创建DOM元素的方法。分享给大家供大家参考。具体如下:

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

/*
动态创建DOM元素的相关函数支持
*/
/*
获取以某个元素的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程序设计有所帮助。

Javascript 相关文章推荐
JavaScript对象模型-执行模型
Apr 28 Javascript
jquery 关于event.target使用的几点说明介绍
Apr 26 Javascript
js控制table合并具体实现
Feb 20 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
Dec 20 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
BootStrap组件之进度条的基本用法
Jan 19 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
vue axios用法教程详解
Jul 23 Javascript
Node.Js中实现端口重用原理详解
May 03 Javascript
深入理解Vue keep-alive及实践总结
Aug 21 Javascript
js实现秒表计时器
Dec 16 Javascript
vue在线动态切换主题色方案
Mar 26 Javascript
JavaScript获取数组最小值和最大值的方法
Jun 09 #Javascript
JavaScript获取两个数组交集的方法
Jun 09 #Javascript
JavaScript实现函数返回多个值的方法
Jun 09 #Javascript
JavaScript中的getDay()方法使用详解
Jun 09 #Javascript
JavaScript中用getDate()方法返回指定日期的教程
Jun 09 #Javascript
JavaScript的Date()方法使用详解
Jun 09 #Javascript
Javascript监视变量变化的方法
Jun 09 #Javascript
You might like
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
深入理解Python中的内置常量
2017/05/20 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
深入了解NumPy 高级索引
2020/07/24 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
竞聘上岗演讲稿范文
2014/01/10 职场文书
文明风采获奖感言
2014/02/18 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
使用JS实现简易计算器
2021/06/14 Javascript
Kubernetes控制节点的部署
2022/04/01 Servers