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

时间:2010-06-09 18:26:12

标签: jquery

我在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中创建的滑块?

6 个答案:

答案 0 :(得分:73)

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

答案 1 :(得分: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.
    });
});

答案 2 :(得分:15)

根据伊恩的回答,我想出了这个(经过测试 - 工作):

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

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

答案 3 :(得分:12)

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

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

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

    });
});

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

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

答案 4 :(得分:3)

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

鉴于此,一个选项是在页面加载时运行“after everything”脚本。但这并不能保证所有$(document).ready()脚本都已完成。

更好但更复杂的选项是创建一个检查滑块是否存在的函数,如果它们不存在,则调用“setTimeout”本身,因此它可以等待几毫秒然后重试。 / p>

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

答案 5 :(得分:0)

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

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

如果这对您不起作用,那么当您添加新的滑块时,您必须在DOM中浏览它们并调用必要的功能。