• 动态加载JS和CSS


    采用了HTML和CSS/JS分离的形式来设计页面,这样就意味着需要通过链式导入的方式将需要的文件导入到HTML文件中,这样做达到了分离的目的,可也会带来一些问题。

      1.同一个CSS或JS在每个页面都需要导入一次,这必然导致了代码的重复。

      2.导入路径的写法,是用绝对路径还是相对路径?

        ①绝对路径:必须从项目的根路径写起,如果项目改名或者文件重命名就会导致所有HTML页面的导入路径都需要改一遍,这显然太大费周章了。

        ②相对路径:如果HTML页面文件的层级不一致,就会导致我需要判断导入的文件相对该HTML页面是在哪个层级,然后去写多少个“../”,这样才能正确引入。

    解决以上问题,只要通过一个共通的JS文件(例如common.js),然后以JS代码动态导入的方式就可以解决。

      1.编写common.js

     1 /**
     2  * JS/CSS文件导入
     3  * @param filePath 文件路径
     4  * @param fileType 文件类型(js、css)
     5  * @return
     6  */
     7 function loadJsOrCssFile(filePath){
     8     
     9     var isJsFile = /js$/i.test(filePath);
    10     var fileType = isJsFile ? "js" : "css";
    11 
    12     if (isIncludeFile(filePath, isJsFile)) {
    13         return;
    14     }
    15 
    16     if (fileType == "js"){
    17 
    18         var fileRef = document.createElement('script')
    19         fileRef.setAttribute("type","text/javascript")
    20         fileRef.setAttribute("src", filePath)
    21     }else if (fileType == "css"){
    22 
    23         var fileRef = document.createElement("link")
    24         fileRef.setAttribute("rel", "stylesheet")
    25         fileRef.setAttribute("type", "text/css")
    26         fileRef.setAttribute("href", filePath)
    27     }
    28 
    29     if (typeof fileRef != "undefined") {
    30 
    31         document.getElementsByTagName("head")[0].appendChild(fileRef)
    32     }
    33 }
    34 
    35 /**
    36  * 判断JS/CSS文件是否导入
    37  * @param fileName 文件名
    38  * @return 是否导入
    39  */
    40 function isIncludeFile(fileName, isJsFile){
    41     
    42     var fileRefArray = document.getElementsByTagName(isJsFile ? 'script' : 'link');
    43     for(var i = 0,len = fileRefArray.length; i < len; i++) {
    44         if (fileRefArray[i][isJsFile ? 'src' : 'href'].indexOf(fileName) != -1) return true;
    45     }
    46     return false;
    47 }
    48 
    49 // 基础路径(绝对路径)
    50 var basePath = "/smilenursecare/view/";
    51 // JS文件存放路径(绝对路径)
    52 var basePathJs = "/smilenursecare/view/js/";
    53 // CSS文件存放路径(绝对路径)
    54 var basePathCss = "/smilenursecare/view/css/";
    55 
    56 
    57 // 导入共通的JS和CSS
    58 loadJsOrCssFile(basePathCss + "general.css");
    59 loadJsOrCssFile(basePath + "header/css/smart.css");
    60 loadJsOrCssFile(basePath + "lib/TinyDropdown/style.css");
    61 
    62 loadJsOrCssFile(basePathJs + "jquery-1.7.1.min.js");
    63 loadJsOrCssFile(basePath + "lib/TinyDropdown/script.js");
    64 loadJsOrCssFile(basePathJs + "corpus.js");
    65 loadJsOrCssFile(basePathJs + "control.js");
    66 
    67 // 导入选项卡相关的JS和CSS
    68 function loadTabsFile(){
    69   loadJsOrCssFile(basePath + "lib/tabs/ui.tabs.css");
    70   loadJsOrCssFile(basePath + "lib/tabs/ui.core.js");
    71   loadJsOrCssFile(basePath + "lib/tabs/ui.tabs.js");
    72 }
    common.js

      利用loadJsOrCssFile()函数,可自定义选择加载哪些文件。路径可定义多个,因为定义的是绝对路径,所以无需担心相对路径带来的层级问题,如果项目改名或者文件路径修改了,只需要修改基础路径的变量值就可以了,这样做增强了项目的可移植性和灵活性。另外,loadTabsFile()这类函数也可根据需要定义多个并且加载内容不同,这样根据需要导入相应的内容,同时isIncludeFile()函数的验证也有效避免了单个页面重复导入的问题。

      2.将common.js以相对路径的方式导入到HTML

    <script type="text/javascript" src="../js/common.js"></script>

      如果有模板HTML文件最好,这样只需要在模板HTML文件导入一次就可以了。

  • 相关阅读:
    循序渐进学Python 1 安装与入门
    常用yum命令小结
    为CentOS配置网易163的yum源
    PHP合并数组+与array_merge的区别
    让Docker功能更强大的10个开源工具
    Docker入门系列8
    Docker入门系列7 动态映射端口port mapping
    e 的由来
    ROS教程5 使用串口
    1 ROS+ 使用ORB_SLAM2进行全场定位
  • 原文地址:https://www.cnblogs.com/lishaofei/p/5147869.html
Copyright © 2020-2023  润新知