Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Загрузка файла без AJAX. (https://javascript.ru/forum/css-html-internet-explorer/9036-zagruzka-fajjla-bez-ajax.html)

B~Vladi 26.04.2010 11:29

Загрузка файла без AJAX.
 
Передо мной стоит задача загрузить JS файл на клиета без AJAX. Главное условие - в сценариях я должен иметь доступ к исходному тексту скрипта. Так как код не попадает в DOM при использовании тега script, я пробовал разные варианты:

1. Iframe
В нормальных браузерах код отображается во фрейме и я могу получить исходный код. Но ишак вместо этого предлагает скачать файл, т.к. расширение его - js, а он ждет html. Не хотелось бы накладывать лишние ограничения по именам и заголовкам запроса.

2. Object & Embed
Через тег object можно указывать тип подключаемого объекта. Пробовал разные типы: plain/text, text/html, text/javascript - код не выводится и через DOM не доступен. С такими типами - text/xml, application/xml и application/text-xml уже есть какое-то движение: появляется ошибка парсера xml и через контекстное меню, "Исходный код HTML" я всё-таки вижу код файла, но через DOM получить не смог. Хотя можно получить первую строку из ошибки парсера и если файл будет сжат в 1 строку - можно получить весь код. Но это опять же лишние ограничения. С тегом embed вообще ничего интересного не смог добиться.

3. ActiveX DOM XML
Пробовал и таким способом, конкретно через метод load. Но опять же парсер XML падает с той же ошибкой.

Не устраивает аякс по нескольким причинам: нужен лишний кроссбраузерный код, хоть и не большой, а так же его ограничение на количество открытых соединений. Лучше когда браузер сам качает.

Какие ещё варианты могут быть? Я уже незнаю...

Kolyaj 26.04.2010 11:47

Цитата:

Сообщение от B~Vladi
нужен лишний кроссбраузерный код

Да там две строчки.

Цитата:

Сообщение от B~Vladi
его ограничение на количество открытых соединений

Это не его ограничение, а браузера, независимо от типа соединения.

B~Vladi 26.04.2010 12:02

Цитата:

Сообщение от Kolyaj
Это не его ограничение, а браузера, независимо от типа соединения.

Ну да, ты меня понял. При том ограничения у всех свои.

Цитата:

Сообщение от Kolyaj
Да там две строчки.

2 строчки добавляют 10 багов блин:-E
Если дать браузеру качать файлы, он в любом случае сделает это лучше и все ограничения разрулит сам. Ну если не удаться по-другому, то конечно придётся аяксом.

Поясню для чего мне нужен исходный код. Дело в том, что для нормального API, его необходимо запускать в контексте определённого объекта и в специальном scope.

Kolyaj 26.04.2010 12:12

Цитата:

Сообщение от B~Vladi
2 строчки добавляют 10 багов блин

Также как и любые другие две строчки. Почему с iframe'ом не будет багов?

Цитата:

Сообщение от B~Vladi
Если дать браузеру качать файлы, он в любом случае сделает это лучше и все ограничения разрулит сам.

XHR-запросы он тоже сам разруливает.

Цитата:

Сообщение от B~Vladi
Дело в том, что для нормального API, его необходимо запускать в контексте определённого объекта и в специальном scope.

На код, как я понимаю, накладываются какие-то ограничения? Почему бы не наложить тогда, что код должен лежать внутри функции с определённым именем, а уж её и вызывать в нужном контексте.

Если нужен точный исходник файла, то только два варианта: 1. XHR, 2. Посредник на сервере, который будет оборачивать ответ в jsonp, например.

B~Vladi 26.04.2010 13:11

Цитата:

Сообщение от Kolyaj
На код, как я понимаю, накладываются какие-то ограничения?

Вот в том то и дело, что хочу избавиться от этого. Контекст выполнения нужен для этого скрипта и по-сути его больше ничего не должно интересовать. Scope нужен для того, чтобы в него не попали переменные из scope либы. Так что в глобальную область видимости ничего не попадает. В принципе это уже всё реализовано и такое API меня больше чем устраивает.
Цитата:

Сообщение от Kolyaj
XHR-запросы он тоже сам разруливает.

Т.е. если, например, создать 5 тегов script и 5 аякс-запросов поведение будет одинаковым?
Цитата:

Сообщение от Kolyaj
Почему с iframe'ом не будет багов?

Да какие там могут быть баги. Он ещё плох тем, что не смогу получить текст, если грузиться он будет с другого домена.
Цитата:

Сообщение от Kolyaj
два варианта: 1. XHR, 2. Посредник на сервере, который будет оборачивать ответ в jsonp, например.

Ну второй точно отпадает. Тогда уж можно было бы завернуть это в xml.

B~Vladi 26.04.2010 15:16

Причем если открывать файл локально, то он показывается, если через http - качается:blink:
Тупой ишак.

Gvozd 26.04.2010 15:19

Цитата:

Сообщение от B~Vladi
Тупой ишак.

на зеркало неча пенять...
попробуй отдавать скрипт без content-type,или отличным от умолчательного для JS

B~Vladi 26.04.2010 15:28

Цитата:

Сообщение от Gvozd
на зеркало неча пенять...

Норм у меня руки. Всё из-за того, что в ишаке расширение js не известно. Стоит только переименовать на txt или html и всё ок. Но скрипт должен быть js.
Цитата:

Сообщение от Gvozd
попробуй отдавать скрипт без content-type,или отличным от умолчательного для JS

Ну всё сходится к выбору между сменой заголовка или XHR. В первом варианте не хотелось бы ещё и на сервер добавлять обязательства, а во втором... Второй вариант это уже совсем отдельная тема и к либе никакого отношения не имеет. Т.е. придётся это всё оформлять в виде плагина к либе. В принципе тоже вариант. Что бы выбрали вы?

Gvozd 26.04.2010 15:38

Цитата:

Сообщение от B~Vladi
Что бы выбрали вы?

не вижу причин, чтобы не использовать XHR

B~Vladi 26.04.2010 15:56

Цитата:

Сообщение от Gvozd
не вижу причин

А я вижу.
В общем есть некий контроллер низкого уровня. Под ним работают классы, которые реализуют какую-то функциональность (каждый свою). Контроллер же должен быть независимым и отказоустойчивым. Доступен он только для тех классов, которые под ним работают, т.к. между ними есть своё API. Так же могут быть какие-то общие компоненты, которые могут использоваться этими классами, например работа с AJAX или событиями. Пока точно не решено выносить такие компоненты в отдельный тип или же приравнять к классам. В первом варианте создаётся зависимость контроллера от компонента, что не приемлемо. Если тот же код внести в сам контроллер, то получается дублирование (поддержка AJAX в любом случае должны быть извне). В общем лишний он тут совсем. Не знаю, поймёте, нет...

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


Часовой пояс GMT +3, время: 19:56.