cssセレクタや、xpathのような、エレメントの座標を表すユニークコードを検討してみました。
基本的にはHTMLのID属性があれば、それで十分ですが、全てのエレメントにIDがついている訳ではないので、要素の特定をする目的で作りました。
仕様
document.body以下のエレメントが対象
指定のエレメントを下から上に向かって階層を上っていき、以下のような書き方を文字列にする
body[0].table[0].tr[2].td[1].div[3]
逆にこの文字列をdecode関数で、指定のエレメントを取得できるようにしました。
ソース
(function(){
var $$={};
$$.encode = function(elm){
if(typeof(elm)=='undefined' || elm==null || !elm){return ""}
var dom = [];
do{
if(elm.id && elm == $d.getElementById(elm.id)){
dom[dom.length] = elm.id;
break;
}
else if(!elm.parentNode){break}
var num = 0;
var cnt = 0;
if(elm.parentNode.childNodes.length){
for(var i=0;i<elm.parentNode.childNodes.length;i++){
if(typeof(elm.parentNode.childNodes[i].tagName)=='undefined'){continue}
if(elm.parentNode.childNodes[i].tagName != elm.tagName){continue}
if(elm.parentNode.childNodes[i] == elm){
//table-cellの場合、colspan,rowspanを考慮しない絶対ポジションを取得する
num=cnt;
break;
}
cnt++;
}
}
//小文字英数字で形成する
dom[dom.length] = e.tagName.toLowerCase() + "["+num+"]";
if(e == $b){break}
}
while (e = e.parentNode);
//配列を逆にする
var dom2 = [];
for(var i=dom.length-1;i>=0;i--){
dom2[dom2.length] = dom[i];
}
return dom2.join(".");
};
$$.decode = function(uid){
if(!uid || typeof(uid)!='string'){return}
//単一IDの場合;
if(document.getElementById(uid)!=null){return document.getElementById(uid)}
//element抽出処理
var elm= document.getElementsByTagName("html")[0];
var d1 = id.split(".");
var flg=0;
var path = [];
for(var i=0;i<d1.length;i++){
if(d1[i].match(/^(.*?)\[(.*?)\]$/)){
var tag = RegExp.$1;
var num = RegExp.$2;
if(tag=='' || num==''){return}
var cnt = 0;
var flg2= 0;
var e2 = elm.childNodes;
for(var j=0;j<e2.length;j++){
if(!e2[j].tagName || typeof(e2[j])=='undefined'){continue}
if(e2[j].tagName != tag.toUpperCase()){continue}
if(cnt == num){
elm = e2[j];
flg2++;
break;
}
cnt++;
}
//存在しないelement処理
if(flg2==0){return}
flg++;
}
else if(document.getElementById(d1[i])!=null){
elm = document.getElementById(d1[i]);
flg++;
}
else if(document.getElementById(d1[i])==null){
return;
}
//table-cell用処理
path[path.length] = d1[i];
}
if(!flg){return}
return elm;
};
window.$$UNIQUE=$$;
return $$;
})();
使い方
# class="hoge"の2番目の要素のユニークIDを取得する
var uid = $$UNIQUE.encode(document.getElementsByClassName("hoge")[1]);
//-> div[0].table[0].tr[3].td[4].a[0]
# 上記リターン値からエレメントを取得する
var hoge = $$UNIQUE.decode("div[0].table[0].tr[3].td[4].a[0]");
//-> [object]
注意
プログラムに不具合などを見つけられた方は、コメントにて報告をお願いします。
0 件のコメント:
コメントを投稿