Re: [問題] 研究別人的程式有些地方看不懂Orz
先看 MM_showHideLayers 再看 MM_findObj
※ 引述《kaworutabris (相如)》之銘言:
: <SCRIPT type=text/JavaScript>
: <!--
: function MM_findObj(n, d) {
MM_findObj 的目的是在指定的 document d 中,尋找 id 是 n 的物件.
: var p,i,x; if(!d) d=document;
d 代表 document, 如果這個參數沒給,就內定為目前整個網頁的 document.
: if((p=n.indexOf("?"))>0&&parent.frames.length) {
先判斷指定的 id n 內有沒有 ? 符號,並判斷父網頁有沒有很多框架.
如果有,
: d=parent.frames[n.substring(p+1)].document;
將 document d 鎖定在名為 n.substring(p+1) 的框架內的網頁.
之前判斷 id n 有 ? 出現的位置,先存在 p 裏頭.
: n=n.substring(0,p);}
並且將 id n 的前 p 個字當做新的 id n.
可見網頁中每個 id 的命名有特定格式,並以 ? 符號作分隔.
: if(!(x=d[n])&&d.all) x=d.all[n]; for
檢查 d[n] 可不可以讀到物件,並 d.all 可不可以讀到物件.
這是用來判斷某個瀏覽器,並使用適合的程式寫法.
: (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
這裏連前一行的 for 一起讀,是個迴圈,讀遍 document d 的每一個 form,
找找看裏頭有沒有 id 名叫 n 的物件. 找到了就會停下來.
: for(i=0;!x&&d.layers&&i<d.layers.length;i++)
再用另一個迴圈讀遍 document d 的每一個 layer,
(這 layer 我不熟; d.layers 可能是某個瀏覽器的物件模型)
: x=MM_findObj(n,d.layers[i].document);
用 MM_findObj 函數(也就是目前正在解說的)找找看每個 layer 內含的 document
有沒有 id 是 n 的物件.
: if(!x && d.getElementById) x=d.getElementById(n);
再不然,檢查 d.getElementById 能不能讀到物件,能讀到就用 d.getElementById
讀取 id 為 n 的物件.
請注意,前面幾項判斷全都有 !x, 意思是從前面到這裏,按著順序嘗試讀取 id
為 n 的物件; 第一種方法讀不到,就讀第二個,第二個讀不到,就讀第三個...
讀出的結果丟進 x 裏, 之後如果 x 仍不是合格的物件 (以 !x 判斷)
就做下一種嘗試.
: return x;
: }
最後把 x 物件傳回去. 結果 x 也可能是空值,是因為都沒有 id 為 n 的物件.
: function MM_showHideLayers() { //v6.0
MM_showHideLayers 是雙用途函數,可讓指定物件隱藏或顯示.
所接受的參數,依主程式呼叫來看,有三個: id, 不明物, show/hide指示文字.
由本函數程式來看, (for迴圈) 可以一次處理很多個物件,
每個物件都有三個一組的參數,參數按順序擺在陣列裏.
: var i,p,v,obj,args=MM_showHideLayers.arguments;
args=MM_showHideLayers.arguments 是讀取本函數所傳入的參數.
: for (i=0; i<(args.length-2); i+=3) if
迴圈, 跳著讀取每個物件的 id 參數,
: ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
連上一行 if 一起看,用 MM_findObj 函數尋找 document 有沒有所指定 id 的物件,
如果有,就用 args[i+2] 抓取這個 id 的物件要 show 或 hide 的指示.
: if (obj.style) { obj=obj.style;
檢查這個物件有沒有 style 可設定, (較舊的瀏覽器沒有 style)
然後讓 obj 變數參考到該物件的 style 集合.
: v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
最後用 ? : 三元運算式做一些 if-then-else 動作,
如果指示是 show, 就把 v 設定為 visible 字串,
否則若指示是 hide, 就把 v 設定為 hidden 字串,
要不然就不動.
(這樣,如果函式呼叫寫成 MM_showHideLayers('map1','','visible') 也行得通.)
: obj.visibility=v; }
: }
最後 obj 所參考的 style 集合中,把 visibility 設定為 v 字串.
: ---------------------------
: 主程式在呼叫時:
: onclick="MM_showHideLayers('map1','','show')"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.108.66
推
02/22 17:38, , 1F
02/22 17:38, 1F
推
02/22 19:43, , 2F
02/22 19:43, 2F
推
02/22 20:52, , 3F
02/22 20:52, 3F
→
02/22 20:53, , 4F
02/22 20:53, 4F
→
02/22 20:54, , 5F
02/22 20:54, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章