嘿那里,
我需要能够动态更改按钮的不同状态(正常、悬停、按下)的背景颜色。
到目前为止我想出的是以下内容:http: //jsfiddle.net/suamikim/c3eHh/
Ext.onReady(function() {
function updateBackground() {
var theWin = win || this, // neccessary because of the call from the afterrender-event
btn = theWin.down('#btnTest'),
bckgr = theWin.down('#btnBckgr').getValue(),
bckgrHover = theWin.down('#btnBckgrHover').getValue(),
bckgrPressed = theWin.down('#btnBckgrPressed').getValue();
// Set normal background as button-style
// Should be ok
$('#' + btn.id).css('background', bckgr);
// Toggle background when hover-state changes
// Are there any downsides if this function gets called everytime the updateBackground-method is called? Do i have to dispose anything before binding the functions again?
$('#' + btn.id).hover(function() {
$('#' + btn.id).css('background', bckgrHover);
}, function() {
$('#' + btn.id).css('background', bckgr);
}
);
// Set the background for pressed button as document style
// Problems:
// - Pollutes the document-header if called multiple times...
// - Background does not change anymore on hover for pressed button because of the !important, but without important it wouldn't show the pressed background at all...
$('<style type="text/css"> #' + btn.id + '.x-btn-pressed { background: ' + bckgrPressed + ' !important } </style>').appendTo('head');
};
// Create a window with the propertygrid
var win = Ext.create('Ext.window.Window', {
width: 800,
height: 200,
layout: 'fit',
tbar: {
defaultType: 'textfield',
defaults: {
listeners: {
blur: updateBackground
}
},
items: [
'Background (CSS):', { itemId: 'btnBckgr', value: '#77ABD8' },
'Background hover (CSS):', { itemId: 'btnBckgrHover', value: '#CC1C1C' },
'Background pressed (CSS):', { itemId: 'btnBckgrPressed', value: '#7D4FC6' }
]
},
items: [{
xtype: 'button',
itemId: 'btnTest',
text: 'test button',
enableToggle: true
}],
listeners: {
'afterrender': updateBackground
}
}).show();
});
这基本上有效,但我还有一些问题:
1)
每次调用updateBackground方法时都可以调用jquery的悬停功能吗?
根据 jquery-doc ( http://api.jquery.com/hover/ ),此函数将 2 个给定函数绑定到给定元素的 mouse-enter- & mouse-leave-events。
这是否意味着每次我调用它时它都会绑定新函数,还是更新已经绑定的函数,还是在绑定新函数之前自动处理已经绑定的函数......
简而言之:我是否必须在绑定新函数之前处理任何内容? $.hover 的功能?
2)
我将按下状态的样式设置为文档样式,这意味着如果经常调用 updateBackground 函数(每次在我的测试用例中一个文本字段触发模糊事件),文档标题就会被污染。
有没有更好的方法来实现相同的目标,或者我可以在添加新样式之前删除已经设置的样式?
3)
由于按下样式中的 !important 标志,如果按下按钮,则不会出现悬停状态的背景。我不能只删除这个标志,因为没有它,按下状态的背景将无法正确显示......有什么解决方案吗?
一般来说,我愿意接受关于如何以完全不同的方式解决这个问题的每一个建议。
谢谢,
米克
编辑:
上面的代码只是一个例子。实际上,除了按钮之外,我还需要能够更改其他 ext 控件的背景属性(面板、复选框、...),但我认为我可以自己为其他控件采用按钮的工作解决方案。
请记住这一点,不要在按钮上过多地指定答案。它应该尽可能通用...