Нужно ли создавать новый тег SCRIPT каждый раз, когда я звоню с помощью JSONP? - PullRequest
0 голосов
/ 11 марта 2012

Я звоню в свою базу данных через HTTP. Поскольку он не находится на том же сервере, что и мое приложение, я использую JSONP. Поэтому каждый раз, когда я хочу запрашивать информацию из моей базы данных, моя функция JavaScript добавляет еще один тег сценария в дерево DOM. Когда мое приложение какое-то время работает, исходный код заполнен тегами SCRIPT.

Это то, что я должен принять, работая с JSONP, или есть другой способ?

Ответы [ 3 ]

1 голос
/ 11 марта 2012

Да, это просто проблема с JSONP.Вы можете прикрепить обработчик onload к элементу script, чтобы очистить его по завершении (onreadystatechange для IE).

Или, поскольку вы управляете обоими серверами, вы можете использовать CORS.Это меньше, чем JSONP, и предлагает гибкость XMLHttpRequest.

1 голос
/ 11 марта 2012

Зависит от браузера, но обычно да.Вы должны добавить новый тег сценария.Однако вы можете удалить элемент script dom после загрузки скрипта.Если вы используете jQuery, он позаботится об этом за вас - метод, который вам нужно использовать, зависит от браузера.

Если вы используете Visual Studio, даже если скрипт удаляется, вы все равно увидите ссылку на скрипт в отладчике.Насколько я могу судить, в производственном режиме это не означает, что произошла «утечка».

0 голосов
/ 11 марта 2012

Когда я получаю ответ JSONP, я удаляю тег script. Например:

function makeJSONPRequest() {
    var script = document.createElement('script');
    var callbackName = 'callback' + (+new Date()) + '_' + Math.floor(Math.random() * 10000);
    script.type = 'text/javascript';
    script.src = 'http://www.example.com/jsonp?callback=' + callbackName;
    window[callbackName] = callback;
    document.head.appendChild(script);
    function callback(data) {
        delete window[callbackName];
        document.head.removeChild(script), script = null;
        console.log(data);
    }
}
...