[英]How to pass a parameter when user clicks a link
我对onclick
的参数有一个快速疑问
我有
function testPro(){
codes....
codes....
var test = 'init'; //the test can only be init here...
link.href = '#';
link.innerHTML += 'test value';
link.onclick = onClick;
link.onmouseover = onHover;
link.onmouseout = hoverOut;
codes....
}
function onHover(){
alert(test);
}
我想在用户clicks
按钮时传递测试变量。 我不能使用onHover(test)
因为它给了我错误。 我该如何解决这个问题?
非常感谢
使用一个带有事件参数的小函数表达式,并将其与test
值一起传递给onHover
:
var test = …;
link.onclick = function(event) {
return onHover(test, event);
};
// somewhere else (on a higher scope than `test`)
function onHover(arg) {
alert(arg);
}
也许像这样:
function makeClickHandler(arg) {
return function (event) {
alert(arg);
}
}
link1.onclick = makeClickHandler('arg1');
link2.onclick = makeClickHandler('arg2');
// ...
要为该按钮增加一个变量,您可以编写一个如下处理程序:
function makeClickHandler() {
var i = 0;
return function (event) {
alert(++i);
}
}
您可以将随机属性附加到DOM元素:
function testPro(){
var test = 'init';
link.href = '#';
link.innerHTML += 'test value';
link.onclick = onClick;
link.onmouseover = onHover;
link.onmouseout = hoverOut;
link.test = test;
}
function onHover(){
alert(this.test);
}
你的test
在范围定义的变量testPro
功能,不能直接使用onHover
称为在全球范围内的功能。 您可以通过以下几种方法解决此问题:
将test
变量添加到事件处理程序的关闭中
function testPro() {
...
var test = 'init';
...
link.onmouseover = function() { return onHover(test); };
...
}
function onHover(test) {
alert(test);
}
或将test
变量放入一些可全局访问的名称空间
var globals = { test: null };
function testPro() {
...
globals.test = 'init';
...
link.onmouseover = onHover;
...
}
function onHover() {
alert(globals.test);
}
或将回调执行绑定到某些包含test
对象
function testPro() {
...
var scope = { test: 'init' };
...
link.onmouseover = onHover.bind(scope);
...
}
function onHover() {
alert(this.test);
}
或将自定义数据属性添加到DOM元素
function testPro() {
...
link.setAttribute('data-test','init');
...
link.onmouseover = onHover;
...
}
function onHover() {
alert(this.getAttribute('data-test'));
}
您可以在执行范围内重新评估函数以获取闭包,但我建议使用其他方法,因为eval()并非没有警告。
因此,即使我试图说服您,这也可以通过最少的重构来完成您所要求的:
function testPro(){
var test = 'init'; //the test can only be init here...
link.href = '#';
link.innerHTML += 'test value';
link.onclick = eval( "0||"+ onClick);
}
function onClick(){
alert(test);
}
link={};
testPro();
link.onclick(); //shows "init"...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.