您正在同时使用 jQuery 和 Prototype 而没有jQuery.noConflict()
. 后
<script type='text/javascript' src='http://code.jquery.com/jquery-1.7.js'></script>
<script type='text/javascript' src="http://ajax.googleapis.com/ajax/libs/prototype/1.7.0/prototype.js"></script>
此行导致 javascript 错误:
$(window).load(function(){
修改后的小提琴: http: //fiddle.jshell.net/ymbsr/5/ -在不同的浏览器中打开http://fiddle.jshell.net/ymbsr/5/show/ 。
附言
删除 jQuery/Prototype 冲突后,我可以看到 Chrome 21 和 Opera 12.02 手风琴转换永远不会结束(bootstrap-collapse.js
Collapse.transition
启动转换但从complete()
未被调用)。对同一元素的进一步调用将Collapse.show()/hide()
在 之后退出if (this.transitioning) return
。
在 Firefox 15.0.1 中,手风琴工作正常。
聚苯乙烯
这种奇怪的行为是两个特征的结果:
this.$element.trigger('hide')
(in Collapse#transition()
) 尝试调用元素中是否存在$element.hide()
方法- 这是设计使然:hide()
注意:对于普通对象和 DOM 对象,如果触发的事件名称与对象上的属性名称匹配,如果没有事件处理程序调用 event.preventDefault(),jQuery 将尝试将该属性作为方法调用。如果不需要此行为,请改用 .triggerHandler() 。
在每个支持 HTML 元素的浏览器中使用 Prototype 元素原型扩展$element
肯定会有hide()
方法,它实际上是通过设置隐藏元素element.style.display = 'none'
。
在当前版本的 Chrome 和 Opera 中,如果元素被隐藏(具有样式) ,则不会触发过渡结束事件(webkitTransitionEnd
、oTransitionEnd
、之一)。Firefox 更成功地结束了它的转换,但在某些情况下也可能不会触发事件:otransitionend
display: none
注意:如果过渡被中止,则不会触发“transitionend”事件,因为动画属性的值在过渡完成之前已更改。
如何修复它:
提交错误bootstrap-collapse.js
- 它不应仅依赖于过渡结束事件
提交一个错误bootstrap-collapse.js
- 它的hide
事件与其他框架相交(至少与 Prototype 有交叉,但任何其他扩展元素原型的框架可能会受到影响)。
Collapse#transition()
从http://fiddle.jshell.net/ymbsr/7/bootstrap-collapse.js
临时修补- 禁用事件触发或更改事件名称。
jQuery.fn.collapse.Constructor.prototype.transition = function (method, startEvent, completeEvent) {
var that = this
, complete = function () {
if (startEvent.type == 'show') that.reset();
that.transitioning = 0;
that.$element.trigger(completeEvent);
}
//this.$element.trigger(startEvent);
//if (startEvent.isDefaultPrevented()) return;
this.transitioning = 1;
this.$element[method]('in');
(jQuery.support.transition && this.$element.hasClass('collapse')) ?
this.$element.one(jQuery.support.transition.end, complete) :
complete();
};