gotin blog

Whatever gotin wanna write

ノードの実際のタグ名をとる方法の検討の続き

ノードの実際のタグ名をとる方法の検討 - さらさら宇宙忍法帖

↑これの続き。
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;
      }
    }
  }
})();