簡易切換區塊顯示
回應自: 異域內框顯示單一捲軸 Single scrollbar of iframe in exotic domain
感謝匿大(什麼鬼啊! 我還「姓朱名德正」咧←5個字, 是日本人?!冏rz__)的支持, 本篇「概略說明」一下異域內框顯示單一捲軸 Single scrollbar of iframe in exotic domain(以下簡稱甲方XP)文中使用的區塊顯示切換方法. 事實上我不太coding了, 多半是提供如何達成目標或克服困難的概念. 當前的設計潮流傾向於使用現成函式庫(例如 jQuery), 除非是撰寫函式庫或力求精簡的龜毛派才會去搞function go2die(myself) {/*...*/}這種鳥事……orz
導播麻煩把鏡頭拉回來~~首先把整個架構切成下列3部份, 再細究箇中需要注意的細節:
- 觸發切換的扳機, 可以是連結、、表單元件、甚至大部份的HTML元素;
- 實作切換的函式;
- 被操~~弄的區塊.
1.觸發扳機
不知何時起又因何故, 大家忽然討厭用了, 紛紛仿效 MS Office XP 引領的平板介面(是因為Yanz姊姊當時正夯嗎^O^?). 由於那時 DHTML 和 DOM 方興未艾, 唯一能取代按鈕的元件就只有 <a> 種連結, 所以 <a> 一躍成為網頁設計者的最愛. 大抵上寫法有:
- <a href="#" onclick="foo(n)">
- <a href="javascript:void(0)" onclick="foo(n)">
其中href="#"在某些情況(饒了我吧)點擊後會取代當前頁面或開啟新頁面, 因而在onclick的指定裡還會加入return false以中斷事件向上傳遞. (呃, 要繼續嗎? ^^a)
不過時間來到了「語意」掛帥的現今局勢, 我倒是建議不妨從按鈕的葪素麵回歸到啦(雞絲麵糝苯有害健康吧?!), 大不了 style 中再設定 border 即可. 順便一提: 除了 onclick 外, 也可採 onMouseOver 或 CSS 的 :hover 來達成顯示切換, 這對於暫時性的提示文字滿有用的, 比單純的 title 屬性更有彈性. (會ㄉㄨㄞ~ㄉㄨㄞ~的喲!!)
2.實作函式
避開提示性的顯示方式, 按鈕形式的切換首重「狀態」的判別: 如果目前是隱藏狀態, 那麼就要顯露內容; 否則自然將狀態設為隱藏. 至於何謂隱藏, 一般多採 CSS display 是否 none 來判別及指定; 但是我曾在測試某舊版瀏覽器時發現 display 無法控制, 因而改用 CSS height 來控制: 而此時就得在函數傳遞的參數中多添個顯示時的高度, 可以是畫素(如px)或列數(如em).
3.操弄區塊
就我參考的前輩們範例所見, 實作函式與操弄區塊之間是用區塊 ID 和 document.getElementById 溝通的; 可是我因為懶得為每個操弄區塊設定 ID, 所以搞了一種「偷吃步」的方式: 由於我的觸發扳機緊臨操弄區塊, 所以對於觸發扳機來說, 操弄區塊是它的 nextSibling. 於是乎每個觸發扳機的 onclick="switchDisplay(this.nextSibling)" 當然如果操弄區塊預設要隱藏, 也請記得設定 style="display:none;"
超值加贈
在甲方(耶! 終於派上用場了…)的第一則意見中提到固定背景, 我想我會把背景設給外包的 div 而將 iframe 設為透明. 僅供參考……^^a
P.S.各家瀏覽器一直在改樣式的呈現面貌及編譯引擎, 本站之前所提解法大多已不適用或有更好的方案了, 因此誠心建議採用有眾多高手在維護的現成函式庫. -_^




4 筆指教:
阿尾兄
再請教一下
下面這段程式如果要改成開啟一個div
其他的div則自動關閉,要怎麼改呢?
感激不盡~
function showContent(vThis)
{
vParent = vThis.parentNode;
vSibling = vParent.nextSibling;
while (vSibling.nodeType==3) { // Fix for Mozilla/FireFox Empty Space becomes a TextNode or Something
vSibling = vSibling.nextSibling;
};
if(vSibling.style.display == "none")
{
vThis.src="images/collapse.gif";
vThis.alt = "Hide Div";
vSibling.style.display = "block";
} else {
vSibling.style.display = "none";
vThis.src="images/expand.gif";
vThis.alt = "Show Div";
}
return;
}
由於是意見回覆,我就長話短說囉~
開啟一個div 其他的div則自動關閉
之中的其他當然是指您所設計的某個範圍內的其他div.
那麼衍生出的概念就是group控制而非原先毫無關聯的散沙.
剖析重點為二:1.控制哪些動作; 2.所謂關聯為何.
1.最暴力但最有效率的方式:每次命令group成員一律關閉,再針對觸發的成員判別是否要打開.優雅而繁鎖則記住每個已開成員(ID)但我覺得除非成員數目上萬,否則x386跑個loop也不消1秒.
2.成員們最直覺的關聯便是parentNode,但是成員們本身的獨特性只有tagName==div.如果所有div並無其他用途,以vParent.getElementsByTagName即可;否則得事先設定每個成員的name屬性,就像INPUT type=radio name="radio"概念.然後每次以document.getElementsByName叫大家閉嘴.個人觀念是:不需招式正宗或華麗,但求一擊必殺的效率^^
貼心叮嚀:
1.getElementsByName目前是document的無雙技(啊!!我真的好宅)所以取name時要避開頁面其他現有同名元素;
2.我個人還滿討厭設計成獨開的Q&A,因為我過目必忘常常要打開著以便捲回去看;如果開別題而自動關閉,我就冏了XP
看來要放棄了...
因為我的div是由php的++向下延伸的
感謝您這麼仔細的回覆
獲益良多^^
向下延伸的div是指如同檔案總管那種樹狀嗎?
http://msdn.microsoft.com/en-us/library/default.aspx
反正您要放棄了,我就不妨多打幾個字:那又是另外一種思維和做法了,而且也不難XD___
張貼意見