【发布时间】:2014-09-23 15:56:13
【问题描述】:
我正在制作一个带有可滑动、类似手风琴的区域的侧边栏,以便当您单击标题时,相关内容会根据下面的代码部分切换可见性。 initAccordion 函数还在标题后附加一个 svg“+”以指示其操作。
最后的任务是让 cross 变量中保存的 svg 在每次点击时旋转 45 度 - 这是我遇到问题的地方。
显然,makeButtons 函数中的两个语句在它们的包含函数之外是不可访问的。我试图重构代码,但它最终变得一团糟,我不禁想到必须有一个简单的解决方案。
toggleContent : function(){
this.toggleClass('on').next().slideToggle(200);
cross.transform("r45");
},
makeButtons : function(el) {
var btn = Raphael(el,15,15);
var cross = btn.path(".....");
},
initAccoridon : function(){
$('#eventSideBar').find('h3').each(function(){
var btn = $('<div/>', {
class : 'sideBarBtn'
});
btn.appendTo(this);
var btnContainer = btn.get(0),
$this = $(this);
sidebar.makeButtons(btnContainer);
$this.on('click', function(){
sidebar.toggleContent.call($this);
});
});
}
我不确定这是否更适合 SO 的代码审查部分 - 如果是,请道歉;我可以根据要求移动它。
编辑:虽然有多个元素,但我无法让相应的 svg 旋转;只是最后一个。 Fiddle here,更新代码:
makeSvg : function(el) {
this.btn = Raphael(el,15,15);
this.cross = this.btn.path(".....");
return {
btn : this.btn,
cross : this.cross
};
},
toggleContent : function(){
if (this.hasClass('on')) {
sidebar.cross.transform("r0");
} else {
sidebar.cross.transform("r45");
};
this.toggleClass('on');
},
initAccordion : function(){
$('body').find('h3').each(function(){
var btn = $('<div/>', {
class : 'sideBarBtn'
});
btn.appendTo(this);
var btnContainer = btn.get(0),
$this = $(this);
sidebar.makeSvg(btnContainer);
$this.on('click', function(){
sidebar.toggleContent.call($this);
});
});
}
【问题讨论】:
-
基本示例小提琴将有助于玩。你不能从 makeButtons 返回你的交叉元素,然后将它传递给你的 toggleContent func 吗?
-
@Ian 请参阅附加的小提琴。你的建议很有道理,但我还是一个 JavaScript 初学者,无法从 makeButtons 返回任何有用的东西......
标签: javascript jquery svg raphael