使用Rails检查Javascript是否已启用(Serverside)

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)

kik*_*ito 6

你可以检测它,但它不漂亮.

首先,您需要一个具有更新会话超时的操作的新控制器:

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)

此方法几乎可用于您要添加的任何渐进增强.