通過JS動態(tài)創(chuàng)建一個html DOM元素并顯示
更新時間:2014年10月15日 16:58:33 投稿:whsnow
需要通過點擊某個元素后, 動態(tài)創(chuàng)建一個DOM元素并顯示,因此寫了一些相關(guān)的js函數(shù),在此記錄下
近日,因工作需要,需要通過點擊某個元素后, 動態(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表達,它具有如下屬性: @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é)點中刪除子結(jié)點 @actionType 默認(rèn)為append,輸入字符串 append | remove @parentNode 父結(jié)點的DOM對象,或者父結(jié)點的ID @childNode 被刪除子結(jié)點的DOM對象 或者被刪除子結(jié)點的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';
您可能感興趣的文章:
相關(guān)文章
js中方法重載如何實現(xiàn)?以及函數(shù)的參數(shù)問題
js中沒有辦法直接實現(xiàn)方法重載,但每一個函數(shù)都有一個特殊的參數(shù)arguments,利用它可以實現(xiàn)方法的重載,具體示例如下2013-08-08簡單實用的HTML到UBB轉(zhuǎn)換腳本工具實現(xiàn)說明
你也許是位樂于分享的技術(shù)人員,盡管你算不上什么技術(shù)高手,但是你都希望把自己所知道的通過博客與網(wǎng)友分享。為了讓更多人知道你的經(jīng)驗,你可能會努力把博文發(fā)布到專業(yè)論壇。2009-11-11簡易版本JSON.stringify的實現(xiàn)及其六大特性詳解
最近做項目發(fā)現(xiàn)JSON.stringify()使用場景真的挺多,我們都知道JSON.stringify()的作用是將JavaScript對象轉(zhuǎn)換為JSON字符串,下面這篇文章主要給大家介紹了JSON.stringify的實現(xiàn)及其六大特性的相關(guān)資料,需要的朋友可以參考下2021-10-10解決js相同的正則多次調(diào)用test()返回的值卻不同的問題
今天小編就為大家分享一篇解決js相同的正則多次調(diào)用test()返回的值卻不同的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10js中繼承的幾種用法總結(jié)(apply,call,prototype)
本篇文章主要介紹了js中繼承的幾種用法總結(jié)(apply,call,prototype) 需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12