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 相关文章推荐
extjs 学习笔记 四 带分页的grid
Oct 20 Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
Nov 26 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
Apr 27 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
Aug 24 Javascript
js实现基于正则表达式的轻量提示插件
Aug 29 Javascript
jQuery 常用代码集锦(必看篇)
May 16 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
layer弹出层框架alert与msg详解
Mar 14 Javascript
jQuery实现滚动效果
Nov 17 jQuery
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 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类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
php的4种常用运行方式详解
2016/12/22 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP 无限级分类
2017/05/04 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
python实现的简单文本类游戏实例
2015/04/28 Python
Python实现建立SSH连接的方法
2015/06/03 Python
基于django传递数据到后端的例子
2019/08/16 Python
简单了解django文件下载方式
2020/02/10 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
物流管理应届生求职信
2013/11/07 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
金融管理专业毕业生求职信
2014/03/12 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
公司授权委托书范文
2014/09/21 职场文书
临时用工协议书范本
2014/10/29 职场文书
导游词范文
2015/02/13 职场文书
自我检讨书怎么写
2015/05/07 职场文书