gpt4 book ai didi

javascript - setInterval 与其他 jQuery 事件 - 递归过多

转载 作者:行者123 更新时间:2023-11-28 10:30:36 24 4
gpt4 key购买 nike

我正在尝试为一个小页面构建一个 Javascript 监听器,该页面使用 AJAX 根据 URL 中的 anchor 加载内容。在网上查找并修改了一个使用 setInterval() 来执行此操作的脚本,到目前为止它工作正常。但是,我在 $(document).ready() 中有其他 jQuery 元素,用于菜单和内容的特殊效果。如果我使用 setInterval() 则其他 jQuery 效果都不起作用。我想出了一种方法,通过在 setInterval() 循环中包含 jQuery 效果来使其工作,如下所示:

$(document).ready(function() {
var pageScripts = function() {
pageEffects();
pageURL();
}
window.setInterval(pageScripts, 500);
});

var currentAnchor = null;

function pageEffects() {
// Popup Menus
$(".bannerMenu").hover(function() {
$(this).find("ul.bannerSubmenu").slideDown(300).show;
}, function() {
$(this).find("ul.bannerSubmenu").slideUp(400);
});

$(".panel").hover(function() {
$(this).find(".panelContent").fadeIn(200);
}, function() {
$(this).find(".panelContent").fadeOut(300);
});

// REL Links Control
$("a[rel='_blank']").click(function() {
this.target = "_blank";
});
$("a[rel='share']").click(function(event) {
var share_url = $(this).attr("href");

window.open(share_url, "Share", "width=768, height=450");
event.preventDefault();
});
}

function pageURL() {
if (currentAnchor != document.location.hash) {
currentAnchor = document.location.hash;
if (!currentAnchor) {
query = "section=home";
} else {
var splits = currentAnchor.substring(1).split("&");
var section = splits[0];
delete splits[0];
var params = splits.join("&");
var query = "section=" + section + params;
}
$.get("loader.php", query, function(data) {
$("#load").fadeIn("fast");
$("#content").fadeOut(100).html(data).fadeIn(500);
$("#load").fadeOut("fast");
});
}
}

这在一段时间内工作正常,但在页面加载几分钟后,它在 IE 和 Firefox 中几乎停止运行。我检查了 FF 错误控制台,它返回错误“太多递归”。 Chrome 似乎并不在意,尽管页面已经打开了很长一段时间,但页面仍或多或少地继续正常运行。

在我看来, pageEffects() 调用导致了递归问题,但是,任何将其移出循环的尝试都会破坏它们,并且一旦setInterval 使其成为第一个循环。

对此的任何帮助将不胜感激!

最佳答案

我猜测 pageEffects 需要添加到 pageURL 内容中。

至少这应该更加高效并防止重复的处理程序

$(document).ready(function() {
pageEffects($('body'));
(function(){
pageURL();
window.setTimeout(arguments.callee, 500);
})();
});

var currentAnchor = null;

function pageEffects(parent) {
// Popup Menus
parent.find(".bannerMenu").each(function() {
$(this).unbind('mouseenter mouseleave');
var proxy = {
subMenu: $(this).find("ul.bannerSubmenu"),
handlerIn: function() {
this.subMenu.slideDown(300).show();
},
handlerOut: function() {
this.subMenu.slideUp(400).hide();
}
};
$(this).hover(proxy.handlerIn, proxy.handlerOut);
});

parent.find(".panel").each(function() {
$(this).unbind('mouseenter mouseleave');
var proxy = {
content: panel.find(".panelContent"),
handlerIn: function() {
this.content.fadeIn(200).show();
},
handlerOut: function() {
this.content.slideUp(400).hide();
}
};
$(this).hover(proxy.handlerIn, proxy.handlerOut);
});

// REL Links Control
parent.find("a[rel='_blank']").each(function() {
$(this).target = "_blank";
});

parent.find("a[rel='share']").click(function(event) {
var share_url = $(this).attr("href");

window.open(share_url, "Share", "width=768, height=450");
event.preventDefault();
});
}

function pageURL() {
if (currentAnchor != document.location.hash) {
currentAnchor = document.location.hash;
if (!currentAnchor) {
query = "section=home";
} else {
var splits = currentAnchor.substring(1).split("&");
var section = splits[0];
delete splits[0];
var params = splits.join("&");
var query = "section=" + section + params;
}
var content = $("#content");
$.get("loader.php", query, function(data) {
$("#load").fadeIn("fast");
content.fadeOut(100).html(data).fadeIn(500);
$("#load").fadeOut("fast");
});

pageEffects(content);
}
}

关于javascript - setInterval 与其他 jQuery 事件 - 递归过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3226566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com