Форма onSubmit определяет, какая кнопка отправки была нажата

У меня есть форма с двумя кнопками отправки и немного кода:

HTML:

<input type="submit" name="save" value="Save" />
<input type="submit" name="saveAndAdd" value="Save and add another" />

JavaScript:

form.onSubmit = function(evnt) {
    // Do some asyncrhnous stuff, that will later on submit the form
    return false;
}

Конечно, две кнопки отправки выполняют разные вещи. Есть ли способ узнать в onSubmit какая кнопка была нажата, чтобы потом я мог отправить, выполнив thatButton.click()?

В идеале я не хотел бы изменять код для кнопок, просто иметь чистый аддон JavaScript, который имеет такое поведение.

Я знаю, что Firefox имеет evnt.explicitOriginalTarget, но я не могу найти ничего для других браузеров.

Ответ 1

Нет в самом обработчике событий отправки, нет.

Но то, что вы можете сделать, это добавить обработчики кликов к каждому элементу, который будет информировать обработчик отправки о том, что было нажато.

Здесь полный пример (с использованием jQuery для краткости)

<html>
<head>
  <title>Test Page</title>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script type="text/javascript">

  jQuery(function($) {
      var submitActor = null;
      var $form = $('#test');
      var $submitActors = $form.find('input[type=submit]');

      $form.submit(function(event) {
          if (null === submitActor) {
              // If no actor is explicitly clicked, the browser will
              // automatically choose the first in source-order
              // so we do the same here
              submitActor = $submitActors[0];
          }

          console.log(submitActor.name);
          // alert(submitActor.name);

          return false;
      });

      $submitActors.click(function(event) {
          submitActor = this;
      });
  });

  </script>
</head>

<body>

  <form id="test">

    <input type="text" />

    <input type="submit" name="save" value="Save" />
    <input type="submit" name="saveAndAdd" value="Save and add another" />

  </form>

</body>
</html>

Ответ 2

<form onsubmit="alert(this.submited); return false;">
    <input onclick="this.form.submited=this.value;" type="submit" value="Yes" />
    <input onclick="this.form.submited=this.value;" type="submit" value="No" />
</form>

jsfiddle для того же

Ответ 3

Все приведенные выше ответы очень хороши, но я немного почистил его.

Это решение автоматически помещает имя кнопки отправки в скрытое поле действия. Как javascript на странице, так и код сервера могут проверять значение скрытого поля действия по мере необходимости.

В решении используется jquery для автоматического применения ко всем кнопкам отправки.

<input type="hidden" name="action" id="action" />
<script language="javascript" type="text/javascript">
    $(document).ready(function () {
        //when a submit button is clicked, put its name into the action hidden field
        $(":submit").click(function () { $("#action").val(this.name); });
    });
</script>
<input type="submit" class="bttn" value="<< Back" name="back" />
<input type="submit" class="bttn" value="Finish" name="finish" />
<input type="submit" class="bttn" value="Save" name="save" />
<input type="submit" class="bttn" value="Next >>" name="next" />
<input type="submit" class="bttn" value="Delete" name="delete" />
<input type="button" class="bttn" name="cancel" value="Cancel" onclick="window.close();" />

Затем напишите код, как это, в обработчик отправки формы.

 if ($("#action").val() == "delete") {
     return confirm("Are you sure you want to delete the selected item?");
 }

Ответ 4

Голые кости, но подтвержденные рабочие, например:

<script type="text/javascript">
var clicked;
function mysubmit() {
    alert(clicked);
}
</script>
<form action="" onsubmit="mysubmit();return false">
    <input type="submit" onclick="clicked='Save'" value="Save" />
    <input type="submit" onclick="clicked='Add'" value="Add" />
</form>

Ответ 5

Первое предложение:

Создайте переменную Javascript, которая будет ссылаться на нажатую кнопку. Позволяет называть его buttonIndex

<input type="submit" onclick="buttonIndex=0;" name="save" value="Save" />
<input type="submit" onclick="buttonIndex=1;" name="saveAndAdd" value="Save and add another" />

Теперь вы можете получить доступ к этому значению. 0 означает, что нажата кнопка сохранения, 1 означает, что нажата кнопка saveAndAdd.

Второе предложение

Как я бы это сделал, это создать две функции JS, которые обрабатывают каждую из двух кнопок.

Во-первых, убедитесь, что ваша форма имеет действительный идентификатор. В этом примере я скажу, что идентификатор - это "myForm"

изменить

<input type="submit" name="save" value="Save" />
<input type="submit" name="saveAndAdd" value="Save and add another" />

до

<input type="submit" onclick="submitFunc();return(false);" name="save" value="Save" />
<input type="submit" onclick="submitAndAddFunc();return(false);" name="saveAndAdd" value="Save and add 

return (false) предотвратит фактическую обработку вашего представления формы и вызовет ваши пользовательские функции, где вы можете отправить форму позже.

Тогда ваши функции будут работать примерно так:

function submitFunc(){
    // Do some asyncrhnous stuff, that will later on submit the form
    if (okToSubmit) {
        document.getElementById('myForm').submit();
    }
}
function submitAndAddFunc(){
    // Do some asyncrhnous stuff, that will later on submit the form
    if (okToSubmit) {
        document.getElementById('myForm').submit();
    }
}

Ответ 6

OP заявила, что не хочет изменять код для кнопок. Это наименее навязчивый ответ, который я мог бы придумать, используя другие ответы в качестве руководства. Он не требует дополнительных скрытых полей, позволяет оставить код кнопки неповрежденным (иногда у вас нет доступа к тому, что его генерирует), и дает вам информацию, которую вы искали в любом месте вашего кода... какая кнопка был использован для отправки формы. Я не оценил, что произойдет, если пользователь использует клавишу Enter для отправки формы, а не щелчка.

<script language="javascript" type="text/javascript">

    var initiator = '';
    $(document).ready(function() {
        $(":submit").click(function() { initiator = this.name });
    });

</script>

Тогда у вас есть доступ к переменной "инициатор" в любом месте, где может потребоваться проверка. Надеюсь, это поможет.

~ Spanky

Ответ 7

Почему бы не пропустить входы и затем добавить обработчики onclick к каждому?

Вам не нужно делать это в HTML, но вы можете добавить обработчик для каждой кнопки, например:

button.onclick = function(){ DoStuff(this.value); return false; } // return false; so that form does not submit

Тогда ваша функция может "делать вещи" в соответствии с тем, какое значение вы передали:

function DoStuff(val) {
    if( val === "Val 1" ) {
        // Do some stuff
    }
    // Do other stuff
}

Ответ 8

Я использую Ext, поэтому я закончил это:

var theForm = Ext.get("theform");
var inputButtons = Ext.DomQuery.jsSelect('input[type="submit"]', theForm.dom);
var inputButtonPressed = null;
for (var i = 0; i < inputButtons.length; i++) {
    Ext.fly(inputButtons[i]).on('click', function() {
        inputButtonPressed = this;
    }, inputButtons[i]);
}

а затем, когда пришло время отправить, я сделал

if (inputButtonPressed !== null) inputButtonPressed.click();
else theForm.dom.submit();

Подождите, вы говорите. Это произойдет, если вы не будете осторожны. Таким образом, onSubmit иногда должен возвращать true

// Notice I'm not using Ext here, because they can't stop the submit
theForm.dom.onsubmit = function () {
    if (gottaDoSomething) {
        // Do something asynchronous, call the two lines above when done.
        gottaDoSomething = false;
        return false;
    }
    return true;
}