Ответ 1
Я обычно использую
<form method='POST' action='?'>
Это означает текущий URL, но без параметров.
Я только узнал (трудный путь), что, когда у вас есть форма HTML с action=""
, браузеры Webkit относятся к нему по-разному с Firefox и Internet Explorer.
В FF и IE эти два тега формы эквивалентны:
<form method="post" action="">
<form method="post">
Они оба отправят форму обратно на ту же страницу. Safari и Chrome, однако, отправят эту первую форму на страницу по умолчанию (index.php или что-то еще) - вторая форма работает так же, как FF/IE.
Я быстро взломал свой код, чтобы везде, где он обычно печатал пустое действие, он вообще не добавляет атрибут действия.
Это кажется очень грязным, а не лучшим способом заниматься вещами. Может ли кто-нибудь предложить лучший метод? Кроме того, может ли кто-нибудь просветить меня о том, почему Webkit будет делать такую вещь?
Я обычно использую
<form method='POST' action='?'>
Это означает текущий URL, но без параметров.
Требуется атрибут 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, используемый для извлечения объекта. Таким образом, поведение WebKits на самом деле является ожидаемым поведением в соответствии с RFC 3986.
Но в HTML 5 это поведение пустого URI в form
s action
(все еще черновик) отличается от RFC 3986:
Если действие - это пустая строка, пусть действие будет адресом документа.
Примечание. Этот шаг является преднамеренным нарушением RFC 3986, для которого здесь требуется обработка базового URL. Это нарушение мотивируется стремлением к совместимости с наследием. [RFC3986]
Откровенно говоря, комментарий HTML после этой заметки в исходном коде читает:
<!-- Don't ask me why. But that 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, которая стала стандартом де-факто.
Лучшим способом, на мой взгляд, было бы не пропустить атрибут действия (который не будет проверять), а указать фактическое действие для формы. Есть ли причина, по которой вы не указали действие?
Я всегда использовал (в PHP)
<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>">
Чтобы мои формы подчинялись себе.