带src链接和执行文本的script
不知道怎么去命名这种用法,所以标题干脆就那样写了,不过这种方式也不是新鲜事了,只是想到了它的另外一些作用,所以YY一下。先看HTML和JS代码样式:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
<style type="text/css">
#div {
border: 1px solid #ccc;
}
</style>
</head>
<body>
<div id="div">
Test Test Test Test Test Test Test
</div>
<!-- It is the point:既带src联入js文件,又带有执行代码 -->
<script id="load" type="text/javascript" src="test.js">
alert(MYAPP.util.Dom.getHTMLText(document.getElementById("div")));
</script>
</body>
</html>
var MYAPP = {};
MYAPP.namespace = function(s){
var names = s && typeof s.split === "function" ? s.split(".") : [];
var current = MYAPP;
for (var i = 0, l = names.length; i < l; i++) {
if (!current[names[i]]) {
current[names[i]] = {};
}
current = current[names[i]];
}
};
MYAPP.namespace("util.Dom");
var D = MYAPP.util.Dom;
D.getHTMLText = function(el){
return el.innerHTML;
}
//执行指定的script标签内的内容
eval(document.getElementById("load").innerHTML);
上面的这种eval代码的方式获取不是很且当,我也这么觉得。所以我就在test.js文件里加入了一个37K大小的javascript库来测试(测试页面,大家可以使用各自的浏览器测试一番,我是测试没问题的),这有一个非常好的用处是:减少了一个HTTP Request请求!!确实是这样的,如果按照常规的话,则需要两个script标签来写上面的结构了。
刚开始的时候,我也是按照下面比较符合常规的思路来编写test.js代码的:
var MYAPP = {};
MYAPP.namespace = function(s){
var names = s && typeof s.split === "function" ? s.split(".") : [];
var current = MYAPP;
for (var i = 0, l = names.length; i < l; i++) {
if (!current[names[i]]) {
current[names[i]] = {};
}
current = current[names[i]];
}
};
MYAPP.namespace("util.Dom");
var D = MYAPP.util.Dom;
D.getHTMLText = function(el){
return el.innerHTML;
}
//常规方式:
var script=document.getElementById("load");
if(script.onreadystatechange){
script.onreadystatechange=function(){
if(script.readyState === "loaded" || script.readyState === "complete"){
eval(script.innerHTML);
}
}
}else{
script.onload=function(){
eval(this.innerHTML);
}
}
上面的代码在FF,GC,Safari没问题,可是在IE以及Opera(因为Opera对两种判断是否load的方式都支持)下就失效了,调试了一下午的代码也都没有检查出原因,如果有知道方法和原因的,还希望不吝赐教!!(常规方式测试页面)。