7

你将如何检查是否在 Rails 中启用了 javascript?这样我就可以在视图中做这样的事情:

<div>
    <% if javascript_enabled? %>
    <p>Javascript Enabled!</p>
    <%- else -%>
    <p>No Javascript</p>
    <%- end -%>
</div>
4

7 回答 7

6

你可以检测到它,但它并不漂亮。

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

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 个页面(即包含大量图像),它可能无法正常工作。在这种情况下增加时间限制(在 applicationcontroller 和您的 javascript 上)

免责声明:我没有测试过这段代码,一些错误可能潜伏着——但它应该为你指明正确的方向。

于 2010-02-23T08:48:15.723 回答
5

如果这就是您想要做的全部,最好将非 JS 版本放在视图中:

<p class="replace_by_js">No Javascript</p>

然后让Javascript替换它:(我使用jQuery)

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

这种方法应该可用于您想要添加的几乎任何渐进式增强。

于 2011-12-08T01:10:43.693 回答
2

无需编写大量代码来检查您的 javascript 是否启用,您可以在页面布局中简单地编写为(使用 HAML)-

%p.javascript_require
  No javascript, please enable JavaScript

并使用 hide() 函数让您的 javascript 隐藏此段落 -

$(".javascript_require").hide();

如果禁用 javascript,请执行您想要执行的任何功能。

于 2013-06-20T10:39:49.930 回答
1

在呈现响应期间这是不可能的。确定更不可靠或更可靠的唯一方法是让客户端在先前的请求之一中预先发送一个ajaxical请求。然后,这个 ajaxical 请求应该在服务器端会话中设置一些令牌,该令牌标识客户端事先发送了一个 ajaxical 请求(从而证明客户端启用了 JS)。但这并不包括客户端可以在会话期间同时禁用 JS 的可能性。或者您必须在每次响应后收集时间戳和 ajaxical 请求。不是你真正想做的事情。

而是渲染两个内容并使用<noscript>and<script>标签来切换一个或另一个。另请参阅我的回答以获取几个示例:<noscript>.

于 2010-02-23T01:58:32.223 回答
1

您无法在服务器端检测到它。实际上,第一次访问您的页面时可能会关闭脚本,然后浏览器设置更改并重新导航,而无需发出新的 HTTP 请求。更不用说各种缓存问题和脚本可能在技术上“启用”但由于冲突、错误或“安全”工具阻碍而无法工作的地方。

因此,您需要在客户端为 with-script/without-script 的内容做出所有决定。如今,首选的方法通常是“渐进式增强”:在页面上包含基本的 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>
于 2010-02-23T02:21:15.447 回答
0

你可以做一些像这样的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? %>
于 2010-02-23T02:08:53.927 回答
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。

于 2010-10-18T15:46:21.083 回答