好比有一個"<span id='a1' title='t1' uid='u1'>測試類容</span>"javascript
(1)若是這種格式的字符串已經添加到頁面,在頁面利用document能夠找到,那麼能夠利用jquery或者js先根據id獲取節點,在獲取對應屬性html
(2)若是該節點沒有添加到頁面,如何獲取該字符串span的全部屬性,好比獲取id,title和uid,如何獲取?java
能夠這麼作:jquery
var parser = new DOMParser(); var htmlDoc = parser.parseFromString(str, 'text/html');//生出以html包裹的html節點對象 var $a = $(htmlDoc).find('span'); if($a.length > 0){ var title = $a.attr("title"); var id = $a.attr("id"); var uid = $a.attr("uid"); }
項目代碼:dom
easyui的datagrid的field的formatter返回一個字符串,該字符串會生出對應的dom對象函數
需求:若是按鈕小於等於2個,則正常顯示;大於2個,增長一個"更多"菜單,保留一個一級菜單,其他菜單在"更多"裏面做爲子菜單顯示:測試
function actionFormatterFun(value,row,index){ var str = ""; //按鈕1 var menuParam = new Array(); menuParam.push("參數1",650,350,"modifyProcess?eprjInfoId=row.id",row.uuid); var menuStr = getFirstFun(row,"按鈕1","按鈕1","icon-search","showDialogForUser",menuParam); str += menuStr; //按鈕2 var menuParam = new Array(); menuParam.push("參數2",650,350,"modifyProcess?eprjInfoId=row.id",row.uuid); var menuStr = getFirstFun(row,"按鈕2","按鈕2","icon-search","showDialogForUser",menuParam); str += menuStr; //按鈕3 var menuParam = new Array(); menuParam.push("參數3",650,350,"modifyProcess?eprjInfoId=row.id",row.uuid); var menuStr = getFirstFun(row,"按鈕3","按鈕3","icon-search","showDialogForUser",menuParam); str += menuStr; var finalStr = returnFinalStrFun(str,row,parent); return finalStr; } /** * 返回最終的菜單字符串 * @param str 菜單的字符串 * @returns */ function returnFinalStrFun(str,row,parent){ var menuNum = getTotalMenuNumFun(str); if(menuNum <=2){ return str; } var menuId = row.id; var menuUid = row.uuid; if(parent){ menuId = parent.id; menuUid = parent.uuid; } //保留第一個菜單,其餘的菜單放入到"更多"裏面 var str = initMenuStrFun(str,row,menuId,menuUid); return str; } /** * 獲取當前行全部一級菜單的數量;若是數量<=2,則都作一級顯示,不然要顯示二級 * 以<a>對象的個數來做爲子菜單的個數,個數爲split以後-1 * @param str 菜單的字符串 * @returns */ function getTotalMenuNumFun(str){ if(str){ var split = str.split("</a>"); return split.length-1; } return 0; } /** * 根據菜單數量初始化最後的菜單樣式 * @param str 菜單字符串 * @returns */ function initMenuStrFun(str,row,menuId,menuUid){ var finalMenuStr = ""; if(str){ var split = str.split("</a>"); finalMenuStr += split[0]+"</a>";//以</a>切割了,這裏要加上</a>,爲須要保留的第一個菜單 //加入"更多"菜單 finalMenuStr += "<a uid='"+menuId+"' uuid='"+menuUid+"' href='javascript:void(0)' class='__zdymenu' >更多</a>"; finalMenuStr += "<div id='__zdymenu"+row.id+"'>"; for(var i = 1;i < split.length;i++){ if(split[i]){ //把<a>標籤的字符串轉化爲<div>的二級菜單顯示方式 var secondStr = getSecondFun(split[i]+"</a>"); finalMenuStr += secondStr; } } finalMenuStr += "</div>"; } return finalMenuStr; } /** * 根據一級子節點生成二級子節點 * 注意:二級子節必須爲div,不然顯示有問題 * @param str * @returns */ function getSecondFun(str){ var returnStr = ""; var parser = new DOMParser();//解析器 var htmlDoc = parser.parseFromString(str, 'text/html');//解析爲html元素 var $a = $(htmlDoc).find('a');//獲取虛擬的dom對象 if($a.length > 0){ var title = $a.attr("title"); var text = $a.find("span[myText]").attr("myText"); var icon = $a.find("span[myIcon]").attr("myIcon"); var onclickStr = $a.attr("onclick"); returnStr = getSecondFunByParam(title,text,icon,onclickStr); } return returnStr; } /** * 獲取二級菜單 * @param row * @param title * @param text * @param icon * @param funName * @param param * @param clickStr * @returns */ function getSecondFunByParam(title,text,icon,clickStr){ var divStr = "<div onclick='"+clickStr+"' title='"+title+"' data-options=\"iconCls:'"+icon+"'\">"+text+"</div>"; return divStr; } /** * 獲取一級菜單(注意,formatter的一級菜單以<a>標籤顯示;可是"更多"裏面的子菜單必須以"div"顯示,不然子菜單顯示不正常) * @param row 當前所在的行 * @param title 顯示的標題 * @param text 顯示的文字 * @param icon 按鈕的樣式 * @param funName 按鈕回調的函數 * @param param 回調函數funName須要的參數 * @returns */ function getFirstFun(row,title,text,icon,funName,param,menuFlag){ var clickStr = getCallFun(funName,param); if(!menuFlag){ menuFlag = ""; } var str = "<a "+clickStr+" menuFlag='"+menuFlag+"' href='javascript:;' class='easyui-linkbutton l-btn l-btn-small l-btn-plain btn-small-nt' plain='true' "; str += " title='"+title+"' >"; str += "<span class='l-btn-left l-btn-icon-left'>"; str += "<span class='l-btn-text' myText='"+text+"' myIcon='"+icon+"'>"+text+"</span>"; str += "<span class='"+icon+"'></span>"; str += "</span>"; str += "</a>"; return str; } /** * 根據參數和函數名,獲取對應的函數綁定的事件的字符串 * @param funName * @param param * @returns */ function getCallFun(funName,param){ var clickStr = "onclick='"+funName+"("; if(param && param.length > 0){ for(var i = 0;i < param.length;i++){ if(i != 0){ clickStr += ","; } if(typeof(param[i]) == 'number'){ //若是是數字類型的參數,則原樣傳入數字(若是dialog的width和height傳入字符串類型會有顯示有問題) clickStr += ""+param[i]+""; }else{ clickStr += "\""+param[i]+"\""; } } } clickStr += ");'"; return clickStr; }