這是一個說難絕對不難,但是卻讓我這個低能苦手著實糾結了好一陣子的 issue。
故事很簡單,就是在 Window
這個 component 在某些 mode
下可以用 left
、top
設定位置,
當然也可以設定 visible
來設定顯示與否。
怪事就這麼發生了(我覺得更怪的是:為什麼到現在才有人踩到 XD),
如果一開始 visible="false"
,另外只單純設定 left
或 top
而沒有設定另外一個,
那麼在重新設定成 visible="true"
時,設定的 left
/ top
就會沒效果,直接跑到 (0, 0) 的位置。
但是假若 left
跟 top
都有設定,又能顯示正確結果。
第一直覺是 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
而且 top
或 left
有一個沒有設定,
就會去呼叫 revisedOffset()
來重新決定位置。
至於 revisedOffset()
怎麼運作的根本不重要--因為這傢伙根本還沒出現在 DOM 當中(不然幹麼呼叫 bind_()
),
也就根本取不到值;這也可以說明了如果同時設定 top
跟 left
,那麼就不會進來這一段啦。
在不知道當初為什麼會寫 !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