<div>
<% if javascript_enabled? %>
<p>Javascript Enabled!</p>
<%- else -%>
<p>No Javascript</p>
<%- end -%>
</div>
<div>
<% if javascript_enabled? %>
<p>Javascript Enabled!</p>
<%- else -%>
<p>No Javascript</p>
<%- end -%>
</div>
class JavascriptController < ApplicationController
def confirm
session[:javascript_updated] = Time.now
end
end
function confirmJavascript()
{
// Assuming you are using Prototype
new Ajax.Request('/JavascriptController/confirm');
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds
这将在您的所有页面视图中调用确认操作。最后,您需要在应用程序控制器中控制自上次确认以来经过了多少时间。
class ApplicationController < ActionController::Base
JAVASCRIPT_TIME_LIMIT = 10.seconds
before_filter :prepare_javascript_test
private
def prepare_javascript_test
if (session[:javascript_updated].blank? or
Time.now - session[:javascript_updated] > ApplicationController::JAVASCRIPT_TIME_LIMIT)
@javascript_active = true
else
@javascript_active = false
end
end
end
@javascript_active
的变量。<p class="replace_by_js">No Javascript</p>
然后使用Javascript进行替换:(我使用jQuery)
$('p.replace_by_js').replaceWith("<p>Javascript Enabled!</p>")
不需要编写大量的代码来检查您的javascript是否启用,您只需在页面布局中简单地编写如下内容(使用HAML)-
%p.javascript_require
No javascript, please enable JavaScript
$(".javascript_require").hide();
如果JavaScript被禁用,可以执行任何所需的功能。
你无法在服务器端检测它。实际上,在第一次访问页面时,脚本可能已被关闭,然后浏览器设置更改并重新导航,而不需要进行新的HTTP请求。更不用说各种缓存问题和脚本可能因冲突、错误或“安全”工具的干扰而在技术上“启用”但无法正常工作的地方了。
所以,你需要在客户端做所有有关带脚本/不带脚本的内容决策。如今,首选方法通常是“渐进增强”:在页面上包含基本的HTML版本,然后使用JavaScript在可以的情况下替换/升级它:
<div id="isitjs">
<p>Backup content for no JavaScript</p>
</div>
<script type="text/javascript">
document.getElementById('isitjs').innerHTML= '<p>Sparkly script-enhanced content!<\/p>';
// or DOM methods, as you prefer
</script>
在响应渲染期间不可能实现。找到更可靠或不可靠的唯一方法是让客户端在之前的一个请求中发送ajax请求。然后,这个ajax请求应该在服务器端会话中设置一些令牌,用于标识客户端之前发送了ajax请求(从而证明客户端启用了JS)。但这并不能覆盖客户端在会话期间可能禁用JS的可能性。或者你必须麻烦地收集时间戳和每个响应后的ajax请求。这不是你想做的事情。
相反,渲染两个内容并利用<noscript>
和<script>
标签来切换其中一个或另一个。此外,还可以参见我的答案,其中包含几个示例:与<noscript>
相反。
def javascript_enabled?
content_tag(:div, [
content_tag(:script, 'document.write("Javascript Enabled")'),
content_tag(:noscript, 'No Javascript')
])
end
以下内容放在你的视图中:
<%= javascript_enabled? %>
无法从服务器端检查Javascript是否启用,但是您可以在站点之前设置一个页面,并使用参数将其重定向到您的应用程序,以指示Javascript是否已启用。请参见以下示例代码:
<html>
<head>
<meta HTTP-EQUIV="REFRESH" content="2; url=./Login.action?javascriptEnabled=false">
<link rel="icon" href="favicon.ico" type="image/x-icon"/>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
<title></title>
</head>
<body onload="window.location.href='./Login.action?javascriptEnabled=true'" ></body>
</html>
所以,如果JavaScript启用,则 onload 重定向将起作用,否则标头元标记将起作用。 技巧是在元标记重定向上放置1-2秒的延迟,因此,如果JavaScript重定向未重定向,则元标记将指示未启用JavaScript。