zoukankan      html  css  js  c++  java
  • 十九、动态加载脚本和样式

    十九、动态加载脚本和样式

     

    本章主要讲解上一章剩余的获取位置的DOM方法、动态加载脚本和样式。

     

    1.元素位置

    上一章已经通过几组属性可以获取元素所需的位置,那么这节课补充一个DOM的方法:getBoundingClientRect()。这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离。

      var box = document.getElementById('box');        //获取元素

           alert(box.getBoundingClientRect().top);             //元素上边距离页面上边的距离

           alert(box.getBoundingClientRect().right);           //元素右边距离页面左边的距离

           alert(box.getBoundingClientRect().bottom);        //元素下边距离页面上边的距离

           alert(box.getBoundingClientRect().left);             //元素左边距离页面左边的距离

     

    PS:IE、Firefox3+、Opera9.5、Chrome、Safari支持,在IE中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素,我们需要做个兼容。

           document.documentElement.clientTop;               //非IE为0,IE为2

           document.documentElement.clientLeft;               //非IE为0,IE为2

     

      function getRect(element) {

             var rect = element.getBoundingClientRect();

             var top = document.documentElement.clientTop;

             var left = document.documentElement.clientLeft;

          

             return {

                    top : rect.top - top,

                    bottom : rect.bottom - top,

                    left : rect.left - left,

                    right : rect.right - left

             }

      }

    PS:分别加上外边据、内边距、边框和滚动条,用于测试所有浏览器是否一致。

     

     

    2.动态脚本

    当网站需求变大,脚本的需求也逐步变大。我们就不得不引入太多的JS脚本而降低了整站的性能,所以就出现了动态脚本的概念,在适时的时候加载相应的脚本。

    比如:我们想在需要检测浏览器的时候,再引入检测文件。

      var flag = true;                                                 //设置true再加载

      if (flag) {

             loadScript('browserdetect.js');                     //设置加载的js

      }

     

      function loadScript(url) {

             var script = document.createElement('script');

             script.type = 'text/javascript';

             script.src = url;

             //document.head.appendChild(script);          //document.head表示<head>

        document.getElementsByTagName('head')[0].appendChild(script);

      }

     

    PS:document.head调用,IE不支持,会报错!

     

      //动态执行js

      var script = document.createElement('script');

      script.type = 'text/javascript';

      var text = document.createTextNode("alert('Lee')");           //IE浏览器报错

      script.appendChild(text);

      document.getElementsByTagName('head')[0].appendChild(script);

     

    PS:IE浏览器认为script是特殊元素,不能在访问子节点。为了兼容,可以使用text属性来代替。

      script.text = "alert('')";                                      //IE可以支持了。

     

    PS:当然,如果不支持text,那么就可以针对不同的浏览器特性来使用不同的方法。这里就忽略写法了。

     

    3.动态样式

    为了动态的加载样式表,比如切换网站皮肤。样式表有两种方式进行加载,一种是<link>标签,一种是<style>标签。

      //动态执行link

      var flag = true;

      if (flag) {

             loadStyles('basic.css');

      }

     

      function loadStyles(url) {

             var link = document.createElement('link');

             link.rel = 'stylesheet';

             link.type = 'text/css';

             link.href = url;

             document.getElementsByTagName('head')[0].appendChild(link);

      }

     

      //动态执行style

      var flag = true;

      if (flag) {

             var style = document.createElement('style');

             style.type = 'text/css';

             //var box= document.createTextNode(#box{background:red}'); IE不支持

             //style.appendChild(box);

             document.getElementsByTagName('head')[0].appendChild(style);

        insertRule(document.styleSheets[0], '#box', 'background:red', 0);

      }

     

      function insertRule(sheet, selectorText, cssText, position) {

                  //如果是非IE

             if (sheet.insertRule) {

                    sheet.insertRule(selectorText + "{" + cssText + "}", position);

                  //如果是IE

             } else if (sheet.addRule) {

                    sheet.addRule(selectorText, cssText, position);

             }

      }

     

  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/swifthua/p/7629144.html
Copyright © 2011-2022 走看看