альтернативы eval для запуска удаленного кода - PullRequest
3 голосов
/ 05 января 2011

Существуют ли альтернативы использованию eval для немедленного запуска удаленного и надежного кода javascript.

function load(filePath) {
    var o = $.ajax({
        url: filePath,
        dataType: 'html',
        async: false 
    }); 

    eval(o.responseText);
}

load("somePath");
// run a function that relies on the code from o.responseText being loaded
doSomethingWithCode();

Мне известно, что рекомендуется синхронная загрузка javascript.Но если нет выбора, есть ли какие-нибудь кросс-браузерные альтернативы для использования eval выше.

[Редактировать]

Для более подробного разъяснения загружаемый код является самореализующейся функцией.Который должен выполнить перед doSomethingWidthCode.Он также загружается с сервера в том же домене, следовательно, является доверенным.

Ответы [ 4 ]

3 голосов
/ 05 января 2011

Динамическая вставка текста сценария является единственной альтернативой eval.

var head    = document.getElementsByTagName('head')[0] || document.documentElement,
    nscr    = document.createElement('script');

    nscr.type           = 'text/javascript';
    nscr.textContent    = o.responseText;
    nscr.setAttribute('name', 'dynamically inserted');
    nscr.onload         = nscr.onreadystatechange = function() {
              if( nscr.readyState ) {
                   if( nscr.readyState === 'complete' || scr.readyState === 'loaded' ) {
                      nscr.onreadystatechange = null;
                       doSomethingWithCode();
              }
              else {
                  doSomethingWithCode();
              }
    };

    head.insertBefore(nscr, head.firstChild);

Единственное, что стоит упомянуть: textContent недоступно в InternetExplorers. Вместо этого вам нужно будет использовать .text, поэтому небольшое обнаружение делает его кросс-браузерным.

1010 * редактировать *

Чтобы иметь динамический тег сценария загрузки syncronous, вы можете добавить nscr.async = true;. В любом случае, это работает только в самых современных браузерах.

1 голос
/ 05 января 2011

Я бы использовал JSONP в этом случае.Раймонд Камден (Raymond Camden) предлагает превосходное введение в концепцию.

Быстрый пример использования JSONP в этой ситуации доступен по адресу http://playground.itcouldbe9.com/syncjsonp/.

0 голосов
/ 05 января 2011

почему бы не использовать обратный вызов?

eval('(function(){' + o.responseText + ';})(); doSomethingWithCode();')

РЕДАКТИРОВАТЬ:

ОК, затем попробуйте это:

var o = $.ajax({
    url: filePath,
    dataType: 'html',
    async: false
    success: function(responseText){
        eval('(function(){' + responseText + '})()');
        doSomethingWithCode();
    });
}); 

Я думаю, что единственный оставшийся вариант будет опрос:

(function(){
    if (o.responeText)
        doSomethingWithCode();
    else 
        setTimeout(arguments.callee, 13);
})();
0 голосов
/ 05 января 2011

Вы можете вернуть возвращаемый код в функцию, а когда запрос завершится, выполнить эту функцию. Например, это ваш удаленный код:

function hi(){alert('hi');}

И затем, когда ваш запрос будет выполнен, вы можете вставить этот код в тег javascript и затем вызвать функцию hi ()

...