2015-05-18 3 views
0

Я использую TogetherJS (http://togetherjs.com), и я хочу вызвать его динамически, как только DOM будет готов. При вызове его через тег сценария в голове он работает правильно. Проблема возникает при динамическом вызове тот же сценарий:динамический вызов сценария JS

function loadjsfile(filename, filetype){ 
if (filetype=="js"){ //if filename is a external JavaScript file 
    var fileref=document.createElement('script') 
    fileref.setAttribute("type","text/javascript") 
    fileref.setAttribute("src", filename) 
} 
if (typeof fileref!="undefined") 
    document.getElementsByTagName("head")[0].appendChild(fileref) 
} 

loadjsfile("https://togetherjs.com/togetherjs-min.js", "js") 

Эти функции не работают, то:

TogetherJS.hub.on('init', function (msg) { 
    console.log("init"); 
}); 

TogetherJS.on("ready", function() { 
    console.log("ready"); 
}); 

я получаю "TogetherJS не определен".

Что я могу сделать?

Edit: На самом деле я хочу, чтобы загрузить его после Галериа (http://galleria.io) готов, так что я звоню это нравится:

Galleria.ready(function(){ 
    loadjsfile("https://togetherjs.com/togetherjs-min.js", "js"); 
}) 

edit2:
раздел Found "Отсрочка Initialization" в документы togetherjs.com/docs/#extending-togetherjs. Я просто не знаю, как заменить эту строку:

MyApp.onload = callback; 

Мне нужно Galleria's.ready событие вместо MyApp.onload.

+2

Приложить обработчик onload к тегу сценария и запустить соответствующий код внутри него. – Ivo

+0

На самом деле я хочу загрузить его после того, как galleria (http://galleria.io) готов, поэтому я называю его как Galleria.ready (function() {loadjsfile ("https://togetherjs.com/togetherjs-min .js "," js "); }). Могу ли я использовать обработчик onload там как-то? –

+0

Обновленный вопрос –

ответ

1

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

Просто задержка выполнения до загрузки страницы.

function loadjsfile(filename, filetype){ 

    if (filetype=="js"){ //if filename is a external JavaScript file 
     var fileref=document.createElement('script'); 
     fileref.setAttribute("type","text/javascript"); 
     fileref.setAttribute("src", filename); 
    } 
    if (typeof fileref!="undefined") 
     document.getElementsByTagName("head")[0].appendChild(fileref); 
     //call TogetherJS methods after script has loaded 
     fileref.onload = function() { 
      TogetherJS.hub.on('init', function (msg) { 
       console.log("init"); 
      }); 

      TogetherJS.on("ready", function() { 
       console.log("ready"); 
      }); 
     }; 
    } 
} 

loadjsfile("https://togetherjs.com/togetherjs-min.js", "js"); 
+0

Просто привяжите событие onload к узлу скрипта. См. Мое редактирование. –

+0

Это работает, когда я загружаю js-файл с удаленного хоста, но не когда загружаю его с localhost. Должно быть, сетевая задержка «исправляет» проблему «не загружена». Это также означает, что он не соблюдает директиву onload и что он может работать, а может и нет. Как я могу сделать это последовательным? Я не хочу добавлять тайм-аут там, это слишком хаки. –

+0

Нашел раздел «Отменить инициализацию» в документации https://togetherjs.com/docs/#extending-togetherjs. Я просто не знаю, что заменить эту строку «MyApp.onload = callback;». Мне нужно событие Galleria.ready вместо MyApp.onload. Как я могу это сделать? –

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