<!-- 1、终止脚本程序流的函数, 类似C语言的exit(0)或PHP的exit函数 -->
发现无论怎么整都不会影响button id为bottom1和top的js部分, 也就是说这两个按钮怎么按都有反应, 读者至少可以体会document.getElementById('bottom2').onclick = function () { return f(); } 与<button id="bottom2" οnclick="return f()">bottom2</button>的某一个区别: 前者可能永远都不被执行(语法错误导致程序流中断), 而后者肯定有可能会被执行,若被中断肯定是因为函数f有问题或者οnclick=""中双引号内的js代码有问题
<button id="top" οnclick="alert('top')">top</button>
<script type="text/javascript">
// 方法1:
// 通过创建未声明未定义的变量让浏览器检测到脚本错误从而终止脚本后续代码的执行
// 如果不调用exit1()函数那么函数内的代码将不会得到调用,进而不会影响任何后续代码
// 如果担心命名空间污染问题,可以考虑使用匿名函数(function(){//exit1 body })();
// 事实上调用此方法会抛出一个引用错误异常,本质上和下面的方法exit2相同
function exit1(){
eval('nonexistingvariable_' + (Math.random() + '').substr(2) + ';' ); // 对不存在的变量求值
// FVRRWVDA; // 或硬编码一个不存在的变量名`FVRRWVDA;`,但需保证在调用此函数之前FVRRWVDA未声明且未定义(无论是全局or局部的)
}
// 方法2:
// 抛出一个不被捕获(程序员自己控制)的异常
function exit2() {
throw 'Exit with uncaught exception!';
}
// 方法3:
// 在要调用exit();的地方写上 0_invalidvariablename; // 利用变量名不能以数字开头(Why?js不允许,想想看若能以数字开头, 那12也可作变量名了))
// 不推荐这种做法,这样做会引起语法错误,会影响对后续代码的解析,甚至还会影响对前面代码的解析
try {
exit1();
//exit2();
//0_invalidvariablename; // 不推荐这种做法, 这么做会引起一些令人迷惑的错误,火狐上这样整会使后面不能调用exit1或exit2
} catch (e) {
alert('Exception: ' + e);
}
window.onload = function () { document.getElementById('bottom2').onclick = function () { alert(this.id); } }
</script>
<script type="text/javascript" src="/test.js"></script>
<script type="text/javascript">
alert('test.js out of test.js');
alert(typeof exit1);
</script>
<button id="bottom1" οnclick="alert('buttom1')">bottom1</button>
<button id="bottom2">bottom2</button>
test.js
alert('test.js in test.js');
exit2();
alert('test.js in test.js again');
发现无论怎么整都不会影响button id为bottom1和top的js部分, 也就是说这两个按钮怎么按都有反应, 读者至少可以体会document.getElementById('bottom2').onclick = function () { return f(); } 与<button id="bottom2" οnclick="return f()">bottom2</button>的某一个区别: 前者可能永远都不被执行(语法错误导致程序流中断), 而后者肯定有可能会被执行,若被中断肯定是因为函数f有问题或者οnclick=""中双引号内的js代码有问题
方法1和2只能应用于非try {} catch {} 中, 否则由于捕获异常而没能终止程序流, 所以这样是没法使exit1,exit2工作的
function g() { exit1(); }
function h() { g(); }
(function () { try { g(); } catch(e) {} })(); // 没法终止的, 因为已经捕获了, 间接的捕获也不行, 别玩我
在不捕获异常的情况下, 方法1和方法2只能作用于包含它们的文件, 没法控制其他js文件中的程序流的终止, 比如test.js中的程序流, 所以alert('test.js in test.js');总会执行
自行修改注释以测试, 终止程序流在某些情况下是有必要滴
<!-- 2、解决firefox, IE6刷新缓存iframe问题 -->
container.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>iframe</title>
</head>
<body>
<script type="text/javascript">
function f() {
// window.userchange = true; // 把注释去掉就能解决火狐刷新缓存iframe的问题
document.getElementById('iframe').src = 'target.html';
}
</script>
<div><button οnclick="f();">Click me to change iframe src</button></div>
<div><iframe id="iframe" src=""></iframe></div>
</body>
</html>
target.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>iframe</title>
</head>
<body>
<script type="text/javascript">
if (typeof window.top.userchange == 'undefined') {
alert('你丫刷新来忽悠我了是吧');
// exit2(); // 通过刷新的终止后续脚本程序流执行
}
// 或者
// if (typeof window.top.userchange != 'undefined') {
// // 添加额外的执行代码
// }
if (typeof window.top.userchange != 'undefined') {
alert('火狐你个小样,你以为你缓存iframe我就没招了啊!?你刷新你看不到我信不信?');
}
</script>
some content
</body>
</html>
测试方法, 点击Click me to change iframe src按钮, 然后刷新看效果, 然后去除// window.userchange = true; 前面的//, 再看效果. 原理很简单, 不解释(现在没时间)