zoukankan      html  css  js  c++  java
  • JavaScript(第二十二天)【动态加载js和css】

    学习要点:

    1.元素位置

    2.动态脚本

    3.动态样式

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

     

    一.元素位置

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

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

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

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

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

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

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

    document.documentElement.clientTop; //IE0IE2

    document.documentElement.clientLeft; //IE0IE2

    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:分别加上外边据、内边距、边框和滚动条,用于测试所有浏览器是否一致。

    二.动态脚本

    当网站需求变大,脚本的需求也逐步变大。我们就不得不引入太多的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);

    }

    PSdocument.head调用,IE不支持,会报错!

    //动态执行js

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

    script.type = 'text/javascript';

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

    script.appendChild(text);

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

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

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

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

     

    三.动态样式

    为了动态的加载样式表,比如切换网站皮肤。样式表有两种方式进行加载,一种是<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);

    }

    }

  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/sdorm/p/8335796.html
Copyright © 2011-2022 走看看