是在CSDN論壇看到的一個問題,平常我也沒有注意,或者說沒有這樣用吧。看代碼:
以下是引用片段:
<body id=" <script>
var foo = function() {
var $ = function() { return document.getElementById(arguments[0]); }
$("d2").innerHTML = $("d1").innerHTML;
}
//]]>
</script>
<h4>改動兩個文本框里的值,把這個容器的innerHTML賦值給d2</h4>
<button onclick="foo()">foo()</button>
<div id="d1" style="color:red">
<input value='blog.never-online'/>
<input value=""/>
</div>
<div id="d2">
</div>
</body>
不是預期的結果吧?包括在Opera下執行的情況也是與Firefox下相同的,你可以嘗試在Opera下運行就明白了。
如果能夠得到我們預期的效果呢?我嘗試著用__defineGetter__的方法在Mozilla下得到所有的innerHTML,在這里卻給了我一些提示。比如: 以下是引用片段:
<script type="text/javascript">
function elementDetail (e) {
if (!e.attributes) return "";
var attrs = e.attributes; var str = "<" + e.tagName;
for (var i=0; i<attrs.length; i++) {
str += ' ' +attrs[i].name+ '="' +attrs[i].value+ '"';
}; str += ">";
return str;
}
function foo() {
var a = document.getElementById("d1");
var str = "";
for (var i=0; i<a.childNodes.length; i++) {
var chld = a.childNodes[i];
str += elementDetail(chld);
}
alert(str);
}
</script>
<h4>改動兩個文本框里的值,把這個容器的innerHTML賦值給d2</h4>
<button onclick="foo()">foo()</button>
<div id="d1" style="color:red">
<input value='blog.never-online'/>
<input value="script by never-online"/>
</div>
<div id="d2">
</div>
上面這些代碼雖然達不到預期目的,但是卻是要知道一定要得到attribute的值,因此我嘗試著用下面這個方法來做。
<script type="text/Javascript">
var $ = function(id) { return document.getElementById(id); }
function foo() {
$("d2").innerHTML = $("d1").innerHTML;
}
</script>
<h4>改動兩個文本框里的值,把這個容器的innerHTML賦值給d2</h4>
<button onclick="foo()">foo()</button>
<div id="d1">
<input value='blog.never-online' onkeyup="this.setAttribute('value',this.value)"/>
<input value="script by never-online"/>
</div>
<div id="d2"></div>
這個方法卻成功了,也就可以說明,在Mozilla下的innerHTML通過遍歷元素的所有節點的tagName還有attrubutes來得到其innerHTML的。因此我們第一個例中的innerHTML得不到改動后的value值。
與此同時,Opera下這一招也可以用。也證明在Opera下的innerHTML也是通過遍歷元素的所有節點的tagName還有attrubutes來得到其innerHTML的。
難道w3c里的標準是這樣的嗎?還沒有空來得及查w3c的資料,所以也說不上是Opera與Mozilla下的巧合,還是IE下面比較讓開發人員舒服的設計。
新聞熱點
疑難解答