使用 innerHTML 來為畫面上某個區塊添加內容值是很常見的技巧,而有時我們在執行 innerHTML 之後還需要重新取得這個區塊的高度與寬度,一般而言我們會使用 offsetHeigth 與 offsetWidth 這兩個屬性。
 
程式一:
    <html>
        <head>
            <script>
                function inner() {
                    document.getElementById('testDiv').innerHTML = 
                                document.getElementById('words').value;
                }
                function alertOffsetHeight() {
                    alert(document.getElementById('testDiv').offsetHeight);
                }
                </script>
        </head>
        <body>
            <div id="testDiv" style="height:100;width:100;background:yellow;">
            </div><p>
            <input type="text" id="words">
            <input type="button" value="add words" onclick="inner()"><BR>
            <input type="button" value="get offset height" 
                        onclick="alertOffsetHeight()">
        </body>
    </html>
 
以下為程式一執行的結果:


在上圖中,若我們在輸入框裏打入一長串的字,然後按下「add words」將這些字用 innerHTML 寫入黃色區塊時會發生什麼事呢?

以下是分別在 IE 與 Firefox上執行的結果
上圖為在 IE 上的執行結果 上圖為在 Firefox 上執行的結果

在 IE 上,黃色區塊配合我們塞入的內容值而變長了,但是在 Firefox 中,變長的只有我們加進去的文字,黃色區塊還是維持原來的大小,接下來我們按下「get offset height」鈕看看,結果在 IE 上得到的值是黃色區塊變長後的高度,但在 Firefox 上取得的仍是黃色區堆原先的高度。
  
為什麼會這樣呢?老實說我並不知道…我只知道如果無法正確取得區塊變長或變寬後的值,那麼很多效果就會做不出來,於是在查了一堆有關 HTMLElement 物件與 CSS 屬性值後,我找到了一個 CSS 的屬性-值似乎能解決這個問題,這個 CSS 屬性-值就是:display : table-cell
 
馬上來動手試試看吧~~
我們將「程式一」裏的  function inner() 改成
 
    function inner() {
        document.getElementById('testDiv').style.display = "table-cell";
        document.getElementById('testDiv').innerHTML = 
                document.getElementById('words').value;
    }
 
然後在 Firefox 上執行看看,得到下圖的結果

 
畫面呈現的結果變得跟 IE 一樣了,那麼趕快按下「get offset height」看看結果,果然取到的值是黃色區塊變長之後的值。
 
Firefox 執行正確之後當然還要回頭再試試看 IE 啦,不過讓人很沮喪的,IE 竟然會丟出錯誤訊息,看來 IE 並不支援 display : table-cell 這樣的 CSS 屬性-值,於是我們只好再改造一下 inner()  這個方法了:
 
    function inner() {
        try {
            document.getElementById('testDiv').style.display = "table-cell";
        } catch(e) {
        }
        document.getElementById('testDiv').innerHTML = 
                    document.getElementById('words').value;
    }

 
我們把設定 display = "table-cell" 的程式碼用 try-catch 包起來,這樣在 IE 和 Firefox 上就都可以執行了。

arrow
arrow
    全站熱搜

    大笨鳥 發表在 痞客邦 留言(0) 人氣()