[译]Javascript风格要素(二)(2)
作者:秦歌 来源:随网之舞 时间:2008-02-29 12:51:00
使用||运算符指定一个默认值
事件处理程序依赖于浏览器。理想情况下,应用程序应该通过公共库隔绝对浏览器的依赖。当没有这样的库时,就会有些函数发生如下情况:
function md(e) {
(window.event) ? ev = window.event : ev = e;
(ev.target) ? sr = ev.target : sr = ev.srcElement;
if (ev && sr && sr.id == "fp" || sr.id == "sb") st = 1;
if (sr.className.indexOf("pllist") < 0 && sr.className != "more" &&
sr.className != "plinkc" && sr.tagName != "scrollbar " &&
_toClose && _toCloseNorgie) {
d.getElementById(_toClose).innerHTML = "";
_toClose = "";
_toCloseNorgie.parentNode.className = '';
_toCloseNorgie = '';
}
}
一些浏览器把事件对象作为一个参数传给事件管理程序。微软选用把事件对象放入到一个全局的事件变量中。在Javascript中,全局变量是全局对象的成员。在浏览器中,全局对象始终包含一个window
对象成员,其值是全局对象。当测试一个变量是否存在时,通过window
访问全局变量是避免未定义变量错误的一种方法。无论如何,做这样的测试不应该是必要的。
我们能通过问它是否是另外一种,来代替首先判断是否是微软事件。
ev = e || event;
我们用||
(默认)运算符。如果e
是真,我们将有它的值,但是如果e
是假,则我们将用event
。
在下一个语句,我们又用||
运算符去确定sr
是哪个值。
我们应该用var
去声明ev
和sr
来避免全局冲突:
function md(e) {
var ev = e || event,
sr = ev.target || ev.srcElement;
if (sr && (sr.id == 'fp' || sr.id == 'sb')) {
st = 1;
}
if (sr.className.indexOf('pllist') < 0 && sr.className != 'more' &&
sr.className != 'plinkc' && sr.tagName != 'scrollbar ' &&
_toClose && _toCloseNorgie) {
d.getElementById(_toClose).innerHTML = '';
_toClose = '';
_toCloseNorgie.parentNode.className = '';
_toCloseNorgie = '';
}
}
全局变量是魔鬼
下面我们看到另一个时间处理程序。正如你所料,它重复像前面一样破坏风格。
function kd(e) {
(window.event) ? ev = window.event : ev = e;
(ev.target) ? el = ev.target : el = ev.srcElement;
if (ev && el) {
code = ev.keyCode;
id = el.id;
} else {
return;
}
ctn = lt.id.substring(1);
if (code == 13) {
return;
} else if ((code == 191 || code == 222) && id != 'fp') {
_ffs = 1;
gk = 0;
} else if ((code < 31 || code > 41) &&
(code < 16 || code > 18) && code != 9 && code != 8 ) {
gk = 1;
} else {
gk = 0;
}
if (!_ffs && (id == 'fp' || id == 'st')) {
if (code == 9) {
if (box.value == '' || (box.value != '' && (at == 1 || ev.shiftKey))) {
mt(ctn);
} else if (id == 'st' && box.value != '' && at == 0) {
at = 1;
mt(ctn);
}
} else if (id == 'fp' && gk == 0 && (box.value == '' && st == 0)
&& !ev.shiftKey && !ev.ctrlKey && !ev.altKey) {
d.getElementById('mk').focus();
d.getElementById('mk').blur();
} else if (gk == 1) {
at = 0;
}
} else if ((id == 'mk2' && box.value != '' && ev.shiftKey && code == 9) ||
(id == 'm6' && !ev.shiftKey && code == 9)){
d.getElementById('mk').focus();
} else if (!_ffs && gk == 1 && el.type != 'text' && !ev.ctrlKey && !ev.altKey){
box.value = '';
box.focus();
}
}
function mt(ctn) {
if ((ev && !ev.ctrlKey && !ev.altKey) || !ev) {
if (ev.shiftKey){
nextTab = parseInt(ctn) - 1;
} else {
nextTab = parseInt(ctn) + 1;
}
if (nextTab == 0) {
d.getElementById('mk').focus();
} else if (nextTab < 8 ) {
t(d.getElementById('v' + nextTab));
} else {
return;
}
}
}
有意思的是它有一个同伴函数mt
,它仅被kd
调用。mt
被传给一个参数ctn
,但kd
和mt
之间的通讯大部分是通过全局变量。
标签:风格,运算符,javascript
0
投稿
猜你喜欢
教你如何升级SQL Server数据库系统
2009-01-19 14:42:00
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2023-01-11 08:11:07
sql server 中删除默认约束的通用sql脚本
2009-02-01 17:23:00
python实现书法碑帖图片分割
2023-09-12 16:08:02
Python依赖包迁移到断网环境操作
2021-06-27 06:58:29
Python测试框架pytest介绍
2023-08-03 01:47:59
PPOCRLabel标注的txt格式如何转换成labelme能修改的json格式
2021-08-31 06:01:45
python神经网络MobileNet模型的复现详解
2022-09-24 19:54:14
Python简繁体转换的简单实现步骤
2023-10-03 05:02:20
python ctypes库2_指定参数类型和返回类型详解
2021-10-17 14:34:50
Python决策树分类算法学习
2023-01-28 17:27:05
使用pyqt5 tablewidget 单元格设置正则表达式
2022-12-01 22:26:54
将备份的SQLServer数据库转换为SQLite数据库操作方法
2024-01-23 18:52:52
Python正则抓取新闻标题和链接的方法示例
2022-05-16 06:01:31
全面理解javascript的caller,callee,call,apply概念
2007-12-02 17:44:00
Golang中 import cycle not allowed 问题的解决方法
2024-04-25 15:13:38
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2024-05-02 17:32:01
Python 如何给图像分类(图像识别模型构建)
2022-07-24 20:34:08
asp中Access与Sql Server数据库区别总结
2007-11-18 15:08:00
asp 小偷采集程序原理与常用函数方法
2011-03-06 10:36:00