Javascript 遍历时JQuery原型不工作
我使用以下()代码来重写DIV的.show()函数Javascript 遍历时JQuery原型不工作,javascript,jquery,Javascript,Jquery,我使用以下()代码来重写DIV的.show()函数 <script> (function ($) { var _oldShow = $.fn.show; $.fn.show = function (/*speed, easing, callback*/) { var argsArray = Array.prototype.slice.call(arguments),
<script>
(function ($) {
var _oldShow = $.fn.show;
$.fn.show = function (/*speed, easing, callback*/) {
var argsArray = Array.prototype.slice.call(arguments),
duration = argsArray[0],
easing,
callback,
callbackArgIndex;
// jQuery recursively calls show sometimes; we shouldn't
// handle such situations. Pass it to original show method.
if (!this.selector) {
_oldShow.apply(this, argsArray);
return this;
}
if (argsArray.length === 2) {
if ($.isFunction(argsArray[1])) {
callback = argsArray[1];
callbackArgIndex = 1;
} else {
easing = argsArray[1];
}
} else if (argsArray.length === 3) {
easing = argsArray[1];
callback = argsArray[2];
callbackArgIndex = 2;
}
return $(this).each(function () {
var obj = $(this),
oldCallback = callback,
newCallback = function () {
if ($.isFunction(oldCallback)) {
oldCallback.apply(obj);
}
obj.trigger('afterShow');
};
if (callback) {
argsArray[callbackArgIndex] = newCallback;
} else {
argsArray.push(newCallback);
}
obj.trigger('beforeShow');
_oldShow.apply(obj, argsArray);
});
};
})(jQuery);
</script>
(函数($){
var _oldShow=$.fn.show;
$.fn.show=函数(/*速度、缓和、回调*/){
var argsArray=Array.prototype.slice.call(参数),
持续时间=argsArray[0],
缓和,,
回拨,
callbackArgIndex;
//jQuery递归调用有时会显示;我们不应该这样做
//处理此类情况。将其传递给原始显示方法。
如果(!this.selector){
_oldShow.apply(这个,argsArray);
归还这个;
}
如果(argsArray.length==2){
if($.isFunction(argsArray[1])){
callback=argsArray[1];
callbackArgIndex=1;
}否则{
放松=argsArray[1];
}
}else if(argsArray.length==3){
放松=argsArray[1];
回调=argsArray[2];
callbackArgIndex=2;
}
返回$(this).each(函数(){
var obj=$(此),
oldCallback=callback,
newCallback=函数(){
if($.isFunction(oldCallback)){
oldCallback.apply(obj);
}
对象触发器(“后处理”);
};
如果(回调){
argsArray[callbackArgIndex]=newCallback;
}否则{
argsArray.push(newCallback);
}
对象触发器(“显示前”);
_oldShow.apply(obj,argsArray);
});
};
})(jQuery);
我有以下HTML代码
<div id="divBeforeHiddenDiv">
foo
</div>
<div id="hiddenDiv" style="display:none">
bar
</div>
福
酒吧
然后:
<script>
$('#hiddendiv').bind("beforeShow", function () {
alert("show event successfully overridden");
});
</script>
$('#hiddendiv').bind(“beforeShow”,函数(){
警报(“显示事件已成功覆盖”);
});
当我调用$('#hiddenDiv').show()
时效果很好,但如果我调用$('#divbeforeHiddendenddiv'),则效果不好。next().show()
包含“bar”的隐藏div将显示,但不会显示警报
那为什么呢
更新
根据Bergi的评论,这似乎是一个jQuery问题。如果我在jQuery 1.7.1上使用它,它可以工作,但在使用jQuery 1.10.1或任何更高版本时,它不能工作:。有比简单降级更好的解决方案吗?您需要将事件绑定到适当的元素 根据您给出的示例和我解释的,这段代码
$('#beforeShow').bind("beforeShow", function () {
alert("show event successfully overridden");
});
应该是
$('#hiddenDiv').bind("beforeShow", function () {
alert("show event successfully overridden");
});
您希望事件绑定到隐藏的div(或者如问题中所述,在“#divBeforeHiddenDiv”后面的div
你也应该换一块
$('divBeforeHiddenDiv').next().show()
对此
$('#divBeforeHiddenDiv').next().show()
divBeforeHiddenDiv是一个ID,在第一个代码段中,jQuery对象中没有ID
很抱歉,这两件事都是输入错误,在未简化的示例代码中都是正确的,但仍然不起作用。不过,这一点很好:p您使用的是哪个jQuery版本?可能是
.next()返回的jQuery对象
没有.selector
属性。您能否解释一下为什么要测试if(!this.selector)
?没有它,什么是不起作用的?我真的不知道。这是对另一篇关于如何覆盖listen for.show()的StackOverflow帖子的回答事件,但评论似乎表明,这是一个解决问题的办法,有时会多次调用show,如果没有它,似乎会有一个无限循环