2012-10-16

ZK-1391 的故事

這是一個說難絕對不難,但是卻讓我這個低能苦手著實糾結了好一陣子的 issue

故事很簡單,就是在 Window 這個 component 在某些 mode 下可以用 lefttop 設定位置, 當然也可以設定 visible 來設定顯示與否。 怪事就這麼發生了(我覺得更怪的是:為什麼到現在才有人踩到 XD), 如果一開始 visible="false",另外只單純設定 lefttop 而沒有設定另外一個, 那麼在重新設定成 visible="true" 時,設定的 left / top 就會沒效果,直接跑到 (0, 0) 的位置。 但是假若 lefttop 都有設定,又能顯示正確結果。

第一直覺是 JS 那邊的 setVisible() 出了什麼紕漏,結果在 _updDomPos() 裡頭繞了很久,發現根本不是那麼一回事情。 毫無頭緒之下只能一步一步慢慢跑,看 jq("#"+uuid) 的 style 什麼時候被改掉。 結果是在 setVisible(true) 之後,bind_() 會去呼叫 _doOverlapped() (Vincent:早就跟你說了阿 [指]), 這裡頭原本的邏輯是:

if (!pos && (!n.style.top || !n.style.left)) {
    var xy = $n.revisedOffset();
    n.style.left = jq.px(xy[0]);
    n.style.top = jq.px(xy[1]);
}

也就是當 Window 沒有設定 pos 而且 topleft 有一個沒有設定, 就會去呼叫 revisedOffset() 來重新決定位置。 至於 revisedOffset() 怎麼運作的根本不重要--因為這傢伙根本還沒出現在 DOM 當中(不然幹麼呼叫 bind_()), 也就根本取不到值;這也可以說明了如果同時設定 topleft,那麼就不會進來這一段啦。 在不知道當初為什麼會寫 !pos && (!n.style.top || !n.style.left) 的前提下,也只好這樣改來避開了:

    if (!pos && (!n.style.top || !n.style.left)) {
        var xy = $n.revisedOffset();
        if (!n.style.left) {
            n.style.left = jq.px(xy[0]);
        }
        if (!n.style.top) {
            n.style.top = jq.px(xy[1]);
        }           
    }

唉... 好心的大爺們... 多寫點註解阿...... Orz

No comments:

Post a Comment