按钮的颜色,具有公共对象实例的事件侦听器
The color of a button, event listeners with a common object instance
我试图添加类似于CSS伪类的功能;"活动";,但是使用普通的JavaScript。我试图在按下按钮时更改按钮的颜色,然后在释放按钮时恢复原始颜色。这是我的:
myButton.addEventListener("mousedown", btnEvent);
myButton.addEventListener("mouseup", btnEvent);
...
btnEvent = function (e) {
var storedColor;
if (e.type == 'mousedown') {
storedColor= e.target.style.backgroundColor;
e.target.style.backgroundColor = someColorWhilePressed;
} else if (e.type == 'mouseup') {
e.target.style.backgroundColor = storedColor;
};
};
这不起作用,在mouseup
上,storedColor
是未定义的。我想这是因为同一个函数对象没有共享,而是创建了两个?如何做到这一点?连接到同一元素的两个或多个事件侦听器是否可以共享一个公共目标对象(函数(,该对象可以在调用之间保持数据?
您的变量不起作用,因为storedColor
是局部变量,每次调用btnEvent
函数时都会创建它。
您可以将颜色存储在btnEvent
函数中,因为函数是JavaScript中的对象。
演示:http://jsfiddle.net/LQSe4/
var btnEvent = function (e) {
if (e.type == 'mousedown') {
btnEvent['storedColor'] = e.target.style.backgroundColor;
e.target.style.backgroundColor = someColorWhilePressed;
} else if (e.type == 'mouseup') {
e.target.style.backgroundColor = btnEvent['storedColor'];
};
};
myButton.addEventListener("mousedown", btnEvent);
myButton.addEventListener("mouseup", btnEvent);
或者您可以将原始颜色存储在DOM元素中(Demo:http://jsfiddle.net/rk33f/):
var btnEvent = function (e) {
if (e.type == 'mousedown') {
e.target['storedColor'] = e.target.style.backgroundColor;
e.target.style.backgroundColor = '#F00';
} else if (e.type == 'mouseup') {
e.target.style.backgroundColor = e.target['storedColor'];
};
};
var myButton = document.getElementById('btn');
myButton.addEventListener("mousedown", btnEvent);
myButton.addEventListener("mouseup", btnEvent);
在这种情况下,如果它是特定于元素的,那么最好将颜色存储在元素本身:
btnEvent = function (e) {
var elm = e.target,
color;
if (e.type == 'mousedown') {
elm.setAttribute("data-storedColor", e.target.style.backgroundColor);
elm.style.backgroundColor = someColorWhilePressed;
} else if (e.type == 'mouseup') {
color = elm.getAttribute("data-storedColor"):
if (color) {
elm.style.backgroundColor = color;
elm.removeAttribute("data-storedColor");
}
};
};
在那里,我们将颜色存储在data-*属性上。您也可以只使用"expando"属性(您分配给元素的一个特殊属性,例如elm.mySpecialProperty = ...
(,但expando通常不是最佳实践。
旁注:
除非您在某个地方声明
btnEvent
变量,否则您将成为隐式全局变量的恐怖的牺牲品。要么在它前面放一个var
,要么更好的是,让它成为一个函数声明,而不是一个表达式:function btnEvent(e) { // ...implementation... }
addEventListener
有第三个参数,您可能应该提供它。我似乎记得有些浏览器对此很挑剔(尽管任何现代浏览器都可能不是(。(您需要值false
。(
相关文章:
- 如何用javascript调用函数,然后在滚动事件中调用该函数的特定实例
- 如何在事件函数中访问窗口实例
- Jquery将事件绑定到页面上的多个实例
- 允许在自定义事件上“查找使用实例”的 IDE
- JavaScript和将事件实例传递给函数
- 处理Twitter Flight组件的多个实例的事件
- 只为构造函数的所有实例触发一次事件侦听器
- 如何访问类实例上的事件侦听器
- 触发不同实例设置的 jQuery 自定义事件
- 如何将事件绑定到 ember 中动态创建的实例.js
- 下拉列表更改事件直到第二个实例才触发
- 事件保持绑定到僵尸实例
- Extjs 5.1 事件在 Ext.select.不能在 Ext.dom.Fly 实例上使用 addListener()
- 如何将“拖动启动”事件与 CKEditor 实例分离
- 创建实例时覆盖的主干视图类事件
- 从谷歌日历 API 中的事件列表中检索实例
- 如何删除多维数据集.js实例的一天之后的事件
- 如何使用 Ember.sendEvent 将事件发送到每个实例化的控制器
- jQuery类选择器事件绑定是否将eventHandler附加到每个实例
- Jquery变量直到单击事件才实例化