2014-04-09 4 views
0

Я искал ответ, но я не нашел. Я хочу включить скрипт Nivo Slider, только если экран больше 768 пикселей. У меня есть функция, которая создает тег скрипта, только если размер окна больше 768 пикселей, тогда я вызываю функцию из этого скрипта.Вызвать обратный вызов после вставки тега скрипта

$(function(){ 

    (function(d, s, id){ 
     if(window.innerWidth > 768){ 
      var js, fjs = d.getElementsByTagName(s)[0]; 
      js = d.createElement(s); js.id = id; 
      js.src = "plugins/nivo-slider/jquery.nivo.slider.js"; 
      fjs.parentNode.insertBefore(js, fjs); 
      $('#slider').nivoSlider(); 
     } 
    }(document, 'script', 'nivo')); 

    }); 

Javascript вызывает метод nivoSlider() сразу после вставки сценария тегов, но сценарий еще не загружен. Он работает, если я устанавливаю метод nivo внутри setTimeout(), но это дерьмовый взломать.

Любые идеи?

+0

http://jsfiddle.net/w3xh6/2/ – adeneo

ответ

3

Я предложил бы использовать jQuery.getScript: https://api.jquery.com/jQuery.getScript/

$.getScript('plugins/nivo-slider/jquery.nivo.slider.js', function() { 
    $('#slider').nivoSlider(); 
}); 

Или, если вы действительно хотите пойти родным:

js.onload = js.onreadystatechange = function() { 
    var state = this.readyState; 
    if(!this.loaded && (!state || state=='loaded' || state=='complete')) { 
    this.loaded = 1; 
    $('#slider').nivoSlider(); 
    } 
} 
+0

Из документации в нем говорится: «Обратный вызов запускается после загрузки сценария, но не обязательно выполняется». Как вы можете гарантировать, что скрипт был выполнен, когда вы вызываете .nivoSlider()? – Ceres

+0

@Ceres Это интересное заявление, но я никогда не обсуждал ситуацию, когда скрипт задерживает выполнение. Думаю, это больше похоже на «отказ от ответственности». Я добавил родной onload, чтобы вы могли выбрать свой яд. – David

+0

Спасибо за вашу долю, @David. – bodruk

1

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

$.ajax({ 
    url: "plugins/nivo-slider/jquery.nivo.slider.js", 
    dataType: "script", 
    cache : true, 
    success: function() { 
     $('#slider').nivoSlider(); 
    } 
}); 
+0

Или [getScript] (http://api.jquery.com/jQuery.getScript/) – CodingIntrigue

+0

Почему я не думал об этом раньше? Спасибо, @epascarello, отлично работает для меня. – bodruk

+0

@RGraham Это то же самое, что и getScript, за исключением того, что getScript отключает кеширование, что плохо. – epascarello

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