前提
有一个公共的登陆弹框页面须要在多个页面引用,百度后就使用了jQuery的load技巧。
做法:
将公共的html页面提取下来,置于一个独立的HTML文件中。
之后在须要使用的html页面中,使用jQuery的load方式进行引用即可。
注:提取的部份,不须要包含多余的
、等标签,只须要放置你所用到的标签即可。
用法:
具体代码如下:
//HTML部份:
//js部份:
//当前页面的js文件
$(function(){
/*公共部份:登陆弹框*/
$("#login_box").load("../../template/login/login.html");
})
//引入的公共登入页面的js文件
不想看代码的可以看图:
carriage.js文件中的部份html代码如下所示
#9:a:8:b:8:8:4:8:1:5:9:4:2:4:e:a:7:f:6:6:a:b:6:2:b:1:7:6:f:8:b:9#
login.js文件中的部份js代码如下所示:
#5:e:3:6:4:a:c:7:1:0:2:d:b:9:1:5:3:3:f:1:d:2:b:9:0:8:b:b:f:4:6:8#
发觉问题
注:这儿以关掉按键(即.layer-close-icon元素)为例,进行了测试和调试。
代码运行后发觉:登陆弹框页面中所有元素的绑定风波都没有被触发。点击关掉按键也没有反应。
控制台调试后发觉:在为$(".layer-close-icon")注册点击风波时,根本就没有找到该元素。【如右图所示】
#a:4:a:e:c:4:8:e:9:8:c:1:8:b:a:f:f:d:a:5:e:4:6:f:0:7:f:7:0:3:2:a#
在控制台查看当前的HTML结构,发觉:此时,登陆框并没有被加载进来。所以,页面元素目前还不存在,其实获取不到该元素,也就不能为它注册点击风波了。【如右图所示】
#2:a:4:f:f:b:0:d:e:f:6:5:a:8:c:6:b:5:1:f:e:3:1:4:f:4:e:d:8:4:c:0#
后来思索了很久,也问了一下朋友,得出一个推论:这与页面中js文件的加载和执行次序有关系。
页面上的js代码是HTML页面的一部份,所以js在页面装载时的执行次序就是其引入标签的出现次序。
标签上面的js代码或则通过src引入的外部js,都是根据其句子出现的次序执行,并且执行过程是文档装载的一部份。
当页面中的DOM元素全部加载完毕后就执行jQuery中的$(document).ready(function(){})方式,或缩写为:$(function(){})。
若果在执行.ready()方式之前有js代码存在,这么会先执行ready()方式之前的js代码,之后再执行.ready()方式。
解决问题
之后通过百度搜了一段时间,忽然发觉一个似乎可行的解决方式:jQuery中的$.getScript()方式。
为何说其实可行呢?一是没见过,二是没用过,三是觉得应当没问题。
经过测试,发觉确实可行。具体代码如右图所示:
#7:b:7:c:7:e:d:b:9:1:0:7:0:c:5:8:8:5:a:9:b:7:3:9:9:9:3:e:6:9:1:1#
jQuery.getScript()函数用于动态加载JS文件,并在全局作用域下执行文件中的JS代码。
请注意:该函数是通过异步方法加载数据的。不要直接在jQuery.getScript()执行后直接调用该js文件中的变量或函数。
结束语
至此,问题就早已被解决了。
后来朋友又给我提供了一个新的思路:
加载完HTML文件以后,使用js动态创建一个script标签,之后通过它的src属性,指向你所要引入的js文件的路径。
但是load方式可以使用一个反弹函数作为第二个参数,所以我们可以在反弹函数中动态的将js文件加载进来。
具体代码如下所示:【亲测可行】
$(function(){
/*公共部份:登陆弹框*/
$("#login_box").load("../../template/login/login.html",function(){
varsc=document.createElement("script");
sc.src="../../template/login/login.js";
$("body").append(sc);
});
/*$.getScript("../../template/login/login.js",function(){
//alert("载入成功!");
});*/
})
参考资料: