Frage

Wie würden Sie überprüfen, ob Sie Javascript in Rails aktiviert ist? So, dass ich so etwas wie dies in den Ansichten tun konnte:

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

Lösung

Sie können es erkennen, aber es ist nicht schön.

Zuerst müssen Sie einen neuen Controller mit einer Aktion, die ein Timeout in der Sitzung aktualisiert:

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

Als nächstes müssen Sie eine Javascript-Aktion in allen Ihren Seiten enthalten, so diese Controller-Aktion auf jeder Seite zu laden aufgerufen wird. Der einfachste Weg ist es auf einer „javascript-confirm.js“ Datei in Ihrem Layout enthalten ist (in diesem speziellen Beispiel I Prototype Ajax.Request verwendet, so dass Sie es auf Ihrem javascripts enthalten haben müssen, auch):

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

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

Das wird die Aktion bestätigen in allen Seitenaufrufe aufrufen. Schließlich müssen Sie steuern, wie viel Zeit haben sie seit der letzten Bestätigung in Ihrer Anwendung Controller übergeben.

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

Sie werden nun eine Variable namens @javascript_active in allen Ihren Controller.

Es sollte funktionieren, auch wenn der Benutzer aktivieren / deaktivieren Sie Javascript, mit einer Genauigkeit von 10 Sekunden. Es könnte nicht funktionieren, wenn einige Ihrer Seiten länger als 10 Seiten zu laden (das heißt mit vielen Bildern). Erhöhen Sie die Frist in diesem Fall (auf Application und Ihr Javascript)

Disclaimer:. Ich diesen Code nicht getestet haben, könnte lauern einige Fehler - aber es sollte man auf die richtige Richtung

Andere Tipps

Wenn das alle Sie wollen, es zu tun, es wäre am besten, die nicht-JS-Version in der Ansicht zu setzen:

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

und dann haben die Javascript, dass ersetzen: (ich benutze jQuery)

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

Dieser Ansatz sollte für praktisch jede progressive enhancement Sie hinzufügen möchten verwendbar sein.

Statt eine Menge Code zu schreiben um zu überprüfen, ob Ihr Javascript aktivieren ist oder nicht, können Sie einfach schreiben als (mit HAML) auf Ihrer Seite Layout-

%p.javascript_require
  No javascript, please enable JavaScript

und machen Sie Ihre Javascript auszublenden diesen Absatz mit hide () Funktion als -

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

Ob Welt Funktion, die Sie wenn ausführen möchten, wenn Javascript deaktiviert ist.

Das ist nicht möglich, während der Reaktion zu machen. Der einzige Weg, um die mehr oder weniger zuverlässig ist der Client senden Sie eine ajaxical Anfrage vorher in einem der vorherigen Anfragen zu lassen. Diese ajaxical Anfrage sollte dann einige Token in der Server-Seite-Sitzung gesetzt, der feststellt, dass der Client eine Anfrage ajaxical vorher gesendet hat (was somit zeigt, dass der Client JS aktiviert). Aber das schließt nicht die Möglichkeit abdecken, dass der Client JS in der Zwischenzeit während einer Sitzung deaktivieren. Oder müssen Sie Ärger mit Zeitstempel und ajaxical Anfragen nach jeder Antwort zu sammeln. Nicht wirklich etwas, was Sie möchten, dass tun.

machen vielmehr die sowohl Inhalte und nutzen <noscript> und <script> Tags, um die eine oder die andere zu wechseln. Siehe auch meine Antwort hier einige Beispiele: Gegenteil von <noscript> .

Sie können nicht auf der Serverseite erkennen. Tatsächlich scripting das erste Mal sein könnte Ihre Seite zugegriffen wird, dann wird die Browser-Einstellungen geändert und neu navigiert ohne eine neue HTTP-Anforderung wird gemacht ausgeschaltet. Ganz zu schweigen davon, alle Arten von Caching-Probleme und Orte, an denen scripting technisch sein könnte ‚aktiviert‘, aber nicht aufgrund von Konflikten arbeiten, Bugs oder ‚Sicherheit‘ Werkzeuge in die Quere.

Sie müssen also alle Entscheidungen über Inhalt zu tun für mit-Skript / ohne-Skript auf der Client-Seite. In diesen Tagen die bevorzugte Methode ‚Progressive Enhancement‘ im Allgemeinen wäre: umfassen die grundlegende HTML-Version auf der Seite, dann haben Sie JavaScript ersetzen / aktualisieren Sie sie, wo sie kann:

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

Sie könnte so etwas Art von Hacky tun, aber Ihre „javascript-fähige“ html müßte im Helfer erzeugt wird

Setzen Sie diese in Ihrem application_helper.rb

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

Dies geht aus Ihrer Sicht:

<%= javascript_enabled? %>

Sie können nicht von der Serverseite überprüfen, ob Javascript aktiviert ist, können Sie jedoch eine Seite, bevor Sie Site einrichten, und lassen Sie Umleitung zu Ihrer Anwendung mit einem Parameter, der angibt, ob Javascript aktiviert ist. Siehe den folgenden Beispielcode:

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

Also, wenn Javascript die onload Umleitung aktiviert wird funktionieren, wenn nicht, dann wird der Header-Meta-Tag arbeitet. Der Trick ist, 1-2 Sekunden Verzögerung auf der Meta-Tag Umleitung zu setzen, so dass, wenn die JavaScript-Weiterleitung wird nicht umgeleitet, wird der Meta-Tag, was darauf hinwies, dass kein JavaScript aktiviert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top