【问题标题】:After all $(document).ready() have run, is there an event for that?在所有 $(document).ready() 运行之后,是否有事件发生?
【发布时间】:2011-03-01 19:45:57
【问题描述】:

我有一个包含在页面 index.php 中的 first.js 文件,它有这样的内容:

$(function(){

    $("#my_slider").slider("value", 10);

});

而且它们在 index.php 中有一些动态创建的滑块:

<?php function slidders($config, $addon)
{
    $return = '
    <script type="text/javascript">
        $(function() {
            $("#slider_'.$addon['p_cod'].'").slider({
            min: '.$config['min'].',
            max: '.$config['max'].',
            step: '.$config['step'].',
            slide: function(event, ui) {
                $("#cod_'.$addon['p_cod'].'").val(ui.value);
                $(".cod_'.$addon['p_cod'].'").html(ui.value+"'.@$unit.'");
            },
            change: function(event, ui) { 
                $("#cod_'.$addon['p_cod'].'").change();
            }
        });
            $("#cod_'.$addon['p_cod'].'").val($("#slider_'.$addon['p_cod'].'").slider("value"));
            $(".cod_'.$addon['p_cod'].'").html($("#slider_'.$addon['p_cod'].'").slider("value")+"'.@$unit.'");
    });
    </script>';
    return $return;
} ?>

问题是,因为我的 index.php 滑块在我的 first.js 之后被实例化,所以我无法在那里设置一个值,是否有任何事件像“毕竟 $(document).ready() 已经运行”我可以在 first.js 中使用它来操作在 index.php 中创建的滑块吗?

【问题讨论】:

  • 我不明白你的代码。你想达到什么目的?无论如何这都会崩溃,因为您没有转义换行符。
  • 对不起,如果我不清楚,第二个代码是 PHP。将进行编辑以使其更清晰。
  • 23384 次观看...哇:D

标签: jquery


【解决方案1】:

不知道如何判断最后一个$(document).ready() 函数何时触发,但$(window).load() 函数在$(document).ready() 之后触发

【讨论】:

  • 感谢约翰,这是我刚刚更改 $(function(){("#my_slider").slider("value", 10);}); for $(window).load(function(){("#my_slider").slider("value", 10);});它奏效了。兄弟加油!
  • 扭曲这个答案:有时在 window.load 之后文档就绪触发。 stackoverflow.com/questions/20133159/…
【解决方案2】:

最安全的做法是调用$(window).load() inside $(document).ready()。这将通过确保在所有 $(document).ready() 脚本完成之前不会将您的最后运行代码传递给 $(window).load() 来保持所有情况下的执行顺序。如果没有这个,在某些浏览器中可能会出现竞争条件,其中$(window).load() 可能会在所有$(document).ready() 脚本启动之后但在所有$(document).ready() 脚本完成之前被调用。

$(document).ready(function() {
    $(window).load(function() {
        // this code will run after all other $(document).ready() scripts
        // have completely finished, AND all page elements are fully loaded.
    });
});

【讨论】:

  • -1 我并不是要不尊重他人,但这听起来并不真实。您能进一步解释或留下参考吗?哪些浏览器会出现这种情况,它们有何不同之处?如果 JS 事件是多线程的(或者 jQuery 中的 DOMDocumentReady 处理程序产生了),我只能看到这是真的,即使那样,我也不认为你的修复会解决这个问题。
  • 这个 SO 问题的更多细节:Window Load Inside A Document Ready 肯定出现在 IE8 中。这是一种带吊带的方法;它是无害的,并且避免了一些极端情况。
  • 请注意,从最新版本的 jQuery (3+) 开始,您需要使用 $(window).on("load", function(){ //.... });。遇到奇怪的错误(url.indexOf is not a function),直到我将其切换到较新的语法。更多信息在这里:stackoverflow.com/a/37915907/177416:.load, .unload, and .error, deprecated since jQuery 1.8, are no more. Use .on() to register listeners.
【解决方案3】:

根据 Ian 的回答,我发现了这一点(经过测试 - 工作):

jQuery(document).ready(function() {
    jQuery(document).ready(function() {
        /* CODE HERE IS EXECUTED AS THE LAST .ready-CALLBACK */
    });
});

当然,这是因为就绪回调是按照它们分配的顺序调用的。目前,当您的外部就绪回调被调用时,所有其他脚本应该已经分配了它们的就绪回调。因此,现在分配您的就绪回调(内部回调)将导致您成为最后一个。

【讨论】:

  • Chrome无法保证订单
  • @caot 怎么样?我认为 Chrome 或任何其他浏览器不可能在不破坏逻辑本身的情况下不遵守此逻辑。但我可能会遗漏一些东西。
【解决方案4】:

试试这个巧妙的技巧/粗俗的技巧:

$(function(){
    $(function(){

        $("#my_slider").slider("value", 10);

    });
});

看起来很愚蠢对吧?它之所以有效,是因为 jQuery 按照添加的顺序执行事件处理程序。在你的事件处理程序中添加一个事件处理程序是尽可能晚的(只要确保你没有在任何滑块上意外地这样做;这很容易做到)。

概念证明。 http://jsfiddle.net/9HhnX/

【讨论】:

    【解决方案5】:

    jQuery 的 $(document).ready() 函数的目标之一是标准的 javascript window.onload 事件在页面上的所有内容(包括图像等)被加载之前不会运行,即使函数可以有用地在此之前开始运行。所以 $(document).ready() 会在构建 DOM 层次结构后立即运行。

    鉴于此,一种选择是在页面加载时运行“在所有其他事情之后”脚本。不过,这并不能保证所有 $(document).ready() 脚本都已完成。

    一个更好但更复杂的选择是创建一个检查滑块是否存在的函数,如果它们不存在,则对其自身调用“setTimeout”,因此它可以等待几毫秒并重试。

    (要回答您的具体问题,不,没有“毕竟 $(document).ready() 已经运行”回调。)

    【讨论】:

      【解决方案6】:

      你最好为你的滑块添加一个独特的类而不是#my_slider,因为它只会触发 id = my_slider 的元素。

      如果你想拥有相同的功能,你应该从 jquery 中签出 .live,它会将相同的功能放在绑定后添加的元素上。

      如果这对您不起作用,那么当您添加新滑块时,您将不得不在 DOM 中遍历它们并调用必要的函数。

      【讨论】:

      • 嗨 darren102,我的滑块有唯一的 Id,我发布的代码不会重新选择我的运行代码,我只是发布它作为我想要完成的示例。抱歉,如果这引起了一些混乱,我仍然是提问@stackoverflow的新手:P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多