I've been binding submit events to forms, and ensuring that they do not break the form, using jQuery like this:
jQuery('form').submit(function(e){
var form = this;
e.preventDefault();
alert('1');
setTimeout(function() {
alert('2');
form.submit();
}, 1000);
});
This is all good and well, except, if for some reason a front end developer gave a child input of this form an id of ="submit", this breaks, as form.submit()
throws a JavaScript error (In Chrome, 'Uncaught TypeError: Property 'submit' of object # is not a function').
You can see an example of that happening here: http://jsfiddle.net/q68ky/ (Here's the behavior if there's no <input id="submit">
: http://jsfiddle.net/JpXzL/
Now, I know I can prevent this from binding on forms that have children with an id of 'submit' with jQuery('form').not(:has('#submit')).submit()
, and the form will process just fine, but my binding will never fire for those forms.
So, the question: How can I safely bind this jQuery function to all forms, including those with <input id="submit">
?
EDIT: Worth noting that this problem doesn't go away if I unbind the submit handler and then trigger a jQuery submit on jQuery(form)
.
When we click on the link, the function submitForm() will get executed. This function will get the element object using DOM getElementById() method by passing the form id to this method, then the form will be submitted by using submit() method. Example: Create a form and submit it using the above approach.
The form can be submitted without using submit button by implementing a specific event attribute or by clicking the link. This task can be done by using the OnClick event attribute or by using the form. submit() method in Javascript.
Submit a Form Using JavaScript The most simple way to submit a form without the submit button is to trigger the submit event of a form using JavaScript. In the below example we are going to create a function to submit a form. We will set that function at onclick event of a div tag.
The formmethod attribute defines the HTTP method for sending form-data to the action URL. The formmethod attribute overrides the method attribute of the <form> element. The formmethod attribute is only used for buttons with type="submit".
The only way I can think of:
(function () {
var method;
window.submit = function (theForm) {
if (!method) {
method = document.createElement("form").submit;
}
method.call(theForm);
};
}());
Then call submit(theFormYouWantToSubmit)
.
You can see it in action here: http://jsfiddle.net/q68ky/2/
Edit: To provide some explanation as to what this does....
This method creates a new form element (document.createElement("form")
), and stores a reference to the "submit" attribute of it (method = document.createElement("form").submit
). Because this is a newly created form element, with no child nodes, we can guarantee that the "submit" attribute is actually the "submit" method we need, rather than a child node with an id/name of "submit".
We then use the call
method (part of Function.prototype
), which sets the context of the submit
method to the form we want to submit, rather than the window
object, which is what it would otherwise be on.
The rest of the gubbins in the snippet caches the submit
method, so that all of this (albeit small) overhead does not take place every time you want to submit the form, and captures the cached method in a local scope, instead of holding it in the global scope and polluting the global namespace.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With