在所有$(document).ready()运行之后,是否有事件发生?

mjs*_*lva 59 jquery

我有一个first.js文件包含在页面index.php中,有类似这样的东西:

$(function(){

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

});
Run Code Online (Sandbox Code Playgroud)

而在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;
} ?>
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ock 74

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

  • 扭转这个答案:有时候在window.load之后记录准备好的火灾.http://stackoverflow.com/questions/20133159/the-window-load-event-fires-before-that-document-ready-event-with-cache (5认同)

Tha*_*eli 63

最安全的做法是调用$(window).load() 内部 $(document).ready().这将保留所有情况下的执行顺序,确保$(window).load()在所有$(document).ready()脚本完成之前不会传递运行最后一个代码.如果没有这个,在某些浏览器中$(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.
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 在这个SO问题的更多细节:[文档就绪内的窗口加载](http://stackoverflow.com/questions/5006922/window-load-inside-a-document-ready)肯定发生在IE8中.这是一种腰带和吊带方法; 它是无害的,避免了一些边缘情况. (2认同)

Mat*_*bon 15

基于Ian的回答,我想出了这个(测试 - 工作):

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

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


Tob*_*oby 12

尝试这个巧妙的技巧/粗暴黑客:

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

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

    });
});
Run Code Online (Sandbox Code Playgroud)

看起来很蠢吧?它的工作原理是因为jQuery按照添加的顺序执行事件处理程序.在事件处理程序中添加一个事件处理程序的时间要尽可能晚(只是确保你没有意外地在任何一个滑块上执行此操作;这很容易).

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