我的目标是在使用javascript单击按钮元素时更改按钮元素的边框样式。我创建了一个函数setBorder
并将其分配给所有按钮元素上的onclick事件:
function setBorder(myobj) {
myobj.style.borderStyle = "inset";
}
var menubtn = document.getElementById("menu_btn");
menubtn.onactive = setBorder(menubtn);
这里的问题是页面加载后边框样式会立即更改,因为在解析javascript时,由于括号setBorder()
而执行函数()
。我想到的另一种选择是:
function setBorder() {
this.style.borderStyle = "inset";
}
var menubtn = document.getElementById("menu_btn");
menubtn.onactive = setBorder;
我认为this
会接受对象menubtn
- 但这并没有发生。为什么this
没有取对象menubtn
?
我认为可以有一种方式可以将setBorder
链接为所有按钮元素的原型对象。原型对象将具有函数func_SetBorder
作为其属性。然后我们可以将func_setBorder
称为:
menubtn.onclick = menubtn.func_setborder;
答案 0 :(得分:1)
此解决方案通过使用function closure实现了您所寻找的目标。
var buttons = [ ... ]; // An array containing the buttons
for (let b of buttons) {
b.onactive = onActive(b);
}
function onActive(button) {
return function () {
button.style.borderStyle = 'inset';
}
}
答案 1 :(得分:1)
你想要的是绑定或绑定参数。 Javascript提供了一种绑定函数的本机方式。如果您只想绑定参数,可以使用here引用的此方法:
Function.prototype.arg = function() {
if (typeof this !== "function")
throw new TypeError("Function.prototype.arg needs to be called on a function");
var slice = Array.prototype.slice,
args = slice.call(arguments),
fn = this,
partial = function() {
return fn.apply(this, args.concat(slice.call(arguments)));
// ^^^^
};
partial.prototype = Object.create(this.prototype);
return partial;
};
您可以这样使用它:
function setBorder(myobj) {
myobj.style.borderStyle = "inset";
}
var menubtn = document.getElementById("menu_btn");
menubtn.onactive = setBorder.arg(menubtn);
或者:
function setBorder() {
this.style.borderStyle = "inset";
}
var menubtn = document.getElementById("menu_btn");
menubtn.onactive = setBorder.bind(menubtn);
答案 2 :(得分:1)
通过 CSS
#menuBtn:active{
border-style:inset;
}
通过 Javascript
您应该将eventlistener
属性视为
menubtn.addEventListener("mousedown", setBorder);
menubtn.addEventListener("mouseup", removeBorder);
在setBorder
和removeBorder
功能内,您可以使用this
答案 3 :(得分:0)
将其分配给变量。
var functionName = function () {
//things
}
答案 4 :(得分:0)
如果您希望this
功能menubtn
为setBorder
,则需要绑定它:
menubtn.onclick = setBorder.bind(menubtn)
答案 5 :(得分:0)
好吧,在JavaScript中,当您在this
中的函数内使用this
关键字时,它将指向您调用函数的对象。所以,你有这样的功能
function myFunc() {
this.do_smth;
}
然后你调用它:my_obj.myFunc()
,然后,在myFunc
this
内将指向my_obj
。
假设您想用另一个对象调用您的函数:
obj_foo.myFunc()
在这种情况下,您的函数中的this
将指向obj_foo
如果您想使用不同的对象调用您的函数(但必须确保您的对象具有相同的属性),最好使用call/apply
或bind
。
bind
会对您的函数说“这是您应该使用的范围”。但是,在使用this
的情况下,您应始终将函数绑定到不同的对象。更加美观和安全的方式是使用call/apply
。您也应该每次都使用call/apply
调用您的函数,例如bind
,但它看起来更好。
因此,您的代码应如下所示:setBorder.call(menubtn)