我有一个没有页面更改的html网站。它只是使用 ajax 调用将不同的元素加载到页面上的每个位置。我需要我的登录函数在第一次加载页面后运行(因为它需要索引上的元素存在),但是当我使用 $(document).ready(login) 时,每次加载元素时都会触发(因为它将元素加载到页面上,它卡在无限循环中)。除了将其放在索引页的底部(看起来很脆弱)之外,有没有办法让它在索引页加载完成后加载,但不让它在每次 ajax 请求向页面添加内容时运行?
我的登录函数如下所示:
function login ()
{
if($.cookie('employee'))
employee = $.cookie('employee');
if(employee && !employee.login)
$("div.middle").load('login.html');
else
$("div.middle").load('main.html');
}
function logout ()
{
//FIXME send a logout request to server to end session also
employee = null;
$.cookie('employee', null);
$("div.middle").load('login.html');
}
我的初始就绪函数如下所示:全局变量var 员工 = 新对象;
$(document).ready(function(){
$("div.leftColumn").html(buildLeftNav());
//set height of middle if height of leftColumn is less than height of middle
if($("div.leftColumn").css('height') < $("div.middle").css('height'))
$("div.center").css('height' , $('div.middle').css('height'));
//handle login and logout
$.cookie.json = true;
login();
});
我设置了一个小提琴来说明:http://jsfiddle.net/uZVP4/
您的问题可能不在于document.ready
,而在于您可能在 AJAX 调用中一遍又一遍地加载相同的脚本。由于脚本会自动加载新内容,因此它正在创建一个加载新内容的无限循环,从而导致新内容再次加载。一遍又一遍。
如果必须将脚本保留在远程页面中,则可以使用不会在 ajax 内容中执行脚本$.get
通常每页只调用一次$(document).ready()
。
如果你想要一个"黑客"的解决方案,你可以设置一个变量
var wasReady = false;
并在$(document).ready()
将该值设置为 true
如果它是false
,否则什么都不做。
$(document).ready(function(){
if(!wasReady)
wasReady = true;
else return;
...
}
我通常使用
$(function(){
/* code here */
});
这与文档就绪相同,但是如果您想在所有页面加载(包括图像)后执行JavaScript,请使用
$(window).load(function(){
/*code here */
});
通过使用".one"为我们"解决"
了这个问题$(document).one("ready", function () {
// code
});
您应该尝试将其放入 body 标签的加载中,仅在每次提交表单时将其放在这里。
....
<body onload="login()">
....