Ответ 1
Не знаю, как сказать, когда была запущена последняя функция $(document).ready()
, но функция $(window).load()
срабатывает после $(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?
Не знаю, как сказать, когда была запущена последняя функция $(document).ready()
, но функция $(window).load()
срабатывает после $(document).ready()
Самый безопасный способ - вызвать $(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.
});
});
На основании ответа Яна я понял это (проверено - работает):
jQuery(document).ready(function() {
jQuery(document).ready(function() {
/* CODE HERE IS EXECUTED AS THE LAST .ready-CALLBACK */
});
});
Конечно, это связано с тем, что готовые обратные вызовы вызываются в том порядке, в котором они назначены. В настоящий момент, когда вы вызываете внешний внешний обратный вызов, все остальные скрипты должны иметь уже готовые обратные вызовы. Таким образом, назначение вашего готового обратного вызова (внутреннего) теперь приведет к тому, что вы будете последним.
Попробуйте этот опрятный трюк/брутто:
$(function(){
$(function(){
$("#my_slider").slider("value", 10);
});
});
Выглядит глупо? Он работает, потому что jQuery выполняет обработчики событий в том порядке, в котором они были добавлены. Добавление обработчика событий в обработчик событий происходит как можно дольше (просто убедитесь, что вы не делаете это ни на одном из слайдеров, это очень легко сделать).
Доказательство концепции. http://jsfiddle.net/9HhnX/
Одна из целей функции jQuery $(document).ready() заключается в том, что стандартное событие javascript window.onload не будет выполняться до тех пор, пока все на странице не будет загружено (включая изображения и т.д.), хотя функции могут полезно начать работать задолго до этого. Таким образом, $(document).ready() запускается сразу после построения иерархии DOM.
Учитывая это, одним из вариантов было бы запустить "после всего остального" script при загрузке страницы. Это не гарантирует, что все скрипты $(document).ready() завершены.
Лучше, но более сложным вариантом является создание функции, которая проверяет наличие ползунков, а если они не существуют, вызывает "setTimeout" сам по себе, поэтому он может подождать несколько миллисекунд и повторить попытку.
(Чтобы ответить на ваш конкретный вопрос, нет, нет "после $(document).ready() выполнили" обратный вызов ".)
Вам лучше добавить уникальный класс для ваших слайдеров, а не в #my_slider, так как это будет срабатывать только для элемента с id = my_slider.
Если вы хотите иметь такую же функциональность, вы должны проверить .live из jquery, она добавит ту же функциональность к элементам, которые добавляются после привязки.
Если это не сработает для вас, тогда, когда вы добавите новые слайдеры, вам придется пройти через них в DOM и вызвать необходимую функцию.