Re: [問題] 研究別人的程式有些地方看不懂Orz

看板Ajax作者 (ephesians)時間18年前 (2007/02/22 16:56), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串2/2 (看更多)
先看 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
謝謝ephesians高人Q○Q好詳細,太好了.雖然很難懂,
02/22 20:52, 3F

02/22 20:53, , 4F
不過終於比較了解了>///< 不過還是有很多問號,若研
02/22 20:53, 4F

02/22 20:54, , 5F
究完後有問題在提問.(好感動)謝謝Orz
02/22 20:54, 5F
文章代碼(AID): #15tLgZPT (Ajax)
文章代碼(AID): #15tLgZPT (Ajax)