2009-07-27 4 views
0

I осуществляет контроллер сценария по требованию, основанный на getscript Jquery, это выглядит следующим образом:как вызывать динамически загружаемой функцию яваскрипта

function controller = function(){ 

    var script = function(){ 
     var scripts = {}; 
     return { 
     load: function(jsurl){ 
      $.getScript(jsurl, null); 
     }, 
     run: function(js){ 
      window[js].apply(this,null); 
     } 
     } 
    }; 

    return { 
    script: script() 
    }; 

} 

var ctlr = controller(); 

то здесь удаленный скрипт с функцией для загрузки - remote.js

function remotefunc(){ 
    alert('remotefunc invoked'); 
} 

и вот как все это должно работать, в основном скрипте:

ctlr.script.load('remote.js'); // remote script successfully loaded 
ctlr.script.run('remotefunc'); // got an error, window['remotefunc'] undefined 

, но, как вы можете видеть, «remotefunc» определен в глобальной области «окна», поэтому объект окна должен иметь возможность «видеть» его.

Я думал, что проблема была, вероятно, укупорочное материал в определении «контроллер», так что я сделал прямой $ .getScirpt без использования «контроллера»:

$.getScript('http://path/to/remote.js', function(){ 
    window['remotefunc'].apply(this, null); // this worked 
}); 

странно. Итак, речь идет о реализации «контроллера» (мне это нужно)! Кто-нибудь может помочь мне с этим? Как исправить реализацию «контроллера», так что

window[js].apply(this,null); 

может на самом деле работать?

Thanx.

ответ

1

При использовании чего-то вроде getSript, важно помнить, что он извлекает асинхронно. Смысл, браузер отключает запрос, и в то время как это происходит, код после этой строки выполняется без паузы.

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

Попробуйте это:

var script = function(){ 
     var scripts = {}; 
     return { 
      load: function(jsurl, callback){ 
       $.getScript(jsurl, callback); 
      }, 
      run: function(js){ 
       window[js].apply(this,null); 
      } 
    } 
}; 

Затем, при его использовании:

ctlr.load('remote.js', function(){ 
     // remote script successfully loaded 
     ctlr.run('remotefunc'); 
}); 
2

Причина, по которой вы говорите, что окно ['remotefunc'] не определено, - это то, что вы не даете ему времени для фактической загрузки и выполнения удаленного сценария перед попыткой вызвать определенную в нем функцию.

Удаленный сценарий загружается асинхронно, что означает, что выполнение сценария не приостанавливается во время ожидания ответа.

Вам понадобится либо повторно реализовать метод getScript, либо быть синхронным, либо каким-то образом работать с вашим классом в связи с тем, что функция не будет доступна ни в какое определенное время.

EDIT: Просто найти другое возможное решение, попробуйте вызвать это до запроса

$.ajaxSetup({async: false}); 

Это делает метод getScript синхронное

+0

я бы не сделать метод синхронно. Весь асинхронный процесс заключается в том, что выполнение не блокирует сетевую задержку. – thedz

+0

@ Kane: Спасибо! Поместите свой код до $ .getScript, проблема остается, хотя – Shawn

0

Может быть, это вопрос времени?

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

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