Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 遍历时JQuery原型不工作_Javascript_Jquery - Fatal编程技术网

Javascript 遍历时JQuery原型不工作

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),

我使用以下()代码来重写DIV的.show()函数

<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,如果没有它,似乎会有一个无限循环