最近这半年作为一个java 程序员,我写的javaScript代码都快比java代码多了,前段时间是给某银行做一个柜员管控系统,在柜员授权这一块功能上,由于柜员的授权需要考虑各方面的因素,比如机构权限、柜员类型权限、岗位权限,业务权限等等,并且要对这些权限要做多次的交集或者并集处理,页面上不得不用许多的javascript来进行控制。造成了这一功能模块的实现上javaScript代码比java代码负责的情况。
而现在又要给某银行开发一个保管箱管理系统,其核心功能块保管箱座管理以及保管箱管理,为实现管理功能上类似与C/S架构那样直观、方便,并将处理结果实时的显示给操作人员,经过几日思考与实验,最终使用CSS+javaScript+java来进行开发,用java来处理业务逻辑,用CSS用来表现目标对象的各种状态,用javaScript来根据目标对象的状态转变,来实现其CSS的切换。
在这其中遇到了一个难题,就是在javaScript中给一个html元素注册click事件处理函数时,还比如给该处理函数传3个参数。可是不管是使用下面那种方式(node表示要注册事件的节点,fun为事件处理函数)都不能给事件处理函数传递参数:
node.addEventListener('click', fun, false);
node.attachevent('onclick', fun);
Node['onclick']=fun
显然以方式都不行,注意一下写法都是不正确的:
node.addEventListener('click', fun(arg1,arg2,arg3), false);
node.attachevent('onclick', fun(arg1,arg2,arg3));
Node['onclick']=fun(arg1,arg2,arg3)
好在读过一本书《JavaScript.DOM高级程序设计》,在这本书上找到了解决方案。首先编写一个方法:
function bindFunction(obj, func){
var args = [];
for(var i =2; i <
arguments.length; i++) {
args.push(arguments[i]);
}
return function(){
func.apply(obj, args);
};
};
然后在自己的js库中添加如下两个方法,如有不明白的地方,可以参考《JavaScript.DOM高级程序设计》,其中该书2.3小节有该方法的说明,只是本人加了些许改动:
function bindFunction(obj, func){
var args = [];
for(var i =2; i <
arguments.length; i++) {
args.push(arguments[i]);
}
return function(){
func.apply(obj, args);
};
};
window['OYF_MARK']['bindFunction'] =
bindFunction;
function addEvent(node, type, listener){
//使用前面的方法检查兼容性以保证平稳退化
if (!isCompatible()) {
return false
}
if (!(node = $(node)))
return false;
if (node.addEventListener) {
//W3C的方法(冒泡事件,如果将false改为true,则为捕获事件)
node.addEventListener(type,
listener, false);
return true;
}
else
if (node.attachEvent) {
//MSIE的方法
node['e' + type + listener] =
listener;
node[type + listener] =
function(){
node['e' + type +
listener](window.event);
}
node.attachEvent('on' + type,
node[type + listener]);
return true;
}
//若两种方法都不具备则返回false
return false;
};
window['OYF_MARK']['addEvent'] = addEvent;
以上两个函数为本人根据《JavaScript.DOM高级程序设计》中源代码稍作修改,添加到自己的的一个js库中,以便复用。接下来就可以使用如下方式给元素注册事件并向事件处理函数传递参数了:
//注册新的onclick事件处理函数
OYF_MARK.addEvent(e,'click',OYF_MARK.bindFunction(e,getContainerDetail,x,y,containid));
相关推荐
- 事件监听和触发:在事件驱动的编程模型中,事件可以作为数据传递的一种手段,通过监听和触发事件来传递信息。 - 导入/导出(模块系统):在ES6引入模块系统后,可以使用`import`和`export`关键字在模块间传递数据...
在函数中,可以通过arguments对象来访问所有传递给函数的参数。关于函数的定义,JavaScript没有严格要求声明返回值类型,函数如果没有明确的return语句,则默认返回undefined。函数定义以`function`关键字开头,可以...
本文将深入浅析JavaScript事件的用法,主要包括事件流、事件处理程序的添加方式以及事件对象。 首先,事件流定义了事件从发生到处理的顺序。DOM2级规范中,事件流分为三个阶段: 1. 事件捕获阶段:事件从文档根...
2. **DOM事件**:当DOM事件触发时,可以注册回调函数进行处理。 3. **setTimeout和setInterval**:这两个函数的延迟执行特性使得它们成为回调函数的经典应用场景,特别是当延迟时间为0时,用于模拟微任务的执行。 4....
主要介绍了浅析JavaScript中的变量复制、参数传递和作用域链 的相关资料,需要的朋友可以参考下
在JavaScript中,这些知识点可以综合运用,例如使用箭头函数作为事件处理器或回调函数,利用生成器来实现迭代算法或异步操作,以及通过Date对象来处理与时间相关的数据和功能。箭头函数的出现使得函数表达式更加简洁...
《深入理解JavaScript Promise:从基础到实践》 Promise,作为ES6引入的一种异步编程解决方案,极大地改善了JavaScript中处理回调地狱的困境。它提供了一种更为优雅的方式来组织和管理异步操作,使得代码结构清晰,...
在示例中,`list`函数接受任意数量的参数,通过`bind()`我们创建了一个`leadingThirtysevenList`,它总是将37作为第一个参数传递,然后可以在调用时传入其他的参数。 另一个常见用例是结合`setTimeout`或`...
在JavaScript中,函数是一种一等公民,这意味着函数可以作为变量赋值、作为参数传递,甚至作为其他函数的返回值。理解Function类型对于深入学习JavaScript至关重要。 1. **Function类型是引用类型**:不同于...
因此,当尝试访问未定义的变量、对象不存在的属性、函数未返回值或函数参数未传递时,都会得到 `undefined`。例如: ```javascript var test; // undefined console.log(test == undefined); // true var o = {}; ...
JavaScript中的形参(形式参数)和实参(实际参数)是函数调用的核心概念。形参是在函数定义时声明的,它们是函数内部使用的占位符,用于接收调用时传递的实际值。实参则是调用函数时提供的具体值,它们会被绑定到...
如果上一个Promise成功(fulfilled),新Promise也会成功,并将上一个Promise通过`resolve`传递的值作为参数传递给下一个回调。如果上一个Promise失败(rejected),新Promise也会失败,传递的错误会被下一个`catch`...
JavaScript是一种动态类型语言,它的参数传递机制经常是开发者们讨论的焦点。在JavaScript中,参数传递主要有两种形式:按值传递和按共享传递,但这种分类并不完全准确。JavaScript的基本数据类型(如数字、字符串、...
在JavaScript中,数据传递通常通过函数参数和返回值实现,也可以通过事件监听和发布来实现跨作用域的数据传递。例如,可以使用`addEventListener`和`dispatchEvent`在Page或UI之间传递信息。 理解JavaScript中的...
这种类型的函数可以通过将其作为另一个函数的参数传递、存储在变量中或者直接定义并在定义后立即调用等方式来使用。 #### 自执行匿名函数的概念 自执行匿名函数,顾名思义,是在定义的同时立即执行的匿名函数。它...
回调函数是JavaScript编程中一种非常重要的机制,它允许我们把函数作为参数传递给其他函数,并在特定的时刻由其他函数来调用这个被传递的函数。这种技术广泛应用于事件处理、异步编程以及控制代码执行流程等场景。 ...