[js高手之路]HTML標(biāo)簽解釋成DOM節(jié)點(diǎn)的實(shí)現(xiàn)方法
最近在封裝一個(gè)開源框架,已經(jīng)寫了500行, 已經(jīng)具備jquery的大多數(shù)常用功能,后面還會(huì)擴(kuò)展大量的工具函數(shù)和MVVM雙向驅(qū)動(dòng)等功能。跟jquery的使用方法完全一樣,jquery的選擇器,幾乎都能支持,為什么說這事,跟這篇文章的主題有毛關(guān)系呢?因?yàn)檫@篇文章要講的就是我在寫框架過程中碰到的一個(gè)問題,封裝jquery的after方法,支持DOM和html標(biāo)簽兩種用法,html標(biāo)簽傳參,我要把html解釋成DOM結(jié)構(gòu),用DOM的方法插入.
首先,我們寫個(gè)通用的html標(biāo)簽:
<div onclick="test();" name="test" id="test">this is a test string</div>
這個(gè)html包括了事件,樣式,屬性,內(nèi)容.
我們接著用正則把這個(gè)html的每一部分匹配出來,我們需要的是:
1、標(biāo)簽名, 因?yàn)閯?chuàng)建dom節(jié)點(diǎn)的時(shí)候需要
2、屬性和內(nèi)容都要單獨(dú)分離出來
為了便于創(chuàng)建dom,我們用一個(gè)json保存,比如這個(gè)標(biāo)簽,我們要處理成的最終結(jié)果是:
{ id:"test inner:"this is a test string name:"test" onclick:"test();" style:"color:red;background:green;" tag:"div" }
如果有了這個(gè)結(jié)構(gòu),只要拿到對(duì)應(yīng)的鍵和值,組裝成一個(gè)dom就可以搞定了
var o = document.createElement( obj['tag'] ); o.innerHTML = obj['inner']; delete obj['inner']; delete obj['tag']; for( var key in obj ){ o.setAttribute( key, obj[key] ); } document.body.appendChild( o );
解釋思路已經(jīng)明確,那么我們首先就要把html標(biāo)簽的每部分用正則表達(dá)式匹配出來
var re = /<(\w+\s*)(\w+[=][\'\"](.*)?[\'\"]\s*)*>(.*)?<\/\w+>/; var str = '<div onclick="test();" name="test" id="test">this is a test string</div>'; var res = str.match(re);
恩,這就是我們匹配出來的結(jié)果,從圖中可以看出,
res[1]存儲(chǔ)的是標(biāo)簽名稱,只需要把兩邊的空格去掉
res[2]存儲(chǔ)的是屬性和值,我們用split函數(shù)按空格切割一次,再用split函數(shù)按'='切割一次,就能分解出來了
res[4]存儲(chǔ)的就是字符串的內(nèi)容
上面3部分,只要用循環(huán)和字符串稍加處理就可以得出目標(biāo)結(jié)果了
那么完整的處理代碼就是:
var re = /<(\w+\s*)(\w+[=][\'\"](.*)?[\'\"]\s*)*>(.*)?<\/\w+>/; var str = '<div onclick="test();" name="test" id="test">this is a test string</div>'; var res = str.match(re); var tagName = null, attrList = [], arr = [], obj = {}; if( res[1] ) { tagName = res[1].trim(); obj['tag'] = tagName; } if( res[4] ) { obj['inner'] = res[4]; } if ( res[2] ) { attrList = res[2].split( /\s+/ ); for( var i = 0, len = attrList.length; i < len; i++ ){ arr = attrList[i].split("="); // console.log( arr ); obj[arr[0]] = arr[1].replace( /(^[\'\"]+|[\'\"]$)/g, function(){ return ''; } ); } } var o = document.createElement( obj['tag'] ); o.innerHTML = obj['inner']; delete obj['inner']; delete obj['tag']; for( var key in obj ){ o.setAttribute( key, obj[key] ); } document.body.appendChild( o );
可以自行封裝一個(gè)函數(shù),我相信你應(yīng)該輕易就能封裝出來吧.
以上這篇[js高手之路]HTML標(biāo)簽解釋成DOM節(jié)點(diǎn)的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- JavaScript DOM節(jié)點(diǎn)操作方法總結(jié)
- JS實(shí)現(xiàn)動(dòng)態(tài)添加DOM節(jié)點(diǎn)和事件的方法示例
- JavaScript中對(duì)DOM節(jié)點(diǎn)的訪問、創(chuàng)建、修改、刪除
- js和jquery對(duì)dom節(jié)點(diǎn)的操作(創(chuàng)建/追加)
- JS常見DOM節(jié)點(diǎn)操作示例【創(chuàng)建 ,插入,刪除,復(fù)制,查找】
- JS實(shí)現(xiàn)DOM節(jié)點(diǎn)插入操作之子節(jié)點(diǎn)與兄弟節(jié)點(diǎn)插入操作示例
- JavaScript DOM節(jié)點(diǎn)添加示例
- JS構(gòu)建頁面的DOM節(jié)點(diǎn)結(jié)構(gòu)的實(shí)現(xiàn)代碼
- JS訪問DOM節(jié)點(diǎn)方法詳解
- JavaScript DOM節(jié)點(diǎn)操作實(shí)例小結(jié)(新建,刪除HTML元素)
- 原生js實(shí)現(xiàn)針對(duì)Dom節(jié)點(diǎn)的CRUD操作示例
相關(guān)文章
js實(shí)現(xiàn)仿愛微網(wǎng)兩級(jí)導(dǎo)航菜單效果代碼
這篇文章主要介紹了js實(shí)現(xiàn)仿愛微網(wǎng)兩級(jí)導(dǎo)航菜單效果代碼,通過javascript自定義函數(shù)結(jié)合鼠標(biāo)點(diǎn)擊事件實(shí)現(xiàn)tab切換的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08兩個(gè)table之間相互移動(dòng)數(shù)據(jù)
兩個(gè)table之間相互移動(dòng)數(shù)據(jù)的實(shí)現(xiàn)代碼。2009-05-05詳解怎么檢測(cè)和防止JavaScript死循環(huán)
最近工作中遇到了一些死循環(huán)導(dǎo)致的頁面卡死問題,經(jīng)過 trouble shooting 和代碼修復(fù)解決了問題,所以下面這篇文章主要給大家介紹了怎么檢測(cè)和防止JavaScript死循環(huán)的相關(guān)資料,需要的朋友可以參考下2021-11-11js實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車有圖有代碼
這篇文章主要介紹了用js實(shí)現(xiàn)的簡(jiǎn)單購(gòu)物車,配有截圖,適合初學(xué)者2014-05-05js浮點(diǎn)數(shù)保留兩位小數(shù)點(diǎn)示例代碼(四舍五入)
本篇文章主要介紹了js浮點(diǎn)數(shù)保留兩位小數(shù)點(diǎn)示例代碼(四舍五入) 需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12javascript結(jié)合html5 canvas實(shí)現(xiàn)(可調(diào)畫筆顏色/粗細(xì)/橡皮)的涂鴉板
js+html5 canvas實(shí)現(xiàn)的涂鴉畫板特效,可調(diào)畫筆顏色|粗細(xì)|橡皮,可以保存涂鴉效果為圖片編碼,測(cè)試了下還不錯(cuò),感興趣的朋友可以參考下2013-04-04JS用最簡(jiǎn)單的方法實(shí)現(xiàn)四舍五入
在本篇文章里小編給大家整理的是關(guān)于JS用最簡(jiǎn)單的方法實(shí)現(xiàn)四舍五入的實(shí)例內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-08-08