你可以检测到它,但它并不漂亮。
首先,您需要一个新控制器,其操作可更新会话中的超时:
class JavascriptController < ApplicationController
def confirm
session[:javascript_updated] = Time.now
end
end
接下来,您需要在所有页面中包含一个 javascript 操作,以便在每次页面加载时调用此控制器操作。最简单的方法是将其包含在布局中包含的“javascript-confirm.js”文件中(在这个特定示例中,我使用了 Prototype 的 Ajax.Request,因此您也需要将其包含在您的 javascript 中):
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
的变量。
即使用户激活/停用 javascript,它也应该工作,精度为 10 秒。如果您的某些页面加载时间超过 10 页(即包含大量图像),它可能不起作用。在这种情况下增加时间限制(在应用程序控制器和您的 JavaScript 上)
免责声明:我还没有测试过这段代码,可能潜伏着一些错误 - 但它应该为您指明正确的方向。
如果这就是你想要的全部,最好将非 JS 版本放在视图中:
<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 使用 hide() 函数隐藏该段落 -
$(".javascript_require").hide();
当 javascript 被禁用时,执行您想要执行的任何功能。
在渲染响应期间这是不可能的。确定可靠性较低或较高的唯一方法是让客户端在之前的请求之一中预先发送 ajaxical 请求。然后,这个ajaxal请求应该在服务器端会话中设置一些令牌,该令牌标识客户端已经事先发送了ajaxal请求(从而证明客户端启用了JS)。但这并没有涵盖客户端可以在会话期间同时禁用 JS 的可能性。或者您必须在每次响应后收集时间戳和 ajaxical 请求。这并不是您真正想做的事情。
而是渲染这两种内容并使用
<noscript>
和 <script>
标签来切换其中一个或另一个。另请参阅我的回答,了解几个示例:与<noscript>
相反。
您无法在服务器端检测到它。事实上,第一次访问页面时脚本可能会被关闭,然后浏览器设置发生更改并重新导航,而无需发出新的 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>
你可以做一些像这样的hacky,但是你的“启用javascript”的html需要在助手中生成
将其放入您的 application_helper.rb 中
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。
代码少了一点(只有 1 行,只有 1 个文件),但与 Peter 的响应类似 - 将其添加到您的 layouts/application.html.haml 中:
%script document.write("JavaScript已启用")