jQuery $(document).one('ready', function() {...}无效。

5
当使用$(document).ready(function(){...});(版本1)时,文档准备函数会无限触发。我猜测是每次jquery的.load函数完成时都会触发ready? 希望确认一下。
所以我尝试使用jquery的$(document).one('ready', function(){...});函数(版本2),但是函数根本不触发。这里有什么问题吗?
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <script src="/vendor/jquery/jquery-3.1.0.min.js"></script>
    <script src="/js/index.js"></script>
</head>
<body>
    <div class="index__header"></div>
    <div class="index__content"></div>
</body>
</html>

index.js 版本 1:

var _index = {
    loadLogin : function () {
        $(".index__content").load("/view/login.html");
    }
};

$(document).ready ( function () {
    $(".index__header").load("/view/header.html");
    _index.loadLogin();
});

index.js 版本 2:

var _index = {
    loadLogin : function () {
        $(".index__content").load("/view/login.html");
    }
};

$(document).one ('ready', function () {
    console.log('ready...');
    $(".index__header").load("/view/header.html");
    _index.loadLogin();
});

你在控制台上看到了什么错误? - Punit Gajjar
不清楚你想做什么。在头部加载登录?那么请执行以下代码:$(function() { $(".index__content").load("/view/header.html",function() { $(".index__content").load("/view/login.html"); });}); - mplungjan
2个回答

7

$(document).ready() 是一种特殊的实现方式。当它在文档准备好之前被使用时,它会为 DOMReady 事件建立一个监听器。但如果在文档准备好后再次调用它,它会无条件地执行代码,而不会等待事件(因为 DOMReady 事件只会发生一次)。

ready 不是一个真正的事件,所以 .one() 不能与其一起使用。


2
好的,.on('ready').one('ready') 在 jQuery 1.x 和 2.x 中确实可以工作,但在 3.x 中已被删除。因此,该事件在某些版本中是模拟的。请参见 https://jsfiddle.net/z9vhLaLn/。jQuery 的 .ready() 文档页对此进行了讨论。 - jfriend00
$(document).on('ready', handler)在jQuery 3.x中已被移除(请参见jQuery API文档)。 - piotr_cz

5

使用$(document).one('ready', ...)是没有意义的,而且这种形式也已经过时了。ready处理程序只会被触发一次。当然,如果您重新加载整个页面,则会创建一个新文档,该文档将再次加载。但是,在给定文档内部的操作不会再次触发.ready()

此外,我相信我在某个地方读到过,使用 $(document).on('ready', ...)已经过时,正确的形式应该是:

$(document).ready(...)
$(function() {...})

啊,是的,这里有关于使用.on()的"ready"事件已被弃用的说明:链接

在jQuery 1.8中被弃用,并在jQuery 3.0中删除了$(document).on("ready", handler)


如果你真的认为ready处理程序被多次调用,你需要向我们展示确切的情况,因为这不应该发生。事实上,在.ready()内部实现中,一旦调用注册的回调函数,它就会永久地从列表中删除(因此永远不会再次调用),所以很难想象它如何再次被调用(除非你重复注册相同的回调函数)。

请记住,如果你在文档已经准备好后使用.ready(),它将立即调用你提供的回调函数。这就是.ready()功能的定义方式。因此,如果你经常重新注册.ready()处理程序,它们将在每次注册后继续被调用(在文档准备好后)。


顺便说一下,如果你想知道新加载的内容何时可用,那么你应该使用可以提供给.load()的回调函数。

$(".index__header").load("/view/header.html", function() {
    // newly loaded content is ready now
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接