Подтвердить что ты не робот

Запустилось все $(document).ready(), есть ли для этого событие?

У меня есть файл first.js, включенный в страницу index.php, который имеет что-то вроде этого:

$(function(){

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

});

И их в index.php у меня есть динамически созданные slidders:

<?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+"'[email protected]$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")+"'[email protected]$unit.'");
    });
    </script>';
    return $return;
} ?>

Проблема заключается в том, что мои ползунки index.php создаются после моего first.js. Я не могу установить там значение, есть ли какое-либо событие вроде "после того, как все $(document).ready() выполнили" что я могу использовать в first.js для управления ползунками, созданными в index.php?

4b9b3361

Ответ 1

Не знаю, как сказать, когда была запущена последняя функция $(document).ready(), но функция $(window).load() срабатывает после $(document).ready()

Ответ 2

Самый безопасный способ - вызвать $(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.
    });
});

Ответ 3

На основании ответа Яна я понял это (проверено - работает):

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

Конечно, это связано с тем, что готовые обратные вызовы вызываются в том порядке, в котором они назначены. В настоящий момент, когда вы вызываете внешний внешний обратный вызов, все остальные скрипты должны иметь уже готовые обратные вызовы. Таким образом, назначение вашего готового обратного вызова (внутреннего) теперь приведет к тому, что вы будете последним.

Ответ 4

Попробуйте этот опрятный трюк/брутто:

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

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

    });
});

Выглядит глупо? Он работает, потому что jQuery выполняет обработчики событий в том порядке, в котором они были добавлены. Добавление обработчика событий в обработчик событий происходит как можно дольше (просто убедитесь, что вы не делаете это ни на одном из слайдеров, это очень легко сделать).

Доказательство концепции. http://jsfiddle.net/9HhnX/

Ответ 5

Одна из целей функции jQuery $(document).ready() заключается в том, что стандартное событие javascript window.onload не будет выполняться до тех пор, пока все на странице не будет загружено (включая изображения и т.д.), хотя функции могут полезно начать работать задолго до этого. Таким образом, $(document).ready() запускается сразу после построения иерархии DOM.

Учитывая это, одним из вариантов было бы запустить "после всего остального" script при загрузке страницы. Это не гарантирует, что все скрипты $(document).ready() завершены.

Лучше, но более сложным вариантом является создание функции, которая проверяет наличие ползунков, а если они не существуют, вызывает "setTimeout" сам по себе, поэтому он может подождать несколько миллисекунд и повторить попытку.

(Чтобы ответить на ваш конкретный вопрос, нет, нет "после $(document).ready() выполнили" обратный вызов ".)

Ответ 6

Вам лучше добавить уникальный класс для ваших слайдеров, а не в #my_slider, так как это будет срабатывать только для элемента с id = my_slider.

Если вы хотите иметь такую ​​же функциональность, вы должны проверить .live из jquery, она добавит ту же функциональность к элементам, которые добавляются после привязки.

Если это не сработает для вас, тогда, когда вы добавите новые слайдеры, вам придется пройти через них в DOM и вызвать необходимую функцию.