第七章 動態創建標記 優化圖片庫

<html>
<head>
    <title>第七章 動態創建標記 優化圖片庫</title>
</head>
<body>
    <h1>Snapshots</h1>
    <ul id="imagegallery">
        <li><a href="img/1.jpg" title="a" >a</a></li>
        <li><a href="img/2.jpg" title="b" >b</a></li>
        <li><a href="img/3.jpg" title="c" >c</a></li>
        <li><a href="img/4.jpg" title="d" >d</a></li>
        <li><a href="img/5.jpg" title="e" >e</a></li>
        <li><a href="img/6.jpg" title="f" >f</a></li>
        <li><a href="img/7.jpg" title="g" >g</a></li>
        <li><a href="img/8.jpg" title="h" >h</a></li>
    </ul>

</body>

<script type="text/javascript">
    function addloadEvent(func){
        //將現有的事件處理函數的值存入變量中
        var oldonload =window.onload;   
        //如果這個事件處理函數沒有綁定任何函數,就把新函數添加給它
        if(typeof window.onload!="function"){
            window.onload=func;
        }else{
        //如果已經綁定了函數,就把新函數追加到現有指令的末尾
            window.onload=function(){
                oldonload();
                func();
            }
        }
    }

    function insertAfter (newElement,targetElement) {
        //把被插入的元素的父元素存進一個變量裏
        var parent=targetElement.parentNode;
        //如果最後的節點是目標元素,則直接添加。因爲默認是最後
        if (parent.lastChild==targetElement) {
            parent.appendChild(newElement);
        }else{
        //如果不是,則插入在目標元素的下一個兄弟節點 的前面。也就是目標元素的後面 
            parent.insertBefore(newElement,targetElement.nextSibling)
        }
    }

    function prearePlaceholder(){
        //if語句均爲測試是否存在
        if (!document.createElement)return false; 
        if (!document.createTextNode)return false; 
        if (!document.getElementById)return false; 
        if (!document.getElementById("imagegallery"))return false; 
        //創建一個img元素
        var placeholder=document.createElement("img");
        //爲img元素添加id屬性
        placeholder.setAttribute("id","placeholder");
        //爲img元素添加alt屬性
        placeholder.setAttribute("alt","my imgae gallery");
        //創建一個p元素
        var description=document.createElement("p");
        //爲p元素添加id屬性
        description.setAttribute("id","description");
        //創建一個文本節點
        var desctxt=document.createTextNode("這是圖片描述語句");
        //添加到p元素中
        description.appendChild(desctxt);
        //獲取ul列表
        var gallery=document.getElementById("imagegallery");
        //添加到這個列表後邊
        insertAfter(placeholder,gallery);
        //添加到img元素後邊
        insertAfter(description,placeholder);
    }




    function prepareGallery(){
        // 三個if都是測試 是否存在
        if (!document.getElementById)return false; 
        if (!document.getElementsByTagName)return false; 
        if (!document.getElementById("imagegallery"))return false; 
        //獲取ul列表
        var gallery=document.getElementById("imagegallery");
        //獲取ul列表裏面的a元素
        var links=gallery.getElementsByTagName("a");
        //遍歷所有的a元素,並添加點擊事件
        for (var i = 0; i < links.length; i++) {
            links[i].onclick=function(){
                //測試,有showpic()則阻止a元素默認行爲,無則不阻止
                return showPic(this)?false:true;
            }
            //把點擊事件的行爲方法同樣給到鍵盤事件    
            links[i].onkeypress=links[i].onclick
        }
    }
    prepareGallery();

    function showPic(whichpic){
        //測試是否存在
        if (!document.getElementById("placeholder")) return false;
        //獲取 href 屬性的鏈接
        var source=whichpic.getAttribute("href");
        //獲取佔位符
        var placeholder=document.getElementById("placeholder");
        //測試是否存在    
        if(placeholder.nodeName!="IMG")return false;
        //把獲取 href 屬性的鏈接給到佔位符的 src 
        placeholder.setAttribute("src",source);

        //測試是否存在
        if (document.getElementById("description")){
            //三元操作符,判斷,有選擇前者,無選擇後者,獲取的值給到text
            var text=whichpic.getAttribute("title")?whichpic.getAttribute("title"):"";
            //獲取 p 元素
            var description=document.getElementById("description");
            //判斷節點是否等於3(文本節點)
            if(description.firstChild.nodeType==3){
                //把獲取的 litile 屬性的值給到 p 元素的文本節點
                description.firstChild.nodeValue=text;
            }       
        }return true;       
    }
    addloadEvent(prearePlaceholder);
    addloadEvent(prepareGallery);

    /*


    本章裏,知識點: document.write
                  innerHTML
                  createElement
                  createTextNode
                  appendChild
                  insertBefore
    封裝的實用函數:insertAfter
                  addEvent

    使用這些方法的關鍵是將web文檔視爲節點樹。用createElement等方法創建
    出來的節點只是javascript世界裏的孤兒,利用appendChild和insertBefore
    方法,把這些對象插入某個文檔的節點樹,讓他們呈現在瀏覽器裏。

(我並沒有添加css代碼使其美化,有興趣的可自己琢磨,因爲這個頁面着實有些醜)
    */
</script>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章