ノードの実際のタグ名をとる方法の検討 - さらさら宇宙忍法帖
↑これの続き。
javascriptで生HTMLはどうにもとれそうもないので仕方なくXMLHttpRequestで持ってきてなんとかすることにしてみた。
でもこれだとロードの度に異なるコンテンツを返すような動的生成ページには使えない。
ってことであんまり意味ないけどコードはっときます。
↓このコードをHTMLの最後にはっておくと各ノードに生タグ名を値に持つ_readTagNameプロパティがつきます。
でもjavascript内部でタグっぽいものが書かれてるとアウトだったりしますが、そもそも対して使えない代物なのでこれ以上頑張らないことに。あとfirefoxでしか試してません。XHRの工夫もないしforEachとか使ってるんでIEじゃ間違いなく動きません。
(function(){ var getSource = (function(){ var xhr = new XMLHttpRequest(); xhr.open("GET", document.location.href, false); xhr.send(); return function (){ return xhr.responseText; }; })(); function getNodes(){ var nodes = [document.documentElement]; Array.prototype.forEach.call(document.documentElement.getElementsByTagName("*"),function(element){nodes.push(element)}); return nodes; } Array.prototype.search = function(func){ for(var i=0;i<this.length;i++){ if(func(this[i])){ return i; } } return -1; }; var source =getSource(); var tags = source.match(/<([a-zA-Z]+)/g); tags = tags.map(function(tag){return tag.substring(1);}); var nodes = getNodes(); for(var i=0;i<tags.length;i++){ var tag= tags[i]; var node = nodes.shift(); if(!node){ break; } if(tag.toUpperCase() == node.tagName){ node._realTagName = tag; } else { var p = nodes.search(function(node){ return tag.toUpperCase() == node.tagName; }); if(p >= 0){ for(var j=0;j<p+1;j++){ node = nodes.shift(); } node._realTagName = tag; } } } })();