Что методы состоят в том, чтобы обойти правила безопасности загрузки файла IE?

Internet Explorer (с настройками по умолчанию, которые я обычно принимаю, будет в действительности на рабочих столах плебеев), кажется, не нравится идея принять содержание вложения в ответе HTTP, если соответствующий запрос не был выполнен непосредственно от пользовательского действия (как обработчик "щелчков", или собственная форма отправляет). Существует, вероятно, больше деталей и нюансов, но это - основное поведение, это расстраивает меня.

Мне кажется, что эта ситуация распространена: пользовательский интерфейс перед некоторым загружаемым содержанием — говорит, подготовленный отчет PDF — позволяет, чтобы некоторые опции и исходные данные использовались в создании содержания. Теперь, как со всеми формами, которые позволяют пользователю предусматривать, как приложение делает что-то, возможно, что вход будет ошибочен. Не всегда, но иногда.

Таким образом существует дилемма. Если клиент попытается сделать что-то необычное, как выполненный транзакция Ajax, чтобы позволить серверу исследовать содержание формы и затем повторно отправить для получения загрузки, то IE не понравится это. Этому не понравится он, потому что фактическая транзакция HTTP, которая приносит вложение, произойдет не в исходном обработчике событий пользовательского действия, а в обратном вызове завершения Ajax. Хуже, так как панель безопасности IE, кажется, думает, что решение всех проблем состоит в том, чтобы просто перезагрузить внешнюю страницу от своего исходного URL, ее приглашение пользователю идти вперед и загрузить подозрительное содержание не будет даже работать.

Другая опция состоит в том, чтобы просто иметь форму, начинают говорить. Сервер проверяет параметры, и если существует что-то не так, что он отвечает контейнерной формой страницей, наперченной соответственно сообщениями об ошибках. Если содержание формы в порядке, это генерирует содержание и поставляет его назад в ответе HTTP как прикрепленный файл. В этом случае (я думаю), IE счастлив, потому что содержание, по-видимому, непосредственно требовал пользователь (который является, между прочим, смехотворно неосновательный способ сказать хорошее содержание от плохого содержания). Здорово, но проблема теперь состоит в том, что клиентская среда (то есть, код на моей странице) не может сказать, что обработанная загрузка, таким образом, форма все еще просто находится там. Если моя форма находится в своего рода диалоговом окне, то я действительно должен закрыть это, когда операция завершена — действительно, это - одна из мотиваций для того, чтобы сделать его Ajax путь.

Мне кажется, что единственная вещь сделать, оборудуют диалоговые окна формы обменом сообщениями, который говорит что-то как, "Закройте это, когда Ваша загрузка начинается". Это действительно кажется Ламе мне, потому что это - пример, "нажмите эту кнопку для меня" интерфейс: идеально, мой собственный код должен быть в состоянии нажать кнопку, когда это является соответствующим. Ключевая вещь, которую я не знаю, состоит в том, существует ли какой-либо путь к клиентскому коду для обнаружения того представления формы, привел к загрузке вложения. Я никогда не слышал о способе обнаружить, что, но это вышло бы из тупика для меня.

11
задан Pointy 14 January 2010 в 14:47
поделиться

2 ответа

я беру его, вы отправляете форму с другим целевым окном; следовательно форма, остающаяся на месте.

существует несколько опций.

  1. Сохраняют кнопку отправки отключенной и делают продолжающуюся проверку в фоновом режиме, опрашивая форму относительно изменений в полях и затем исчерпывая запрос проверки на поле, когда это изменяется. Когда форма будет в допустимом состоянии, включите кнопку; когда это не будет, отключите кнопку. Это не прекрасно, поскольку будет иметь тенденцию быть задержкой, но это может быть достаточно хорошо для того, что вы делаете.
  2. Делают основную проверку, которая не требует, чтобы распространения в прямом и обратном направлениях к серверу в обработчике для формы отправили событие, затем отправили форму и удалили ее (или возможно просто скройте ее). Если дальнейшая проверка на сервере обнаруживает проблему, это может возвратить страницу, которая использует JavaScript, чтобы сказать исходному окну вновь отображать форму.
  3. Использование сеансовые куки и уникальный идентификатор формы (текущее время от новая Дата () .getTime () сделала бы); когда форма отправлена, отключите ее кнопку отправки, но сохраните ее видимой, пока ответ не возвращается. Заставить ответ установить сеансовые куки с тем идентификатором, указывающим на успех/отказ. Иметь окно, содержащее опрос формы для cookie каждую приблизительно секунду и действие на результате, когда это будет видеть его. (Я никогда не делал этого последнего; не сразу наблюдение, почему это не работало бы.)

я ожидаю, что существует приблизительно дюжина других способов освежевать эту кошку, но они равняются три, которые пришли на ум.

(Редактирование) , Если вы не отправляете другой цели, вы могли бы хотеть идти вперед и сделать это - к скрытому iframe на той же странице. Это (возможно объединенный с вышеупомянутым или другими ответами) могло бы помочь вам получить пользовательский опыт, который вы ищете.

8
ответ дан 3 December 2019 в 09:41
поделиться

Чтобы ответить на новый вопрос, вы можете использовать следующую строку, чтобы удалить все <Опция> , содержащий CurrentComponentname :

$('select.componentSelect option:contains("' + currentComponentName + '")').remove();

DEMO

-121--3255136-

Там есть целое число действительно веских причин , то есть это делает это, и я уверен, что это не то, с кем-то будет поспорить - поэтому главная цель - обойти его как-то сделать все лучше Для ваших пользователей.

Иногда стоит подумать, как все сделано. Возможно, отключите кнопку, используйте JavaScript, чтобы проверить, когда все поля заполнены, и выпустите запрос AJAX, как только они есть. Если AJAX был успешным, включите кнопку. Это всего лишь одно предложение, я уверен, что будет больше ...

Редактировать: Подробнее ...

Делать простую отправку (Non-Ajax), и если чеки не удаются, отправьте страницу Вернувшись, а не привязанность. Страница, отправленная обратно, может содержать всю представленную информацию (плюс какое-либо сообщение об ошибке пользователю), поэтому пользователю не нужно снова заполнять всю форму. И я также уверен, что будет больше идей ...

Редактировать: Подробнее ...

Я уверен, что вы видели этот тип вещи раньше - и да, это ] дополнительный щелчок (не идеальный, но не сложный) .... «Если ваша загрузка не удается, нажмите здесь» -> В этом случае сделайте это, как вы хотите сделать это, но добавьте новую ссылку / кнопку Страница Когда ajax возвращает, поэтому, если загрузка не удалась, они могут отправлять уже проверенную форму из «Direct User Action». И я уверен, что я буду думать о большем (или кому-то еще будет) .....

2
ответ дан 3 December 2019 в 09:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: