Jquery中的递归/自动执行函数在Firebug中的行为有所不同

时间:2012-06-22 08:39:54

标签: jquery recursion firebug

我正在尝试创建一个jQuery Gallery,让用户可以通过包含照片,电影和PDF文档的“图标”翻转(使用上一个,下一个按钮)。

我的策略如下:

  • 让jQuery不知道图标的实际内容,
  • 实际内容来自Ajax回调,它返回一个HTML字符串
  • 如果我的php代码如此决定,那个HTML字符串中可能存在上一个和/或下一个按钮,
  • 如果存在这些按钮,则将点击事件绑定到它们,
  • click事件对mainLoop()进行递归调用,显示新图标。

以下是代码:

function mainLoop() {
if (icons[newIndex] !== IFM_APPENDED ) { // tests whether this icon has already been loaded
    $.ajax({
        type: 'POST',
        url: '/callback/div_supply',
        data: {iconindex: newIndex},
        success: function(data) {
            $('#jquery-lightbox').append(data); // inserts new icon into the DOM
            icons[newIndex] = IFM_APPENDED; // registers that this icon has been loaded
            if ($('#icon'+newIndex+' .prev-button').length !== 0) { // test if the previous button is present
                $('#icon'+newIndex+' .prev-button').click(function () {
                oldIndex = newIndex;
                newIndex -= 1;
                mainLoop();
                }); // END $('#icon'+newIndex+' .prev-button').click()
            } // END if ($('#icon'+newIndex+' .prev-button').length !== 0) 
            if ($('#icon'+newIndex+' .next-button').length !== 0) { // test if the previous button is present
                $('#icon'+newIndex+' .next-button').click(function () {
                oldIndex = newIndex;
                newIndex += 1;
                mainLoop();
                }); // END $('#icon'+newIndex+' .prev-button').click()
            } // END if ($('#icon'+newIndex+' .prev-button').length !== 0) 
        } // END succes:
    }); // END $.ajax
} //  END if (icons[newIndex] !== IFM_APPENDED )
$('#icon'+oldIndex).hide(); // hide the old icon
$('#icon'+newIndex).show(); // hide the new icon
}

$(document).ready(function() {
// Hide some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
$('embed, object, select').css({ 'visibility' : 'hidden' });
$("#gallery li").click(function() {
    _set_interface();
    mainLoop();
}); // END  $("#gallery a").click(function
}); // END $(document).ready(function()

当我单步执行Firebug调试器中的mainLoop()时,此代码正常工作。

然而,当我运行它时,脚本就会挂起。当我逐步执行$(document).ready(function()时,它也会停止挂起。没有可以调用Firebug的console.log()调用。

我怀疑我设置递归的方式有问题。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

好的,我(有点)发现了正在发生的事情。

问题是由回调HTML中明确声明 display:none 引起的。当我这样做时,.hide()方法无法将其转换为 display:block

当您考虑使用Firebug踩踏时,这种情况会变得很浓。但是在Firefox中直接运行代码时失败了。

我仍然不确定实际上是什么打击了我......

修改

在我联系Dreamhost支持后,此问题消失了。所以,我认为我身边没有任何问题,但服务器上的某些设置并没有出现问题。但是,我从未了解到实际问题是什么。