form action with javascript

Absolutely valid.

    <form action="javascript:alert('Hello there, I am being submitted');">
        <button type="submit">
            Let's do it
        </button>
    </form>
    <!-- Tested in Firefox, Chrome, Edge and Safari -->

So for a short answer: yes, this is an option, and a nice one. It says “when submitted, please don’t go anywhere, just run this script” – quite to the point.

A minor improvement

To let the event handler know which form we’re dealing with, it would seem an obvious way to pass on the sender object:

    <form action="javascript:myFunction(this)">  <!-- should work, but it won't -->

But instead of what would make sense, this will point to the Window object. Apparently javascript: links live in a separate scope. Therefore I’d suggest the following format, it’s only 13 characters more and works like a charm:

    <form action="javascript:;" onsubmit="myFunction(this)">  <!-- now you have it! -->

… now you can access the sender form properly. (You can write a simple “#” as action, it’s quite common – but it has a side effect of scrolling to the top when submitting.)

Again, I like this approach because it’s effortless and self-explaining. No “return false”, no jQuery/domReady, no heavy weapons. It just does what it seems to do. Surely other methods work too, but for me, this is The Way Of The Samurai.

A note on validation

Forms only get submitted if their onsubmit event handler returns something truthy, so you can easily run some preemptive checks:

    <form action="/something.php" onsubmit="return isMyFormValid(this)">

Now isMyFormValid will run first, and if it returns false, server won’t even be bothered. Needless to say, you will have to validate on server side too, and that’s the more important one. But for quick and convenient early detection this is fine.

Leave a Comment