i'm delegating some application logic client side (javascipt). How can i switch to server side only if javascript is disabled.
eg
if(javascript.isdisabled)
{
//execute server code
}
i'm delegating some application logic client side (javascipt). How can i switch to server side only if javascript is disabled.
eg
if(javascript.isdisabled)
{
//execute server code
}
You do it the other way around. You write HTML that works with server side code, then layer JavaScript over the top that stops the HTTP request that would trigger the server side code.
The specifics depend on exactly what you want to do, but will usually involve calling the Event.preventDefault()
method having bound an event listener.
For example, given a form:
function calc(evt) {
var form = this;
alert(+this.elements.first.value + +this.elements.second.value);
evt.preventDefault()
}
var form = document.querySelector('form');
form.addEventListener('submit', calc);
See also: Progressive Enhancement and Unobtrusive JavaScript
Server code executes first, then is sent client side. And there's no good way to determine server side whether JS is turned on.
So purely: no. You simply don't know if JS is enabled until the point where the server already done serving that request.
Solutions are as follows:
1) Do it manually (not recommended)
As long as this is not happening on the user's first page view, you could determine on the first page view whether or not JS is enabled, and then tell all future requests to the server that information manually. One way to accomplish that would be to have all links have a query var telling the server to execute logic, but after the page loads remove that var via JS (which obviously will only happen if there is JS).
So a link would look like https://blah.com/my-page?serverexecute=1
in the page, then once the page loads JS (if it's enabled) can remove the var so it's just https://blah.com/my-page
. Then the server would only executed your logic if the query var serverexecute
is present and set to 1
.
But this would be very non-standard and, frankly, weird. The more normal way to do this is:
2) Reverse your thinking (recommended)
As said in another answer: progressive enhancement. This is the norm. You serve a page with the expectation that no other scripting be needed (i.e. do what has to be done server side) and then use JS as enhancement on top of that only.
3) Don't cater to non-JS (also recommended, personally anyway)
JS availability is an insanely high percentage. It is considered a norm, and you'd be surprised how many sites don't actually work without it.
Note that I'm not saying "just let it break silently", but rather show a message at the top (or wherever is relevant) saying that the site or part of the site may not function correctly without JS (this can be done via noscript
tags quite easily).
A notable example of this is none other than Facebook. I just tried going to facebook with JS disabled. I wasn't logged in to anything, so I got to the signup page, and above the form it noted:
"JavaScript is disabled on your browser. Please enable JavaScript on your browser or upgrade to a JavaScript-capable browser to register for Facebook."
They didn't even make the effort to stop the form from showing...just, in essence, told me "by the way, it won't work".
Unless there's some very specific requirement that means you absolutely need non-JS (beyond the normal general "let's be accessible" concept) I personally believe there is currently absolutely no reason to spend any effort catering to non-JS users beyond the courtesy of a noscript
letting them know that you're not catering to them.
You could think of redirecting users without javascript to a special page, that includes server-side logic you've mentioned, like so:
<head>
<noscript>
<meta http-equiv="refresh" content="0; url=http://example.com/without-js" />
</noscript>
</head>
The page may be exactly same page featuring query string that will tell server to perform the logic you've mentioned.
Another possible approach to consider is explained in "Detect if JavaScript is enabled in ASPX" article.