Как вы синхронно загружаете скрипт из другого каталога через ajax-вызов? - PullRequest
13 голосов
/ 27 декабря 2010

Мне часто нужно загружать другие файлы javascript через ajax, поэтому вначале я использовал стандартную функцию, которую jQuery обеспечивает для загрузки скриптов:

$.getScript('script_name.js',callback_function());

Но это не сработало, так как $ .getScriptявляется асинхронным (jQuery API для $ .ajax говорит, что «async» по умолчанию имеет значение true; тема обсуждается в комментариях API для $ .getScript: http://api.jquery.com/jQuery.getScript/). Так что я написал эту функцию, как предоставленокто-то в комментариях к странице API, ссылка на которую приведена выше:

load:function(script,callback){

    jQuery.ajax({

        async:false,

        type:'GET',

        url:script,

        data:null,

        success:callback,

        dataType:'script'

    });

},

Это, похоже, работает хорошо, поэтому я продолжил, но недавно заметил, что это работает только для сценариев в том же каталоге, например, для вызоваmyObj.load ('test.js') работает хорошо, но вызов myObj.load ('test / test.js') вообще не работает.

Такое ощущение, что я упустил что-то очевидное,но мне не удалось найти проблему. Есть идеи?

Ответы [ 2 ]

17 голосов
/ 16 марта 2012

Вы можете установить синхронные вызовы ajax по умолчанию, используя ajaxSetup .Вот как это выглядит:

$.ajaxSetup({async:false});
$.getScript('script_name.js', callback_function);

Если вам снова нужны асинхронные вызовы, просто включите его с помощью:

$.ajaxSetup({async:true});
13 голосов
/ 27 декабря 2010

Обновление: смотрите поток комментариев ниже, это не имеет ничего общего с jQuery, это проблема с правами доступа к файлам на сервере.


Оригинальный ответ :

Получаете ли вы какие-либо ошибки из браузера?Например, в Chrome или Safari, если вы откроете Dev Tools и посмотрите на вкладку Console, выдает ли это ошибки?Или в Firefox, установите Firebug и проверьте в консоли Firebug.Или в IE, используйте бесплатную версию VS.Net ... Что-то должно жаловаться вам на что-то.

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

jQuery.ajax({
    async:false,
    type:'GET',
    url:script,
    data:null,
    success:callback,
    dataType:'script',
    error: function(xhr, textStatus, errorThrown) {
        // Look at the `textStatus` and/or `errorThrown` properties.
    }
});

Обновление : вы сказали, что видите textStatus = 'error' и errorThrown = undefined.Очень странно.Работает ли такой же скрипт , если вы переместите его, чтобы он не находился в подпути?Интересно, является ли подпуть красной сельдью, и настоящая проблема - синтаксическая ошибка в сценарии.


Не по теме : действительно ли это действительно должны быть синхронными?Вы не можете просто опросить, чтобы появился символ?Просто синхронные запросы ajax на самом деле отбрасывают пользовательский опыт.Во многих браузерах не только ваша собственная страница, но и все страницы блокируются во время запроса.

Вот что я имею в виду под опросом: предположим, я хотел загрузить jQuery асинхронно из JavaScript:

function loadScript(url, symbol, callback) {
    var script, expire;

    // Already there?
    if (window[symbol]) {
        setTimeout(function() {
            callback('already loaded');
        }, 0);
    }

    // Determine when to give up
    expire = new Date().getTime() + 20000; // 20 seconds

    // Load the script
    script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    document.body.appendChild(script);

    // Start looking for the symbol to appear, yielding as
    // briefly as the browser will let us.
    setTimeout(lookForSymbol, 0);

    // Our symbol-checking function
    function lookForSymbol() {
        if (window[symbol]) {
            // There's the symbol, we're done
            callback('success');
        }
        else if (new Date().getTime() > expire) {
            // Timed out, tell the callback
            callback('timeout');
        }
        else {
            // Schedule the next check
            setTimeout(lookForSymbol, 100);
        }
    }
}

Использование:

// Load jQuery:
loadScript("path/to/jquery.min.js", "jQuery", function(result) {
    // Look at 'result'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...