Формы с действием = "" - PullRequest
       8

Формы с действием = ""

26 голосов
/ 06 января 2009

Я только что обнаружил (трудный путь), что когда у вас есть HTML-форма с action="", браузеры Webkit обрабатывают ее по-разному, по сравнению с Firefox и Internet Explorer.

В FF и IE эти два тега формы эквивалентны:

<form method="post" action="">

<form method="post">

Они оба отправят форму обратно на одну и ту же страницу. Однако Safari и Chrome отправят эту первую форму на страницу по умолчанию (index.php или что-то еще) - вторая форма работает так же, как FF / IE.

Я быстро взломал свой код, чтобы в любом месте, где он обычно печатал пустое действие, он вообще не добавлял атрибут действия.

Это кажется очень грязным и не лучшим способом делать вещи. Кто-нибудь может предложить лучший метод? Кроме того, кто-нибудь может объяснить мне, почему Webkit сделал бы такую ​​вещь?

Ответы [ 4 ]

27 голосов
/ 06 января 2009

Я обычно использую

<form method='POST' action='?'>

Это означает текущий URL, но без параметров.

11 голосов
/ 06 марта 2009

Атрибут action является обязательным , но вы можете указать пустую ссылку на URI, которая ссылается на текущий URI:

<form method="POST" action="">

Редактировать Хорошо, это фактически полевая ошибка WebKit 528+ (см. Ошибка 19884 ), когда пустой URI используется с указанным базовым URI с использованием элемента BASE , В этом случае WebKit использует базовый URI вместо разрешения пустого URI из базового URI.

Но это правильное поведение в соответствии с RFC 3986 :

5,1. Создание базового URI

Термин «относительный» подразумевает, что существует «базовый URI», против которого относительная ссылка применяется. [...]

Базовый URI ссылки может быть установлен одним из четырех способов, обсуждается ниже в порядке приоритета. Порядок старшинства может следует рассматривать с точки зрения слоев, где самая внутренняя определенная основа URI имеет самый высокий приоритет. Это можно визуализировать графически следующим образом:

  .----------------------------------------------------------.
  |  .----------------------------------------------------.  |
  |  |  .----------------------------------------------.  |  |
  |  |  |  .----------------------------------------.  |  |  |
  |  |  |  |  .----------------------------------.  |  |  |  |
  |  |  |  |  |       <relative-reference>       |  |  |  |  |
  |  |  |  |  `----------------------------------'  |  |  |  |
  |  |  |  | (5.1.1) Base URI embedded in content   |  |  |  |
  |  |  |  `----------------------------------------'  |  |  |
  |  |  | (5.1.2) Base URI of the encapsulating entity |  |  |
  |  |  |         (message, representation, or none)   |  |  |
  |  |  `----------------------------------------------'  |  |
  |  | (5.1.3) URI used to retrieve the entity            |  |
  |  `----------------------------------------------------'  |
  | (5.1.4) Default Base URI (application-dependent)         |
  `----------------------------------------------------------'

В этом случае элемент BASE с атрибутом href является базовым URI , встроенным в содержимое . И базовый URI, встроенный в содержимое , имеет более высокий приоритет, чем URI, используемый для извлечения сущности . Таким образом, поведение WebKit на самом деле является ожидаемым поведением согласно RFC 3986.

Но в HTML 5 это поведение пустого URI в form 's action (все еще черновик) отличается от RFC 3986:

Если action - пустая строка, пусть action будет адресом документа .

Примечание. Этот шаг является преднамеренным нарушением документа RFC 3986, что потребовало бы обработки базового URL здесь. Это нарушение мотивировано желанием совместимости с устаревшим контентом. [RFC3986]

Честно говоря, комментарий HTML после этой заметки в исходном коде гласит:

<!-- Don't ask me why. But that's what IE does. It even treats
action="" differently from action=" " or action="#" (the latter
two resolve to the base URL, the first one resolves to the doc
URL). And other browsers concur. It is even required, see e.g.
  http://bugs.webkit.org/show_bug.cgi?id=7763
  https://bugzilla.mozilla.org/show_bug.cgi?id=297761
-->

Так что это скорее ошибка, возникшая из Internet Explorer, которая стала стандартом де-факто.

6 голосов
/ 06 января 2009

На мой взгляд, лучший способ - не пропустить атрибут действия (который не будет проверяться), а указать действительное действие для формы. Есть ли причина, по которой вы не указываете действие?

2 голосов
/ 05 марта 2009

Я всегда использовал (в PHP)

<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>">

Чтобы заставить мои формы подавать себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...