2010-02-23 45 views
5

如何檢查在Rails中是否啓用了javascript?這樣我就可以做這樣的事情的看法:檢查Javascript是否已啓用(Serverside)with Rails

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

你是說如果你的服務器可以運行Javascript?如果沒有,你根本不能。 – shinkou 2010-02-23 01:58:25

+0

你不能服務器端,但這裏有一個簡單的Rails解決方案:Ruby on Rails的JavaScript的檢測(http://stackoverflow.com/questions/745613/ruby-on-rails-javascript-detection) – Yarin 2013-10-24 16:39:44

回答

5

你可以檢測到它,但它不是漂亮。

首先,你需要一個新的控制器與更新超時在會話的操作:

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)

聲明:我沒有測試此代碼,一些錯誤可能潛伏 - 但它應該指向你在正確的方向。

0

即呈現響應的過程是不可能的。要想得到更少或更可靠的唯一方法是讓客戶端事先發送一個Ajax請求。然後,這個Ajax請求應該在服務器端會話中設置一些令牌,標識客戶端事先發送了一個Ajax請求(這證明客戶端已經啓用了JS)。但是這並不包括客戶在會話期間可以禁用JS的可能性。或者你必須在每次迴應後收集時間戳和麻煩的要求。不是你想做的事。

而是渲染這兩個內容,並利用<noscript><script>標籤來切換這一個或其他。另請參閱我的答案,這裏有幾個例子:opposite of <noscript>

0

你可以做一些事情有點哈克這樣,但你的「已啓用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? %> 
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> 
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重定向會的工作,如果沒有則標題meta標籤會工作。 訣竅是在元標記重定向上放置1-2秒的延遲,因此如果JavaScript重定向不會重定向,則元標記將會指示未啓用JavaScript。

+0

代碼不可見。 – sscirrus 2011-03-08 00:21:26

+0

已編輯使代碼可見。 – jrdioko 2011-06-27 21:35:03

5

如果這是你想要它做的一切,它可能是最好把非JS版視圖:

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

,然後有JavaScript的替換:(我使用jQuery)

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

這種方法應該適用於您想添加的幾乎任何漸進增強。

2

不必編寫大量的代碼來檢查你的JavaScript是否被啓用與否,你可以簡單地寫在你的頁面佈局 -

%p.javascript_require 
    No javascript, please enable JavaScript 

(使用HAML),讓你的JavaScript隱藏使用隱藏本段()函數爲 -

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

當禁用javascript時,執行任何要執行的功能。

相關問題