动态引入js文件

背景:

                打开一个页面,需要引用js文件、css文件,以及编写一些基本的html代码。

                某个页面的功能比较丰富,需要引用大量的js文件。如果一开始就全部引进来,可能这个加载过程比较耗时。如果采用页面直接引用的方式,可能导致页面维护js文件的代码量较大,也不利于集中管理。当要消除js文件加载的缓存时,每个页面都要加上时间戳,更不利于维护。

                最好方法是,提炼一个公共方法,动态引进需要的js文件群,而这些js文件都集中维护起来。

 

选用的实施方案:

1、  Js函数,动态创建<script>并添加到当前文件。

2、  Jsp:include,引入静态的<script>标签群。

 

2种方法的优劣比较

                页面的加载顺序是从上往下进行。

                页面开始执行函数是从onload或者ready函数开始。

                JavaScript的onload方法,必须等待页面的DOM tree全部加载完成,而且要求所有的外部图片和资源全部加载完成,才开始执行。如果页面功能丰富,包含的图片或者js文件非常多,那么加载过程就很久,会让用户误以为页面性能太差,或功能失效。

                但是这种方法可以保证,onload执行的方法所依赖的外部js文件已经全部加载完毕,可以正常使用。

 

                Jquery的ready方法,只要加载完页面的dom tree,就开始执行了,不需要等待全部的外部图片和资源加载完毕。用户可以“一点点”看到页面的生成,知道页面在加载了,也即有“异步”的效果。

                但是,作为入口的ready方法,必然需要调用其他js文件的功能,ready调用的方法所依赖的外部js没有加载完成,那么就报错。这种情况导致功能的直接失效,更不能被用户接受。

 

                正常来说,按照页面的从上至下的加载顺序,如果我们在页面上直接写好<script>标签来引用外部的js文件,那么ready函数里面所依赖的js功能必行加载完毕,正常执行功能。

                所以,通过引入静态的<script>标签群,我们就可以确保ready在所有外部js文件加载完成之后执行。而ready的执行也不会被外部大图片的加载所拖累。

 

引入静态的

<jsp:include page="/js.jsp?need=_base_ext_plugin_bootstrap_"flush="true" />

 

jsp:include 引入的外部jsp文件,实际上是“完样”嵌套入当前页面,属于页面dom tree的构建过程,必然遵守“从上至下”的加载原则,所以优先于ready的执行。

 

【js.jsp】
<%@  page contentType="text/html;charset=UTF-8"%>
<%@  page trimDirectiveWhitespaces="true"%>
<%

          //通过参数need,获取不同的js文件群

Stringneed = request.getParameter("need") == null? "": request.getParameter("need");

//时间戳,在系统的首页设置到session中,则所有页面都可重用,用于消除js加载缓存

Stringversion = (String)request.getSession().getAttribute("version")== null?  "": (String)request.getSession().getAttribute("version");
%>
<title>opcm</title>
<meta http-equiv="X-UA-Compatible"content="IE=8" />
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8"/>
<%
if(need.indexOf("_base_") > -1){
%>
<link rel="stylesheet" type="text/css" href="../css/style.css"/>
<link rel="stylesheet" type="text/css" href="../css/myCss/btn.css"/>
<link rel="stylesheet" type="text/css" href="../css/MainStyle.css"/>
<script type="text/javascript" src="../js/jquery-1.9.1.min.js"></script>
<script type="text/javascript"src="../js/jquery-migrate-1.1.0.min.js"></script>
<%
}
%>

补充 :

include标签和jsp:include标签的区别


一:执行时间上: 
<%@ include file=”relativeURI”%> 是在翻译阶段执行 
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行. 

二:引入内容的不同: 
<%@ include file=”relativeURI”%> 
引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起. (所以两个文件不同定义多个contentType)

(A.jsp + B.jsp ) —— Servlet

<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本. 
A.jsp + (B.jsp - servlet)



另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释.