Ошибки JSONP и DOCTYPE

Я столкнулся со странной проблемой.

Я общаюсь со своим сервером с помощью AJAX. (Я запускаю свое веб-приложение на localhost). Сервер расположен, скажем, на http://www.example.com

Чтобы обойти ту же политику происхождения, я использую JSONP. Я динамически создаю тег <script> и загружаю данные с моего сервера.

Все идет нормально.

Затем я решил загрузить свое веб-приложение на этот поддомен: http://m.example.com

Вот когда я сталкиваюсь с сумасшедшими ошибками. Иногда страница загружается, иногда нет. Когда он не загружается, Firebug выдает ошибку DOCTYPE.

Я провел некоторое исследование и наткнулся на этот пост о стеке: firebug возвращает синтаксическую ошибку в типе документа?

Цитирование ответа по этой ссылке:

Обычно это происходит из-за того, что вы загружаете HTML-документ как скрипт. Это часто вызвано <script src=""></script> (то есть относительным URI, указывающим на текущий, HTML, документ)) или одним из скриптов, указывающим на ошибку 404.

Довольно полезная штука. Исходя из всего вышесказанного, я пришел к выводу, что всякий раз, когда мой сервер медленно отвечает, атрибут src тега <script> равен нулю. Поскольку это выдает 404 error, я получаю ошибку DOCTYPE в Firebug. Всякий раз, когда мой сервер отвечает быстро, проблем нет, и все работает нормально.

Как решить эту проблему? Я мог бы установить ручной тайм-аут или что-то в этом роде, но это не было бы надежным и элегантным решением.

Любая помощь, ребята?

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

Вот код:

Эта функция используется для динамического создания тега script:

function appendScriptToHead() {
    var element = document.createElement("script");  
    element.src = 'http://www.example.com/?data&callback=callfunction'; 
    document.getElementsByTagName("head")[0].appendChild(element) 
}

Эта функция обратного вызова вызывается, когда указанный выше URL-адрес, содержащий данные JSONP, загружается:

function callfunction(response) {  
    alert(response);  
}

person wiseindy    schedule 12.07.2012    source источник
comment
Вам нужно будет предоставить какой-то код.   -  person RoToRa    schedule 12.07.2012
comment
Решить какую проблему? Если вы хотите решить, что src является null, добавьте проверку для null перед вставкой тега сценария. Если вы хотите иметь возможность поймать ошибку, тайм-ауты — это то, что вам нужно.   -  person Matt    schedule 12.07.2012
comment
Привет @RoToRa. Я отредактировал свой вопрос и включил код, который сейчас использую для получения данных JSONP с моего сервера. Спасибо!   -  person wiseindy    schedule 12.07.2012
comment
Привет @Мэтт! Спасибо за ваш вклад. Не могли бы вы дать мне небольшой пример кода, как проверить, является ли src нулевым?   -  person wiseindy    schedule 12.07.2012
comment
В вашем фактическом коде также отсутствует http:// в URL-адресе?   -  person RoToRa    schedule 12.07.2012
comment
@RoToRa Я тоже пытался с http://. Та же проблема всплывает   -  person wiseindy    schedule 12.07.2012
comment
когда вызывается функция appendScriptToHead()?   -  person Tomer    schedule 12.07.2012
comment
@ ftom2 Я вызываю эту функцию при нагрузке на тело. <body onLoad=appendScriptToHead()>   -  person wiseindy    schedule 14.07.2012


Ответы (1)


Я думаю, что здесь есть некоторое недоразумение. Для вашего элемента script всегда будет установлено свойство src, но его содержимое зависит от ответа вашего сервера. Сомневаюсь, что это будет ошибка 404 (поскольку она относится к элементу, который не найден, что вряд ли повторяется), но может быть 500 вкусов.

Я предлагаю отлаживать ваши запросы так, как они есть (т. е. открывать http://www.example.com/?data&callback=%callfunction% в браузере или с помощью какого-нибудь скриптового HTTP UserAgent, если вы считаете себя трудолюбивым), чтобы увидеть, что может быть не так с логикой, которая выбирает скрипт для загрузки.

person raina77ow    schedule 12.07.2012
comment
Привет @raina77wow. Я понимаю что ты имеешь в виду. Я попытался открыть http://www.example.com/?data&callback=%callfunction% напрямую в браузере. Он возвращает строку JSONP в порядке. Но ответ сервера меняется. Иногда открывается сразу, иногда требуется время. Как я могу обойти эту неопределенность в коде? - person wiseindy; 15.07.2012
comment
Я бы предложил использовать подход, описанный в этом ответ. Однако нет необходимости определять дополнительную переменную: вы можете просто проверить функцию, которую собираетесь загрузить. - person raina77ow; 16.07.2012