Некоторое время назад я написал класс Prototype, чтобы решить эту проблему. Эту проблему можно исправить, указав параметр scope
для параметров эффекта. В любом случае, вот класс, который я написал:
var DivSlider = Class.create();
Object.extend(DivSlider, {
toggle: function(selector, element, options) {
element = $(element);
this.options = Object.extend({
duration: 0.5,
fps: 35,
scope: 'DivSlider',
forceOpen: false
}, options || {});
var toggle = element.visible();
if (toggle && this.options.forceOpen) {
//already open, leave.. still call callback
(this.options.after || Prototype.emptyFunction)
.bind(this, element)();
return;
}
var effects = new Array();
if (toggle) {
effects.push(new Effect.SlideUp(element, {
sync: true
}));
} else {
$$(selector).each(function(el) {
if ((element !== el) && el.visible()) {
effects.push(new Effect.SlideUp(el, {
sync: true
}));
}
});
effects.push(new Effect.SlideDown(element, {
sync: true
}));
}
new Effect.Parallel(effects, {
duration: this.options.duration,
fps: this.options.fps,
queue: {
position: 'end',
scope: this.options.scope
},
beforeStart: function() {
(this.options.before || Prototype.emptyFunction)
.bind(this, element)();
}.bind(this),
afterFinish: function() {
(this.options.after || Prototype.emptyFunction)
.bind(this, element)();
}.bind(this)
});
}
});
и использовать его в вашем случае вы просто используете:
DivSlider.toggle('div.your_class', your_id);
в вашем коде ввода / вывода, он может обрабатывать несколько div одного и того же класса, позволяя открывать только один div на класс в любой момент времени. Если это не соответствует вашим потребностям, вы можете легко деконструировать класс, чтобы получить код, который вам действительно нужен.