2010-06-09 1 views
51

У меня есть 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; 
} ?> 

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

+1

Я не понимаю ваш код. Что вы пытаетесь достичь? Это может привести к сбою, так как вы не избегаете разрывов строк. – user113716

+0

Извините, если я не был чист, второй код - PHP. Переход к редактированию, чтобы сделать его более понятным. – mjsilva

+0

23384 просмотров ... wow: D –

ответ

71

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

+0

Спасибо, John, это было решение. Я просто изменил свой $ (function() {("# my_slider"). Slider ("value", 10);}); для $ (window) .load (function() {("# my_slider"). slider ("value", 10);}); и это сработало. Приветствую брата! – mjsilva

+0

@mjsilva ... Рад я мог бы помочь –

+4

Твист на этот ответ: иногда документы готовы к пожарам после window.load. http://stackoverflow.com/questions/20133159/the-window-load-event-fires-before-that-document-ready-event-with-cache – Toby

3

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

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

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

(Для того, чтобы ответить на ваш конкретный вопрос, нет, нет «после того, как все $ (документ) .ready() запустили» обратного вызова.)

0

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

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

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

+0

Привет, darren102, у моих слайдеров есть уникальные идентификаторы, то, что я написал, не переизбирает мой текущий код, я просто отправляю его, поскольку это пример того, что я пытался выполнить. Извините, если это вызывает недоумение, я все еще новичок в задании вопросов @ stackoverflow: P – mjsilva

56

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

-1 Я не хочу быть неуважением, но это звучит не так. Можете ли вы объяснить дальше или оставить ссылку? В каких браузерах это происходит и что они делают по-другому? Я могу видеть, что это правда, если события JS были многопоточными (или обработчик DOMDocumentReady в jQuery), и даже тогда я не думаю, что ваше исправление будет устранено. – Toby

+2

Подробнее в этом вопросе SO: [Загрузка окна внутри документа готова] (http://stackoverflow.com/questions/5006922/window-load-inside-a-document-ready) Определенно происходит в IE8. Это подход к поясам и подтяжкам; он безвреден и избегает некоторых краевых случаев. – Ian

+0

Спасибо за советы! – Didier68

9

Попробуйте это аккуратный трюк/валовой хак:

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

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

    }); 
}); 

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

Подтверждение концепции. http://jsfiddle.net/9HhnX/

12

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

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

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

Смежные вопросы