7 Stimmen

Überprüfen, ob Javascript (serverside) in Rails aktiviert ist

Wie würden Sie überprüfen, ob JavaScript in Rails aktiviert ist? So dass ich in den Ansichten etwas wie dies machen könnte:

    <% if javascript_enabled? %>
    JavaScript aktiviert!
    <%- else -%>
    Kein JavaScript
    <%- end -%>

3 Stimmen

Meinst du, ob dein Server JavaScripts ausführen kann? Wenn nicht, geht das einfach nicht.

0 Stimmen

Du kannst das nicht serverseitig machen, aber hier ist eine einfache Rails-Lösung: Ruby on Rails Javascript-Erkennung

6voto

kikito Punkte 49986

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

Zuerst benötigen Sie einen neuen Controller mit einer Aktion, die einen Timeout in der Sitzung aktualisiert:

class JavascriptController < ApplicationController
  def bestätigen
    session[:javascript_updated] = Time.now
  end
end

Anschließend müssen Sie eine Javascript-Aktion auf allen Ihren Seiten einbeziehen, damit diese Controller-Aktion bei jedem Seitenaufruf aufgerufen wird. Der einfachste Weg ist, sie in einer "javascript-confirm.js"-Datei in Ihr Layout einzuschließen (in diesem speziellen Beispiel habe ich Ajax.Request von Prototype verwendet, also müssen Sie es auch in Ihren Javascripts enthalten):

function confirmJavascript()
{
    // Unter der Annahme, dass Sie Prototype verwenden
    new Ajax.Request('/JavascriptController/confirm');
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 10000); // alle 10 Sekunden aufrufen

Dies ruft die Bestätigungsaktion in allen Ihren Seitenansichten auf. Schließlich müssen Sie kontrollieren, wie viel Zeit seit Ihrer letzten Bestätigung in Ihrem ApplicationController vergangen ist.

class ApplicationController < ActionController::Base

JAVASCRIPT_TIME_LIMIT = 10 Sekunden

before_filter :prepare_javascript_test

privat
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 haben nun eine Variable namens @javascript_active in all Ihren Controllern.

Es sollte auch funktionieren, wenn der Benutzer Javascript aktiviert/deaktiviert, mit einer Genauigkeit von 10 Sekunden. Es könnte nicht funktionieren, wenn einige Ihrer Seiten länger als 10 Sekunden zum Laden benötigen (z.B. mit vielen Bildern). Erhöhen Sie in diesem Fall die Zeitbegrenzung (im ApplicationController und in Ihrem Javascript).

Haftungsausschluss: Ich habe diesen Code nicht getestet, es könnten einige Fehler lauern - aber er sollte Sie in die richtige Richtung weisen.

5voto

Patrick Punkte 51

Wenn das alles ist, was Sie wollen, dass es tut, ist es möglicherweise am besten, die Nicht-JS-Version in der Ansicht zu platzieren:

Kein Javascript

und dann das Javascript austauschen lassen: (Ich benutze jQuery)

$('p.replace_by_js').replaceWith("Javascript aktiviert!")

Dieser Ansatz sollte für praktisch jede progressive Verbesserung verwendet werden können, die Sie hinzufügen möchten.

2voto

User16119012 Punkte 957

Statt viel Code zu schreiben, um zu überprüfen, ob Ihr JavaScript aktiviert ist oder nicht, können Sie einfach wie folgt schreiben (unter Verwendung von HAML) in Ihrem Seitenlayout-

%p.javascript_require
  Kein JavaScript, bitte JavaScript aktivieren

und lassen Sie Ihr JavaScript diesen Absatz mit der hide() Funktion ausblenden -

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

Führen Sie die gewünschte Funktion aus, wenn JavaScript deaktiviert ist.

1voto

BalusC Punkte 1034465

Das ist nicht möglich während der Antwortrenderung. Der einzige Weg, um herauszufinden, ob das weniger oder mehr zuverlässig ist, besteht darin, den Client im Vorfeld eine Ajax-Anfrage senden zu lassen, in einer der vorherigen Anfragen. Diese Ajax-Anfrage sollte dann einen Token in der serverseitigen Sitzung setzen, der identifiziert, dass der Client zuvor eine Ajax-Anfrage gesendet hat (was somit beweist, dass der Client JS aktiviert hat). Aber das deckt nicht die Möglichkeit ab, dass der Client während einer Sitzung JS deaktivieren kann. Oder Sie müssen sich mit dem Sammeln von Zeitstempeln und Ajax-Anfragen nach jeder Antwort herumschlagen. Nicht wirklich etwas, was Sie tun möchten.

Rendern Sie lieber beide Inhalte und benutzen Sie

und </code>-Tags, um das eine oder andere umzuschalten. Siehe auch meine Antwort hier für mehrere Beispiele: <a href="https://stackoverflow.com/questions/2297643/opposite-of-noscript/2297666#2297666"><strong>Gegenteil von <code><noscript></code></strong></a>.</p></x-turndown>

1voto

bobince Punkte 512550

Sie können es auf der Serverseite nicht erkennen. Tatsächlich kann das Skripten beim ersten Zugriff auf Ihre Seite deaktiviert sein, dann können die Browsereinstellungen geändert und erneut navigiert werden, ohne dass eine neue HTTP-Anfrage gestellt wird. Ganz zu schweigen von allen möglichen Zwischenspeicherproblemen und Stellen, an denen das Skripten technisch gesehen 'aktiviert' sein könnte, aber aufgrund von Konflikten, Fehlern oder 'Sicherheits'-Tools nicht funktioniert.

Sie müssen also alle Entscheidungen über den Inhalt für mit Skript/ohne Skript auf der Clientseite treffen. Heutzutage wäre die bevorzugte Methode im Allgemeinen die 'progressive Verbesserung': Fügen Sie die grundlegende HTML-Version auf der Seite ein und lassen Sie JavaScript sie dort ersetzen/aktualisieren, wo es kann:

    Backup-Inhalt für kein JavaScript

    document.getElementById('isitjs').innerHTML= '<p>Funkelnder skriptverbesserter Inhalt!<\/p>';
    // oder DOM-Methoden, wie Sie bevorzugen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X