• (DOM艺术)图片仓库改进一:完全分离


    • 因为上个版本中的图片占位区和文字占位区完全是给showPic脚本服务的,所以这里在JS脚本里用DOM的create系列方法把结构和行为彻底分开
    • DOM中提供了insertBefore方法,但没有inserAfter,因为这里占位区是在ul之后,所以我们这里手写这个方法。
    • 注意innerHTML方法和create方法,appendChild方法的区别,innerHTML是不管元素节点里面有没有HTML内容,里面的全部内容都将替换成innerHTML的内容,当然比较方便,如果想对插入的内容进行处理,还需要DOM提供的那些精确地方法和属性。innerHTML也是HTML专有属性,不能用于任何其他标记语言文档。
    • 共享onload事件原理:将原来的load事件进行备份如果之前没有监听,则直接将此函数设为监听函数,如果已设置,则设为一个新的函数,这个新的函数被触发后,会先后触发原来的监听函数和你要设置的监听函数。这样就实现了onload加载的一个事件队列。保证了监听函数都是在onload加载之后,也就是页面加载完毕时执行函数,即document文档形成之后执行函数。(网页加载完毕时会触发一个onload事件)

    剩下的就是代码了:

    showPic.js:

    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 preparePlaceholder() {
      if (!document.createElement) return false;
      if (!document.createTextNode) return false;
      if (!document.getElementById) return false;
      if (!document.getElementById("imagegallery")) return false;
      var placeholder = document.createElement("img");
      placeholder.setAttribute("id","placeholder");
      placeholder.setAttribute("src","images/placeholder.gif");
      placeholder.setAttribute("alt","my image gallery");
      var description = document.createElement("p");
      description.setAttribute("id","description");
      var desctext = document.createTextNode("Choose an image");
      description.appendChild(desctext);
      var gallery = document.getElementById("imagegallery");
      insertAfter(placeholder,gallery);
      insertAfter(description,placeholder);
    }
    
    function prepareGallery() {
      if (!document.getElementsByTagName) return false;
      if (!document.getElementById) return false;
      if (!document.getElementById("imagegallery")) return false;
      var gallery = document.getElementById("imagegallery");
      var links = gallery.getElementsByTagName("a");
      for ( var i=0; i < links.length; i++) {
        links[i].onclick = function() {
          return showPic(this);
    	}
        links[i].onkeypress = links[i].onclick;
      }
    }
    
    function showPic(whichpic) {
      if (!document.getElementById("placeholder")) return true;
      var source = whichpic.getAttribute("href");
      var placeholder = document.getElementById("placeholder");
      placeholder.setAttribute("src",source);
      if (!document.getElementById("description")) return false;
      if (whichpic.getAttribute("title")) {
        var text = whichpic.getAttribute("title");
      } else {
        var text = "";
      }
      var description = document.getElementById("description");
      if (description.firstChild.nodeType == 3) {
        description.firstChild.nodeValue = text;
      }
      return false;
    }
    
    addLoadEvent(preparePlaceholder);
    addLoadEvent(prepareGallery);
    

    gallery.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta http-equiv="content-type" content="text/html; charset=utf-8" />
      <title>Image Gallery</title>
      <script type="text/javascript" src="scripts/showPic.js"></script>
      <link rel="stylesheet" href="styles/layout.css" type="text/css" media="screen" />
    </head>
    <body>
      <h1>Snapshots</h1>
      <ul id="imagegallery">
        <li>
          <a href="images/fireworks.jpg" title="A fireworks display">
            <img src="images/thumbnail_fireworks.jpg" alt="Fireworks" />
          </a>
        </li>
        <li>
          <a href="images/coffee.jpg" title="A cup of black coffee" >
            <img src="images/thumbnail_coffee.jpg" alt="Coffee" />
          </a>
        </li>
        <li>
          <a href="images/rose.jpg" title="A red, red rose">
            <img src="images/thumbnail_rose.jpg" alt="Rose" />
          </a>
        </li>
        <li>
          <a href="images/bigben.jpg" title="The famous clock">
            <img src="images/thumbnail_bigben.jpg" alt="Big Ben" />
          </a>
        </li>
      </ul>
    </body>
    </html>
    

    layout.css:

    body {
      font-family: "Helvetica","Arial",serif;
      color: #333;
      background-color: #ccc;
      margin: 1em 10%;
    }
    h1 {
      color: #333;
      background-color: transparent;
    }
    a {
      color: #c60;
      background-color: transparent;
      font-weight: bold;
      text-decoration: none;
    }
    ul {
      padding: 0;
    }
    li {
      float: left;
      padding: 1em;
      list-style: none;
    }
    #imagegallery {
      list-style: none;
    }
    
    #imagegallery li {
      display: inline;
    }
    
    #imagegallery li a img {
      border: 0;
    }
  • 相关阅读:
    原生代码实现Promise
    HTTP与HTTPS的区别
    windows常用命令-长期更新
    git 常用命令
    原型和原型链
    vue 中一些API 或属性的常见用法
    移动端屏幕适配
    Nuxt.js(开启SSR渲染)
    vue+element-ui 实现分页(根据el-table内容变换的分页)
    vue中引入jQuery和bootstrap
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7643680.html
Copyright © 2020-2023  润新知