тип ввода = изображение против типа = отправить

Я долго программировал проверку StructKeyExists(form,"Update"), пока не изменил свой ввод с type="submit" на type="image". IE не отправляет обратно имя элемента управления, когда type="image", а вместо этого отправляет Update.X и Update.Y.

<form method="post">
Old Way:<br />
<input type="submit" value="3" name="Update" /><br />
<input type="submit" value="4" name="Delete" />
<p>New Way:</p>
<input type="image" value="1" name="Update" src="http://www.google.com/intl/en_ALL/images/logo.gif" /><br />
<input type="image" value="2" name="Delete" src="http://images.google.com/intl/en_ALL/images/logos/images_logo_lg.gif" />
</form>

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

from: <cfif StructKeyExists(form,"Update")
to:   <cfif StructKeyExists(form,"Update.X")

Но мне нужно решение, которое обрабатывает как type="submit", так и type="image". Сейчас моя логика такова:

<cfif StructKeyExists(form,"Update") OR StructKeyExists(form,"Update.X")>
   <!--- UPDATE table --->
<cfelseif StructKeyExists(form,"Delete") OR StructKeyExists(form,"Delete.Y")>
   <!--- DELETE FROM Table --->
</cfif>

В: Есть ли более элегантный способ проверить, какая кнопка была нажата? Предполагая, конечно, что в форме есть более одной кнопки, потому что, если бы мне нужно было только проверить, была ли форма отправлена, я бы проверил, существуют ли form.fieldnames.


person Phillip Senn    schedule 29.09.2009    source источник


Ответы (3)


Вы также можете просто проверить список полей формы, чтобы увидеть, содержит ли он строку «Обновить». Что-то типа:

<cfif StructKeyExists(form,"fieldnames") and form.fieldnames contains "Update">
<!--- Do Update --->
<cfelseif StructKeyExists(form,"fieldnames") and form.fieldnames contains "Delete">
<!--- Do Delete --->
</cfif>

Form.fieldnames содержит все имена отправленных полей формы.

person Bryan Kaiser    schedule 30.09.2009
comment
Содержит может быть действительно полезным. Поскольку form.fieldnames — это просто строка с разделителями-запятыми, вы можете использовать поиск строк и списков, чтобы найти эти значения. Вместо contains вы также можете использовать find(), findnocase() или listValueCount(), чтобы сделать то же самое. - person Bryan Kaiser; 07.10.2009

Чтобы получить исходные формы Form.Update и Form.Delete с изображением на кнопке, попробуйте следующее:

<form action="somewhere" method="post">
    <button type="submit" name="Update"><img src="update.btn.png" alt="Update"/></button>
    <button type="submit" name="Delete"><img src="delete.btn.png" alt="Delete"/></button>
</form>


Затем вам понадобится CSS, чтобы удалить стиль кнопки по умолчанию, чтобы вы получали только изображение, например:

form button
{
    margin       : 0;
    padding      : 0;
    border-width : 0;
    background   : none;
    cursor       : pointer;
}


И убедитесь, что у вас есть все это с действительным DOCTYPE в самом начале вашего контента, чтобы предотвратить режим причуд. Обычно я добавляю сброс, чтобы убедиться, что это первое, что нужно сделать:

<cfcontent reset/><!DOCTYPE html>
person Peter Boughton    schedule 29.09.2009
comment
Это отличное начало, хотя IE не использует указатель курсора при наведении курсора на изображение, и включение курсора: указатель в кнопку: наведение, похоже, тоже не работает. Кроме того, в IE изображение центрируется по объему текста, необходимого для указания на изображение. хммм.... - person Phillip Senn; 29.09.2009
comment
IIRC, вы можете использовать курсор CSS: рука; курсор: указатель, чтобы указать ... хм ... курсор руки / указателя. Он работает нормально в FF3 и должен работать в IE. Я не знаю навскидку о Safari или других браузерах. - person Ben Doom; 29.09.2009
comment
Просто сделайте курсор: указатель для кнопки - поскольку курсор отображается только при: наведении, это не имеет значения. (Не уверен насчет IE8, но в более ранних версиях :hover работает только с тегами A.) Не знаете, что вы имеете в виду под центрированием текста? Убедитесь, что у вас есть действительный DOCTYPE, если вы хотите иметь шанс на правильное поведение (особенно в IE). - person Peter Boughton; 29.09.2009
comment
Бен, курсор: указатель — это способ W3C, который работает во всех современных браузерах, а также в IE6 и выше. - person Peter Boughton; 29.09.2009
comment
Спасибо, что сообщили мне, Питер. - person Ben Doom; 29.09.2009

Другой вариант — присвоить кнопке изображения другое имя и просто добавить скрытое поле с именем «Обновить», чтобы проверить его значение. Я понимаю, что это может не работать в некоторых особых ситуациях, когда вам нужно проверить, нажата ли конкретная кнопка, но это быстрое решение без необходимости делать что-то необычное для вашего изображения.

person Dan Short    schedule 29.09.2009
comment
Это обычно то, что я делал в прошлом. Можно также использовать скрытый элемент формы и обновлять его значение при нажатии определенной кнопки изображения. - person ale; 29.09.2009
comment
Требует ли ваше решение для обновления его значения при нажатии определенной кнопки изображения некоторого JavaScript? - person Phillip Senn; 29.09.2009
comment
Да, потребуется некоторый JavaScript. - person ale; 01.10.2009