使用Rails检查服务器端是否启用了Javascript

7
你如何在Rails中检查javascript是否启用?这样我就可以在视图中执行以下操作:
<div>
    <% if javascript_enabled? %>
    <p>Javascript Enabled!</p>
    <%- else -%>
    <p>No Javascript</p>
    <%- end -%>
</div>

3
您的意思是您的服务器能否运行JavaScript吗?如果不能,那么您就无法实现。 - shinkou
你不能在服务器端处理,但这里有一个简单的Rails解决方案:Ruby on Rails javascript detection - Yarin
7个回答

6
你可以检测它,但这并不美观。
首先,你需要一个新的控制器,其中包含一个操作,用于更新会话中的超时时间:
class JavascriptController < ApplicationController
  def confirm
    session[:javascript_updated] = Time.now
  end
end

下一步,您需要在所有页面中包含一个javascript操作,以便在每次页面加载时调用此控制器操作。最简单的方法是在布局中包含一个名为“javascript-confirm.js”的文件(在这个特定的示例中,我使用了Prototype的Ajax.Request,因此您还需要将其包含在您的javascripts中):
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秒(例如大量图片),则可能无法正常工作。在这种情况下,请增加时间限制(在applicationcontroller和您的JavaScript中)。
免责声明:我没有测试过这段代码,可能存在一些错误 - 但它应该指引您走向正确的方向。

5
如果您只希望它执行这个任务,最好将非JS版本放在视图中:
<p class="replace_by_js">No Javascript</p>

然后使用Javascript进行替换:(我使用jQuery)

$('p.replace_by_js').replaceWith("<p>Javascript Enabled!</p>")

这种方法适用于几乎任何你想要添加的渐进增强功能。

2

不需要编写大量的代码来检查您的javascript是否启用,您只需在页面布局中简单地编写如下内容(使用HAML)-

%p.javascript_require
  No javascript, please enable JavaScript

并且使用hide()函数使您的JavaScript隐藏这个段落,如下所示 -
$(".javascript_require").hide();

如果JavaScript被禁用,可以执行任何所需的功能。


1

你无法在服务器端检测它。实际上,在第一次访问页面时,脚本可能已被关闭,然后浏览器设置更改并重新导航,而不需要进行新的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>

1

在响应渲染期间不可能实现。找到更可靠或不可靠的唯一方法是让客户端在之前的一个请求中发送ajax请求。然后,这个ajax请求应该在服务器端会话中设置一些令牌,用于标识客户端之前发送了ajax请求(从而证明客户端启用了JS)。但这并不能覆盖客户端在会话期间可能禁用JS的可能性。或者你必须麻烦地收集时间戳和每个响应后的ajax请求。这不是你想做的事情。

相反,渲染两个内容并利用<noscript><script>标签来切换其中一个或另一个。此外,还可以参见我的答案,其中包含几个示例:<noscript>相反


0
你可以像这样做一些 hacky 的事情,但是你的“启用 JavaScript”的 HTML 需要在 helper 中生成。
将此放入您的 application_helper.rb 文件中。
def javascript_enabled?
  content_tag(:div, [
    content_tag(:script, 'document.write("Javascript Enabled")'), 
    content_tag(:noscript, 'No Javascript')
  ])
end

以下内容放在你的视图中:

<%= javascript_enabled? %>

0

无法从服务器端检查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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接