2010-02-23 7 views
5

Comment vérifier si javascript est activé dans Rails? Pour que je puisse faire quelque chose comme ça dans les vues:Vérifiez si Javascript est activé (Serverside) avec Rails

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

Voulez-vous dire si votre serveur peut exécuter des Javascripts? Sinon, vous ne pouvez tout simplement pas. – shinkou

+0

Vous ne pouvez pas côté serveur, mais voici une solution Rails simple: [détection javascript Ruby on Rails] (http://stackoverflow.com/questions/745613/ruby-on-rails-javascript-detection) – Yarin

Répondre

5

Vous pouvez détecter, mais ce n'est pas joli.

Tout d'abord, vous avez besoin d'un nouveau contrôleur avec une action qui met à jour un délai d'attente de la session:

class JavascriptController < ApplicationController 
    def confirm 
    session[:javascript_updated] = Time.now 
    end 
end 

Ensuite, vous devez inclure une action javascript dans toutes vos pages, cette action du contrôleur est appelé sur chaque page charge. Le plus simple est de l'inclure dans un fichier "javascript-confirm.js" inclus dans votre mise en page (sur cet exemple particulier j'ai utilisé Ajax.Request de Prototype, donc vous devez l'avoir aussi sur vos javascripts):

function confirmJavascript() 
{ 
    // Assuming you are using Prototype 
    new Ajax.Request('/JavascriptController/confirm'); 
} 

myTimeoutFunction(); 
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds 

Ceci appellera l'action de confirmation dans toutes vos pages vues. Enfin, vous devez contrôler le temps écoulé depuis votre dernière confirmation dans votre contrôleur d'application.

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 

Vous aurez maintenant une variable appelée @javascript_active dans tous vos contrôleurs.

Il devrait fonctionner même si l'utilisateur active/désactive le javascript, avec une précision de 10 secondes.Cela peut ne pas fonctionner si certaines de vos pages mettent plus de 10 pages à charger (c'est-à-dire avec beaucoup d'images). Augmentez la limite de temps dans ce cas (sur applicationcontroller et votre javascript)

Clause de non-responsabilité: Je n'ai pas testé ce code, certains bugs pourraient être cachés - mais cela devrait vous orienter dans la bonne direction.

0

Ce n'est pas possible pendant le rendu de la réponse. La seule façon de comprendre que plus ou moins fiable est de laisser le client envoyer une requête ajaxical à l'avance dans l'une des demandes précédentes. Cette requête ajaxical devrait alors définir un jeton dans la session côté serveur qui identifie que le client a envoyé une requête ajaxical à l'avance (ce qui prouve donc que le client a JS activé). Mais cela ne couvre pas la possibilité que le client puisse désactiver JS pendant une session. Ou vous devez vous soucier de collecter des horodatages et des requêtes ajaxiques après chaque réponse. Pas vraiment quelque chose que tu aimerais faire.

Rendez plutôt les deux contenus et utilisez les balises <noscript> et <script> pour basculer l'un ou l'autre. Voir aussi ma réponse ici pour plusieurs exemples: opposite of <noscript>.

0

Vous pouvez faire quelque chose au sein de l'aide

Mettez dans votre application_helper.rb

def javascript_enabled? 
    content_tag(:div, [ 
    content_tag(:script, 'document.write("Javascript Enabled")'), 
    content_tag(:noscript, 'No Javascript') 
    ]) 
end 

sorte de aki comme ça, mais votre « javascript activé » html devrait être généré Cela va à votre avis:

<%= javascript_enabled? %> 
1

Vous ne pouvez pas le détecter côté serveur. En effet, les scripts peuvent être désactivés la première fois que vous accédez à votre page, puis les paramètres du navigateur sont modifiés et redirigés sans qu'une nouvelle requête HTTP ne soit effectuée. Sans parler de toutes sortes de problèmes de mise en cache et d'endroits où les scripts pourraient être techniquement «activés» mais ne fonctionnant pas en raison de conflits, de bogues ou d'outils de «sécurité».

Vous devez donc prendre toutes les décisions concernant le contenu de with-script/without-script côté client. Ces jours-ci la méthode préférée serait généralement « amélioration progressive »: inclure la version HTML de base sur la page, puis ont JavaScript remplacer/mettre à niveau où il peut:

<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

Vous ne pouvez pas vérifier du côté serveur si Javascript est activé, cependant, vous pouvez configurer une page avant votre site, et laisser rediriger vers votre application avec un paramètre indiquant si Javascript est activé. Voir l'exemple de code ci-dessous:

<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> 

Donc, si Javascript la redirection onload fonctionnera, sinon, l'en-tête balise meta fonctionnera. L'astuce consiste à mettre 1-2 secondes de retard sur la redirection meta tag, donc si la redirection javascript ne redirige pas, la balise meta, indiquant qu'aucun JavaScript n'est activé.

+0

Le code n'est pas visible. – sscirrus

+0

Modifié pour rendre le code visible. – jrdioko

5

Si c'est tous vous voulez qu'il fasse, il pourrait être préférable de mettre la version non-JS dans la vue:

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

et alors le Javascript remplacer que: (J'utilise jQuery) Cette approche devrait être utilisable pour pratiquement toute amélioration progressive que vous souhaitez ajouter.

2

Au lieu d'écrire beaucoup de code pour vérifier si votre javascript est activé ou non, vous pouvez simplement écrire comme (en utilisant HAML) dans votre page layout-

%p.javascript_require 
    No javascript, please enable JavaScript 

et faites votre javascript cacher ce paragraphe en utilisant cache() fonctionne en tant que -

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

N'importe quelle fonction que vous voulez exécuter si javascript est désactivé.

Questions connexes