Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > JavaScript, DOM/DHTML > Какую кнопку нажали?


Автор: salaga 10.09.04, 15:54
Ситуация следующая:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form ... onSubmit="return validate(this);">
    ...
    <input name="Create" type="submit" value="Создать">
    <input name="Delete" type="submit" value="Удалить">
    </form>

Так вот, как в функции validate определить какую кнопку нажали? <_<

Автор: Trustmaster 10.09.04, 16:11
:no: Неправильный подход к решению вопроса. Лучше создать кнопки button с разными обработчиками, и в них form.submit() вызвать автоматически:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form name="the_form" ...>
    <input type="button" name="create" value="Создать" onClick="create()">
    <input type="button" name="delete" value="Удалить" onClick="delete()">
    </form>

Так что выкладывай задачу (и код ф-и validate) полностью, для получения конечного результата ;)

Автор: Rom@nych 10.09.04, 16:34
Trustmaster, а так?
Вариант #1.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form ... onSubmit="return validate(this, btn);">
    <script>var btn;</script>
    ...
    <input name="Create" type="submit" value="Создать" onclick="btn = 'create'" />
    <input name="Delete" type="submit" value="Удалить" onclick="btn = 'delate'" />
     
    </form>

В итоге передастся вторым параметром обзЫвание кнопки.

Вариант #2
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form ... onSubmit="return validate(this, document.getElementById('btn').value);">
    <input type="hidden" name="btn" value="" id="btn" />
    ...
    <input name="Create" type="submit" value="Создать" onclick="document.getElementById('btn').value = 'create'" />
    <input name="Delete" type="submit" value="Удалить" onclick="document.getElementById('btn').value = 'delete'" />
     
    </form>

Результат в принципе тот-же, но и скрипту передасться "кличка" кнопки.

Автор: Trustmaster 10.09.04, 16:39
Ну тогда уж
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form ... onSubmit="return validate(this);">
    ...
    <input name="Create" type="submit" value="Создать" onclick="var btn = 'create';" />
    <input name="Delete" type="submit" value="Удалить" onclick="var btn = 'delate';" />
    ...
    </form>

btn объявлена в глобально области видимости и видна из validate().

Автор: Rom@nych 10.09.04, 16:50
Trustmaster, чужой код надо читать внимательно >:(
Смотри вариант №1, строка №2
А глобальные переменные в функциях нелюблю использовать :no:

Автор: Trustmaster 10.09.04, 16:53
:offtop: Читал внимательно :) Просто так, имхо, короче. А вообще, тут от предпочтения salaga'и зависит, и от того, какую задачу эта функция решает. Мне интуиция подсказывает, что неправильным путем пошли товарищи :)

Автор: salaga 11.09.04, 10:29
Спасибо, за совет. Я наверное, не так попросил :unsure:
Есть ли какое-нибудь свойство, например - у кнопки-submit, указывающее на нажатие. По идее, отправляемые данные формы содержат запись вида "Create"=>"Создать", если нажата кнопка Create: можно посмотреть там. Но вот где они хранятся?
Цитата
Trustmaster, 10.09.04, 19:11
Так что выкладывай задачу (и код ф-и validate) полностью, для получения конечного результата

Суть в том, чтобы данные отправленные формой содержали запись о кнопке и чтобы ф-ия validate спросила: "А надо-ли?" :) Отправляю post'ом.

Автор: Trustmaster 11.09.04, 10:49
То есть о названии кнопки нужно сообщить скрипту?

Чтобы validate спросила, надо ли отправить форму, делаем так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <script>function validate(obj) {
    // ...
    return confirm('Надо ли отправлять форму?');
    }</script>
     
    <form ... onSubmit="return validate(this);">
    ...
    <input name="Create" type="submit" value="Создать">
    <input name="Delete" type="submit" value="Удалить">
    </form>

А вот насчет передачи name кнопки submit я не уверен. На каком языке скрипт-обработчик?

Автор: salaga 11.09.04, 10:53
На PHP. Но ведь не принципиально на чем обработчик, главное то, что передалось, сами данные. Т.е. все определяется на стороне клиента. Интересно как отправляет данные форма?
Кстати, спасибо, что стараешься помочь.

Автор: Trustmaster 11.09.04, 11:07
Как отправляет данные форма? Сначала вебсерверу, а тот - скрипту через стандартный поток ввода (это методом POST). При этом аттрибуты name становятся именем переменной, а значение поля - значением переменной. На сколько мне известно, поля типа submit не отправляются, поэтому чтобы узнать, с какой же кнопки форму послали, функции validate придется задать значение hidden поля:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <script>function validate(obj, btn) {
    // ...
    document.forms['the_form'].item('submit_btn').value = btn;
    if(confirm('Надо ли отправлять форму?')) {
    document.forms['the_form'].submit();
    }
    }</script>
     
    <form name="the_form" ...>
    ...
    <input type="hidden" name="submit_btn" value="" />
    <input name="Create" type="submit" value="Создать" onclick="validate(this, 'create')" />
    <input name="Delete" type="submit" value="Удалить" onclick="validate(this, 'delete')" />
    ...
    </form>


PHP-скрипт получит переменную $_POST['submit_btn'] (и $submit_btn при register_globals = On), содержащую имя кнопки.

Автор: salaga 11.09.04, 11:29
Цитата
Trustmaster, 11.09.04, 14:07
На сколько мне известно, поля типа submit не отправляются

Еще как оптравляются :) Слушай:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form method="post">
    <input type="submit" name="Create" value="Создать">
    <input type="submit" name="Delete" value="Удалить">
    </form>

Обработчик:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    print_r($_POST);

Вывод:
Array
{
[Create] => Создать
}
Отправилась только нажатая кнопка. Ничего не передастся, если в onClick вставить self.submit();
Мне не нравится вводить новые переменные, если есть старые. Где то же записывается, что отправит форма вебсерверу? Т.е. записывается, что будет отправлен "Create" или не будет.

Автор: Trustmaster 11.09.04, 14:04
Научись задавать вопросы по-нормальному, OK? А то первые несколько минут приходится въезжать, что же такое ты спрашиваешь.

Насколько я понял, на этот раз ты хочешь, чтобы за все отвечала одна переменная? Нет проблем:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <form method="post">
    <input type="submit" name="submit_action" value="Создать">
    <input type="submit" name="submit_action" value="Удалить">
    </form>


А если тебе надо узнать, что одна кнопка была нажата, а другая нет, то тут уж submit точно не подойдет. Тогда в любом случае придется воспользоваться button + javascript:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <script>function validate(obj, btn) {
    // ...
    if(btn == 'create')
      document.forms['the_form'].item('Create').value = 'Yes';
    else
      document.forms['the_form'].item('Delete').value = 'Yes';
    if(confirm('Надо ли отправлять форму?')) {
    document.forms['the_form'].submit();
    }
    }</script>
     
    <form name="the_form" ...>
    ...
    <input type="hidden" name="Create" value="No" />
    <input type="hidden" name="Delete" value="No" />
    <input type="submit" value="Создать" onclick="validate(this, 'create')" />
    <input type="submit" value="Удалить" onclick="validate(this, 'delete')" />
    ...
    </form>

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)