2013-11-07 5 views
6

Вот часть моей формы:Форма «onsubmit» не вызывался

<form name='form-main' onsubmit='return validate()' action='' method='post'> 
    <center><input type='submit' onClick='this.disabled=true; this.form.submit();' value='I accept - Download the GM!'/></center> 
</form> 

и вот validate функция:

function validate() 
{ 
    // this is just to test if it actually shows 
    alert('You must not leave any of the fields blank!'); 
    return false; 
} 

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

+0

если вы хотите отправить форму возвращающие. – cocco

+0

Вам следует попытаться проверить формы не на стороне клиента, так как пользователь может легко изменить код. Кроме того, проверьте jQuery, он имеет очень хорошую обработку формы и упростит вашу работу, когда у вас будут большие и более сложные входы. [Здесь] (http://jqueryvalidation.org/) ссылка на полезный плагин. Удачи! – Carpetfizz

+0

Также примечание,

действительно старое, и вместо этого вы должны использовать CSS. HTML предназначен для контента, CSS - для макета. –

ответ

19

Когда вы звоните в форму submit, событие submit не запускается. Это по дизайну, предполагается, что если вы запускаете представление из кода, вы уже сделали необходимую проверку. (Обратите внимание, что это относится к функции HTMLFormElement#submit, это не обязательно верно для бандеролей библиотек положить вокруг него.)

В вашем примере, я бы удалить click обработчик на кнопку. Это кнопка отправки, поэтому просто поставьте любую соответствующую логику в событии submit на форме. В качестве альтернативы, если хотите, позвоните по номеру validate() в качестве части click.

+0

По-прежнему не получается диалог. Теперь это моя форма: '

'. И это кнопка: ' '. Также попробовал 'return validate();' – user1667191

+1

@ user1667191: Функция 'validate' должна быть глобальной, которая будет использоваться со старомодными атрибутами DOM0' onXYZ'. Если это так, это сработает. Пример: http://jsbin.com/ePUgAyo/1 [источник] (http://jsbin.com/ePUgAyo/1/edit). Но опять же: не помещайте это на кнопку. Поместите его в форму. Это лучшее место.(И вам понадобится 'return', и если вы хотите, чтобы форма была отправлена ​​на основе условия,' 'validate' return' false'.) –

+1

@ user1667191: Или еще лучше использовать современный обработчик событий, addEventListener' (или 'attachEvent' в старых версиях IE). –

2

Событие onclick вашей кнопки отправки запускается непосредственно перед событием onsubmit вашей формы, и это отключает последующие события от распространения и обжига, что приводит к тому, что функция validate никогда не запускается. Вы можете видеть, что вы удаляете this.disabled=true; из своего примера кода.

согласно docs at W3:

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

Вы должны удалить код события click из кнопки отправки и просто позволить функции делать то, что вам нужно, в том числе отключить эту кнопку. Например:

function validate() { 
    // this is just to test if it actually shows 
    document.getElementById('sub').disabled=true; 
    alert('You must not leave any of the fields blank!'); 
    return false; 
} 

jsFiddle example

+0

Спасибо, например, для использования этого метода, чтобы отключить кнопку. – user1667191

7

Вы можете изменить оригинальный прототип "представить" метод как это:

HTMLFormElement.prototype._submit = HTMLFormElement.prototype.submit; 

HTMLFormElement.prototype.submit = function(){ 
    this._submit(); 
    alert('Deddy Is Great :)'); // or fire the onsubmit event manually 
}; 
+0

Ваш ответ очень хороший и заслуживает того, чтобы его голосовали. Я попробовал, и это сработало без каких-либо проблем. – Sunil

+0

Согласовано. Это отличное решение. – JRQ

Смежные вопросы