一段时间来一直受这样的困扰,就是我的Firefox无法运行本地的dojo的测试文件。一直以为是我的firefox或者机器出了什么问题,就只好去使用IE或者Chrome去运行这些测试例子,可惜不能用firebug的确让人很不爽。
今天在firebug查看了一些错误情况,报错居然是“Access to restricted URI denied”。这个明显是跨 域访问的错误,但是本地文件怎么报这样的错呢?在Firefox的about:config搜索了一下policy,居然找到了原因所在,原来 Firefox对于本地文件也进行了同源访问的安全设置,配置参数是:security.fileuri.strict_origin_policy。这 个新的设置只是在firefox 3才被加入,并且默认是开启的。不过你也可以将这个关掉,这样就可以如同以前那样运行本地的dojo测试用例,或者其它你想本地加载的 JavaScript文件。
继续在google了一下,找了这个”feature”的由来,https://bugzilla.mozilla.org/show_bug.cgi?id=230606,大概是说本地的文件如果没有这样的限制,可以访问本机的其他文件,这样会造成安全隐患。John Resig(Father of jQuery) 也有一个blog关于这个问题,http://ejohn.org/blog/tightened-local-file-security/,下面的评论也挺值得看看的。
摘自 http://liwenbing.cn/2009/06/05/why-ff3-cannot-load-local-javascript-file/
解决firefox动态加载JS文件失败
a.js //必须把执行脚本封装到函数中去,不然alert在IE下能反复执行,而在Firefox下只能执行一次
function show(){
alert('我执行了!');
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>测试</title>
<script type="text/javascript">
function myclick(){
document.getElementById("thejs").src="a.js";
show();
}
</script>
<script type="text/javascript" id="thejs"></script>
</head>
<body>
<input type="submit" value="查询" onClick="javascript:myclick();" />
</body>
b.js //若执行代码不封装到函数中去,必须动态重新创建js文件
alert('我执行了!');
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>测试 </title>
<script type="text/javascript">
function myclick(){
var oldS=document.getElementById('thejs');
if(oldS) oldS.parentNode.removeChild(oldS);
var t=document.createElement('script');
t.src='b.js';
t.type='text/javascript';
t.id="thejs";
document.getElementsByTagName('head')[0].appendChild(t);
//document.getElementById("thejs").src="a.js";
}
</script>
<script type="text/javascript" id="thejs"> </script>
</head>
<body>
<input type="submit" value="查询" onClick="javascript:myclick();" />
</body>