通過JS動態(tài)創(chuàng)建一個html DOM元素并顯示
近日,因工作需要,需要通過點(diǎn)擊某個元素后, 動態(tài)創(chuàng)建一個DOM元素并顯示,因此寫了一些相關(guān)的JS函數(shù),在此記錄,以作備忘:
/**//* 動態(tài)創(chuàng)建DOM元素的相關(guān)函數(shù)支持 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對象動態(tài)綁定事件 @oTarget 被綁定事件的DOM對象 @sEventType 被綁定的事件名,注意,不加on的事件名,如 'click' @fnHandler 被綁定的事件處理函數(shù) */ 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 被綁定的事件處理函數(shù) */ 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; } } /**//* 創(chuàng)建動態(tài)的DOM對象 @domParams是被創(chuàng)建對象的屬性的JSON表達(dá),它具有如下屬性: @parentNode 被創(chuàng)建對象所屬的父級元素(可為元素ID,也可為DOM對象) @domId 被創(chuàng)建對象的ID @domTag 被創(chuàng)建對象的tag名稱,支持常用的布局元素,如div span等,但不支持input\form等特別的元素 @content 被創(chuàng)建的對象內(nèi)容 @otherAttributes 為被創(chuàng)建的對象添加除函數(shù)必需的屬性外其它屬性,如[{attrName:'style.color',attrValue:'red'}] @eventRegisters 為被創(chuàng)建的對象添加事件,類似[{eventType:'click',eventHandler:adsfasdf}]的數(shù)組 -經(jīng)過組合后,該參數(shù)具有如下形式: {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等是元素屬性,注意區(qū)別 } /**//*添加屬性*/ 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 添加屬性*/ /**//*添加相關(guān)事件*/ 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 添加相關(guān)事件*/ try { childNodeAction('append',domParams.parentNode,dynObj); } catch($e) { } return dynObj; } /**//* 從父結(jié)點(diǎn)中刪除子結(jié)點(diǎn) @actionType 默認(rèn)為append,輸入字符串 append | remove @parentNode 父結(jié)點(diǎn)的DOM對象,或者父結(jié)點(diǎn)的ID @childNode 被刪除子結(jié)點(diǎn)的DOM對象 或者被刪除子結(jié)點(diǎn)的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:'動態(tài)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 HTML DOM元素 節(jié)點(diǎn)操作匯總
- JS添加或刪除HTML dom元素的方法實(shí)例分析
- 詳解JS獲取HTML DOM元素的8種方法
- js 針對html DOM元素操作等經(jīng)驗累積
- JavaScript DOM元素常見操作詳解【添加、刪除、修改等】
- JavaScript DOM節(jié)點(diǎn)操作實(shí)例小結(jié)(新建,刪除HTML元素)
- JavaScript獲取DOM元素的11種方法總結(jié)
- Js 獲取HTML DOM節(jié)點(diǎn)元素的方法小結(jié)
- JavaScript HTML DOM 元素 (節(jié)點(diǎn))新增,編輯,刪除操作實(shí)例分析
相關(guān)文章
js中方法重載如何實(shí)現(xiàn)?以及函數(shù)的參數(shù)問題
js中沒有辦法直接實(shí)現(xiàn)方法重載,但每一個函數(shù)都有一個特殊的參數(shù)arguments,利用它可以實(shí)現(xiàn)方法的重載,具體示例如下2013-08-08簡單實(shí)用的HTML到UBB轉(zhuǎn)換腳本工具實(shí)現(xiàn)說明
你也許是位樂于分享的技術(shù)人員,盡管你算不上什么技術(shù)高手,但是你都希望把自己所知道的通過博客與網(wǎng)友分享。為了讓更多人知道你的經(jīng)驗,你可能會努力把博文發(fā)布到專業(yè)論壇。2009-11-11簡易版本JSON.stringify的實(shí)現(xiàn)及其六大特性詳解
最近做項目發(fā)現(xiàn)JSON.stringify()使用場景真的挺多,我們都知道JSON.stringify()的作用是將JavaScript對象轉(zhuǎn)換為JSON字符串,下面這篇文章主要給大家介紹了JSON.stringify的實(shí)現(xiàn)及其六大特性的相關(guān)資料,需要的朋友可以參考下2021-10-10解決js相同的正則多次調(diào)用test()返回的值卻不同的問題
今天小編就為大家分享一篇解決js相同的正則多次調(diào)用test()返回的值卻不同的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10JS+canvas繪制的動態(tài)機(jī)械表動畫效果
這篇文章主要介紹了JS+canvas繪制的動態(tài)機(jī)械表動畫效果,涉及javascript結(jié)合HTML5 canvas簡單數(shù)值計算與動態(tài)繪圖相關(guān)操作技巧,需要的朋友可以參考下2017-09-09js中繼承的幾種用法總結(jié)(apply,call,prototype)
本篇文章主要介紹了js中繼承的幾種用法總結(jié)(apply,call,prototype) 需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12