我正在尝试在Javascript和jquery中创建自定义选项卡小部件。我已经创建了tab对象,但在分配click事件时遇到问题需要查看代码。我有附加事件但它只在最后一个对象上工作。有人可以提出更好的方法吗
function TabTitleBox(TabName){
this.SelectedBox = 0;
this.TitleBoxContainer = $('<div>'+TabName+'</div>');
this.TitleBoxContainer.addClass("STATSTab");
this.TitleBoxContainer.addClass("UnSelectedTab");
this.TitleBoxContainer.on('mouseenter',function(){
CurrentColor = $(this).css('background-color');
var t = tinycolor(CurrentColor);
var NewColor = tinycolor.saturate(t,50);
$(this).css("background-color",NewColor);
}).on('mouseleave',function(){
$(this).removeAttr('style','background-color');
});
this.SelectTab = function(){
if(this.SelectedBox == 0){
$(this.TitleBoxContainer).removeClass("UnSelectedTab");
$(this.TitleBoxContainer).addClass("SelectedTab");
this.SelectedBox = 1;
}
}
this.RemoveStyle = function(){
$(this.TitleBoxContainer).removeAttr('style','background-color');
}
this.UnSelectTab = function(){
if(this.SelectedBox == 1){
$(this.TitleBoxContainer).removeClass("SelectedTab");
$(this.TitleBoxContainer).addClass("UnSelectedTab");
this.SelectedBox = 0;
}
}
return this;
}
TabContainer = new Array();
TabContainer.push(new TabTitleBox("Is first tab"));
TabContainer.push(new TabTitleBox("Is Second tab"));
TabContainer.push(new TabTitleBox("Is Third tab"));
TabContainer.push(new TabTitleBox("Is Fourth tab"));
for(var x = 0; x < TabContainer.length ; x++){
Tab = TabContainer[x];
$('body').append(Tab.TitleBoxContainer);
$(Tab.TitleBoxContainer).on('click', function(){
if(Tab.SelectedBox == 1){
Tab.UnSelectTab();
Tab.SelectedBox = 0;
}else{
Tab.SelectTab();
Tab.SelectedBox = 1;
}
Tab.RemoveStyle();
});
}
找到解决方案,感谢我在代码中完成的答案更改,如下所示。链接可以在http://skondgekar.comeze.com/Test.php
找到 TabContainer = new Array();
TabContainer.push(new TabTitleBox("Is first tab"));
TabContainer.push(new TabTitleBox("Is Second tab"));
TabContainer.push(new TabTitleBox("Is Third tab"));
TabContainer.push(new TabTitleBox("Is Fourth tab"));
var funcs = [];
for(var x = 0; x < TabContainer.length ; x++){
Tab = TabContainer[x];
funcs[x] = (function(Tab){
return function(){
$(Tab.TitleBoxContainer).on('click', function(){
if(Tab.SelectedBox == 1){
Tab.UnSelectTab();
}else{
Tab.SelectTab();
}
Tab.RemoveStyle();
});
}
})(Tab);
funcs[x]();
$('body').append(Tab.TitleBoxContainer);
}
答案 0 :(得分:0)
您需要在点击处理程序上实现正确的闭包。
让我指出你正确的方向:
// (This is untested, but should be pretty close to what you need)
for(var x = 0; x < TabContainer.length ; x++){
Tab = TabContainer[x];
$('body').append(Tab.TitleBoxContainer);
$(Tab.TitleBoxContainer).on('click', myClosure(Tab)); // Calling the closure
}
function myClosure(Tab) { // Binding the current value of the Tab to the function it
return function() // and returning the function
if(Tab.SelectedBox == 1){
Tab.UnSelectTab();
Tab.SelectedBox = 0;
}else{
Tab.SelectTab();
Tab.SelectedBox = 1;
}
Tab.RemoveStyle();
});
}
编写闭包的另一种方法是:
for(var x = 0; x < TabContainer.length ; x++){
Tab = TabContainer[x];
$('body').append(Tab.TitleBoxContainer);
$(Tab.TitleBoxContainer).on('click', function(theRealTab) { // Creating closure
return function(){
if(theRealTab.SelectedBox == 1){
theRealTab.UnSelectTab();
theRealTab.SelectedBox = 0;
}else{
theRealTab.SelectTab();
theRealTab.SelectedBox = 1;
}
theRealTab.RemoveStyle();
}
})(Tab); // Binding the current value of Tab to the function variable theRealTab
}
如果没有闭包,click函数中的Tab变量将始终是变量的当前值(在此示例中 - 如果for循环,则处理最后一个Tab)。
欲了解更多信息:
Closures inside loops - 接受的答案有一个非常类似于
的例子