Lan*_*ard 7 javascript ruby-on-rails erb server-side noscript
你如何检查Rails中是否启用了javascript?所以我可以在视图中做这样的事情:
<div>
<% if javascript_enabled? %>
<p>Javascript Enabled!</p>
<%- else -%>
<p>No Javascript</p>
<%- end -%>
</div>
Run Code Online (Sandbox Code Playgroud)
你可以检测它,但它不漂亮.
首先,您需要一个具有更新会话超时的操作的新控制器:
class JavascriptController < ApplicationController
def confirm
session[:javascript_updated] = Time.now
end
end
Run Code Online (Sandbox Code Playgroud)
接下来,您需要在所有页面中包含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
Run Code Online (Sandbox Code Playgroud)
这将在所有页面视图中调用确认操作.最后,您必须控制自应用控制器上次确认以来经过的时间.
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
Run Code Online (Sandbox Code Playgroud)
现在,您将@javascript_active在所有控制器中调用一个变量.
即使用户激活/停用javascript,它也应该工作,精度为10秒.如果您的某些页面加载时间超过10页(即有大量图像),则可能无效.在这种情况下增加时间限制(在applicationcontroller和你的javascript上)
免责声明:我没有测试过这段代码,有些漏洞可能潜伏着 - 但它应该指向正确的方向.
小智 5
如果这就是你想要它做的全部,那么最好将非JS版本放在视图中:
<p class="replace_by_js">No Javascript</p>
Run Code Online (Sandbox Code Playgroud)
然后让Javascript替换为:(我使用jQuery)
$('p.replace_by_js').replaceWith("<p>Javascript Enabled!</p>")
Run Code Online (Sandbox Code Playgroud)
此方法几乎可用于您要添加的任何渐进增强.