Railsでjavascriptが有効になっているかどうかを確認するにはどうすればよいですか? ビューで次のようなことができるように:
<div>
<% if javascript_enabled? %>
<p>Javascript Enabled!</p>
<%- else -%>
<p>No Javascript</p>
<%- end -%>
</div>
Railsでjavascriptが有効になっているかどうかを確認するにはどうすればよいですか? ビューで次のようなことができるように:
<div>
<% if javascript_enabled? %>
<p>Javascript Enabled!</p>
<%- else -%>
<p>No Javascript</p>
<%- end -%>
</div>
検出できますが、きれいではありません。
まず、セッションのタイムアウトを更新するアクションを備えた新しいコントローラーが必要です。
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
れます。
ユーザーが 10 秒の精度で JavaScript をアクティブ化/非アクティブ化した場合でも機能するはずです。一部のページの読み込みに 10 ページ以上かかる場合 (つまり、画像が多い場合) は機能しない可能性があります。その場合の制限時間を増やします(アプリケーションコントローラーとJavaScriptで)
免責事項: 私はこのコードをテストしていません。いくつかのバグが潜んでいる可能性がありますが、正しい方向を示しているはずです。
それだけのことをしたい場合は、非 JS バージョンをビューに配置するのが最善かもしれません:
<p class="replace_by_js">No Javascript</p>
そしてそれをJavascriptに置き換えます:(私はjQueryを使用しています)
$('p.replace_by_js').replaceWith("<p>Javascript Enabled!</p>")
このアプローチは、追加したい実質的にすべてのプログレッシブ エンハンスメントに使用できるはずです。
これは、応答のレンダリング中は不可能です。信頼性が低いか高いかを判断する唯一の方法は、クライアントが前の要求の1つで事前にajaxical要求を送信できるようにすることです。次に、このajaxicalリクエストは、クライアントがajaxicalリクエストを事前に送信したことを識別するトークンをサーバー側セッションに設定する必要があります(これにより、クライアントでJSが有効になっていることが証明されます)。ただし、セッション中にクライアントがJSを無効にできる可能性はありません。または、すべての応答の後にタイムスタンプとajaxicalリクエストを収集するのに手間をかける必要があります。本当にやりたいことではありません。
むしろ、両方のコンテンツをレンダリングし、<noscript>
タグを使用してどちら<script>
かを切り替えます。いくつかの例については、ここで私の答えも参照してください:の反対<noscript>
。
サーバー側では検出できません。実際、ページに初めてアクセスしたときにスクリプトがオフになっている可能性があります。その後、ブラウザの設定が変更され、新しい 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>
このようなハックを行うこともできますが、「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 が有効になっている場合はオンロード リダイレクトが機能し、そうでない場合はヘッダー メタ タグが機能します。秘訣は、メタ タグ リダイレクトに 1 ~ 2 秒の遅延を設定することです。これにより、JavaScript リダイレクトがリダイレクトされない場合、メタ タグがリダイレクトされ、JavaScript が有効になっていないことが示されます。