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