続・IEでのa要素の各属性について
前置き
IEでのa要素の各属性について - 文殊堂の続き。
IE 6,7 で相対URL -> 絶対 URL の変換 - #生存戦略 、それは - subtechを参考にして、
cloneNodeハックとlink.hrefによるURLの絶対URL化を組み合わせてみました。
http://jsdo.it/monjudoh/o2Mk
http://jsdo.it/monjudoh/9aHd
link.hrefによるURLの絶対URL化はIE6,7では使えないので割愛。
検証
IE6
なぜかhostnameがiframeではなく外側のものになってしまっている。
少なくとも短いURLについてはouterHTMLハックを使った場合に各属性の値をちゃんと取れていたので、
そっちを使ったほうが良さそう。
a要素の各属性(cloneNodeハック) ---url.length:11 href:[http://jsdo.it/a?1111#hash] , search:[?1111] , protocol:[http:] , hostname:[jsdo.it] , port:[80] , pathname:[a] , hash:[#hash] ---url.length:4097 href:[[object Error]] , search:[[object Error]] , protocol:[[object Error]] , hostname:[[object Error]] , port:[[object Error]] , pathname:[[object Error]] , hash:[[object Error]]
IE7
IE6同様hostnameがiframeではなく外側のものになってしまっている。
短いURLについてはouterHTMLハックを使用したほうが良さそう。
長いURLの場合にprotocol,portが正しく取得できるというメリットはある模様。
---url.length:11 href:[http://jsdo.it/a?1111#hash] , search:[?1111] , protocol:[http:] , hostname:[jsdo.it] , port:[80] , pathname:[a] , hash:[#hash] ---url.length:4097 href:[http://jsdo.it/a?1(略)1#ha] , search:[?1(略)1] , protocol:[http:] , hostname:[jsdo.it] , port:[80] , pathname:[a] , hash:[#ha]
IE8
cloneNodeハックのみ使用した場合はIE7とほぼ同じ。
---url.length:11 href:[http://jsrun.it/a?1111#hash] , search:[?1111] , protocol:[http:] , hostname:[jsdo.it] , port:[80] , pathname:[a] , hash:[#hash] ---url.length:4122 href:[http://jsrun.it/a?1(略)1] , search:[?1(略)1] , protocol:[http:] , hostname:[jsdo.it] , port:[80] , pathname:[a] , hash:[]
cloneNodeハックとlink.hrefを併用するとほぼ問題なく各属性の値を取れる模様。
outerHTMLハック使用時の結果がIE6,7と違い惨憺たるものだったので助かります。
---url.length:11 link.href:[http://jsrun.it/a?1111#hash] ,href:[http://jsrun.it/a?1111#hash] , search:[?1111] , protocol:[http:] , hostname:[jsrun.it] , port:[80] , pathname:[a] , hash:[#hash] ---url.length:4122 link.href:[http://jsrun.it/a?1(略)1#hash] ,href:[http://jsrun.it/a?1(略)1] , search:[?1(略)1] , protocol:[http:] , hostname:[jsrun.it] , port:[80] , pathname:[a] , hash:[]
結論
IE6,7ではouterHTMLハック、IE8ではcloneNodeハックとlink.hrefによるURLの絶対URL化の組み合わせを使うのが良さそう。
長いURLを同対応するかについては要検討。