Wird es als schlechte Praxis angesehen, anderes JavaScript für IE auszuführen?


8

Wird es als schlechte Praxis angesehen (und wie schlecht), anderes JavaScript für IE auszuführen? Momentan schreibe ich JavaScript und die einfachste Art, IE-Macken zu umgehen, scheint darin zu bestehen, nach der Browserversion zu suchen und anderen Code auszuführen

var browserName = navigator.appName;

if (browserName == "Microsoft Internet Explorer") {
  //Do some stuff
}
else
{
//Do other stuff
}

Es ist schnell und funktioniert gut, führt aber zu einer Duplizierung des Codes und fühlt sich "hacky" an.


18
Man könnte sagen, dass es für Microsoft eine schlechte Praxis ist, einen Browser zu schreiben, in dem ein solches Javascript erforderlich ist
maple_shaft

3
@keppla Best-Practice-Fragen sind besser für Programmierer geeignet
Tom Squires

2
Es ist nicht nur keine schlechte Praxis, es ist absolut notwendig. Schauen Sie sich an, was JQuery durchmachen muss.
Großmeister

2
@keppla - nicht wirklich. Er fragt nicht, wie es geht, aber ob es eine gute Übung ist oder nicht.
ChrisF

8
Die wirklich schlechte Praxis in der Frage ist, wie Sie testen, was zu tun ist, die Fähigkeitserkennung und nicht die Browsererkennung verwenden , wie Sie es tun, oder es werden viele Fehler und Schmerzen auftreten.

Antworten:


17

Ja

Das Ableiten von Funktionen aus einer Benutzeragentenzeichenfolge ist ein schwacher und fehleranfälliger Test. Obwohl relativ häufig, würde ich heutzutage sagen, dass dies sicherlich eine schlechte Praxis ist.

Zum Beispiel hat jquery eine Funktion zum Erkennen des von einem Benutzer verwendeten Browsers und ist seit Version 1.3 veraltet

Deshalb: Führen Sie kein UserAgent-Sniffing durch, um zu entscheiden, was der Browser ist oder wozu er in der Lage ist.

Beste Übung

Die anerkannte bewährte Methode zur Behandlung der Unterschiede zwischen den Browserfunktionen ist die Verwendung der Funktionserkennung .

Dafür gibt es einige Bibliotheken, die bekannteste ist wahrscheinlich: Modernizr . Mit Modernizr können Sie Ihr Javascript ganz einfach an die Fähigkeiten eines Browsers anpassen. Es erkennt, was verfügbar ist. Keine Vermutung basierend auf einer UserAgent-Zeichenfolge (außer als letzter Ausweg) und einfaches Hinzufügen von Klassen zum HTML-Tag. Dies macht es nicht nur möglich, verschiedene Fälle in Ihrem js einfach zu behandeln, sondern auch bestimmte Mängel allein mit CSS zu beheben. zB (nur zur Veranschaulichung):

ul.menu {
    display:none;
}
ul.menu:hover {
    display:block;
}

# A touch device can have no hover - so show it always
html.notouch ul.menu {
    display: block;
}

3

Es ist in Ordnung, wenn es gültiges JS ist und es keine Abstraktionen gibt

Es ist nicht gerade eine schlechte Praxis, obwohl es besser geworden ist, sind Browser nicht 100% identisch.

Bevor Sie jedoch mit Sonderfällen beginnen, sollten Sie sorgfältig prüfen, ob es sich wirklich um Sonderfälle handelt und nicht nur um Eigenheiten eines anderen Browsers. In diesem Fall sollten Sie nach einer Lösung suchen, die Standards verwendet, die alle Browser gemeinsam nutzen ( caniuse.com ist hierfür eine große Hilfe).

Wenn Sie sicher sind, dass es tatsächlich browserspezifisch ist, sollten Sie imho prüfen, ob Sie eine Bibliothek verwenden können, die dieses Detail vor Ihnen verbirgt. Cross-Browser-Kompatibilität ist eine schwierige Sache. Wenn also jemand es für Sie getan hat, profitieren Sie einfach.

Tu als letztes Mittel, was du tun musst;)


2
+1 für Bibliotheken. jQuery, Dojo, Prototype, Ext.js sind nur einige Beispiele.
Pap

Ja. Ich wollte nur ungern Empfehlungen hinzufügen, weil ich bis jetzt nur Prototypen und Abfragen verwendet habe, also bin ich sehr voreingenommen.
Keppla

2
Es ist NICHT in Ordnung, nach dem Namen des Browsers zu suchen und dann einen anderen Code auszuführen. Machen Sie deutlich, dass es einen Unterschied zwischen Browser-Sniffing und Feature-Sniffing gibt
Raynos

Raynos, du hast recht.
Zum

2

Wenn mit "einige Dinge tun" "IE-spezifische Einrichtung x verwenden" und mit "andere Dinge tun" "häufigere Einrichtung y verwenden" gemeint ist, ist es besser, nur auf das Vorhandensein von x oder y zu prüfen.

Ich vermute, dass Sie derzeit keine externe Javascript-Bibliothek verwenden. In diesem Fall würde ich prüfen, ob jQuery die Aufgabe unterstützt, die Sie ausführen möchten. Wenn ja, würde ich es benutzen.


1

Verwenden Sie die IE-spezifischen Kommentare <!--[if IE &gt; 6]>...oder ähnliches. Funktioniert auf allen super beschissenen Browsern IE? -> IE8, aber nicht auf IE9 +, was als Browser als in Ordnung angesehen wird.

Unter dem Strich ist es in Ordnung, wenn Sie sich mit einem super beschissenen Browser befassen, der Problemumgehungen benötigt, alles Notwendige zu tun, aber zu vermeiden, dass gut geschriebener Basiscode in einen Hackatron verwandelt wird.

Hoffentlich wird der IE eines Tages verschwinden und Sie können den Hackatron-Code löschen und nur die gut geschriebene Grundlinie belassen.


-1

Ich denke, es ist besser, diese Art der Entscheidungsfindung auf den Framework-Designer zu verschieben und ein JavaScript-Framework zu verwenden, das diese Art von Komplexität zusammenfasst. Heutzutage haben wir AngularJS, JQuery, ReactJS und so weiter. Wenn Sie Dinge ohne Framework tun, werden Sie diese Art von Schwierigkeiten bekommen.


Ihre Antwort beantwortet nichts.
Andy

-2

Angenommen, Sie möchten tatsächlich JavaScript lernen, ist die beste Vorgehensweise folgende: Bevorzugen Sie das Testen durch Fehlen / Vorhandensein von Methoden und schreiben Sie Normalisierungsfunktionen. Ein total lahmes Beispiel, aber es trifft drei Prinzipien:

if(!document.getElementsByClassName){
    document.getByClass = function(){ //look at all elements, check for class etc...
}
else { document.getByClass = document.getElementsByClassName }
  1. Schnüffeln Sie nicht im Browser.
  2. Sie können auch ein wenig von der DOM-Cruft entfernen, wenn Sie gehen. Der Zweck der DOM-API besteht darin, explizit zu sein und Ihren Karpaltunnel nicht zu schonen, wenn Sie nicht bemerkt haben, wie unglaublich flexibel JS ist. Der kaum eliminierende Faktor macht das Beispiel lahm.
  3. Zwischenspeichern einer neuen Funktion. Führen Sie den Methodentest nicht jedes Mal durch, wenn er aufgerufen wird.

Der Vorteil ist, dass Sie dem Browser-Sniffing niemals zu 100% vertrauen können und nie wissen, wann eine andere Bibliothek, mit der verknüpft wird, keine entsprechende Methode für Sie hinzugefügt hat.

Egal, ob Sie nur versuchen, Dinge zu erledigen oder mehr erfahren möchten, ich empfehle JQuery. Es macht einen knallharten Job, indem es die DOM-API-Cruft eliminiert und ein hohes Maß an plattformübergreifender Normalisierung aufrechterhält, aber es ist auch etwas, das Sie ein gutes Stück lernen können, wenn Sie unter der Haube lernen. Noch wichtiger ist, wenn Sie sich die Mühe machen, weiterhin Kern-JS zu lernen, wird es nicht wie so viele andere JS-Frameworks und -Bibliotheken nutzlos und Sie werden weiterhin davon profitieren, dass Sie Ihren JQuery-Junk mit Ihrem verrückten OOP-ish de-suppen können Kompetenzen.

Schauen Sie sich auch quirksmode.org an, um zu verstehen, warum Microsoft für alle IEs vor 9 an der JS-Front wirklich verachtet werden sollte, und um viele Details darüber zu erfahren, wie viel mit der proprietären DOM-API nicht stimmt, und um Vorschläge zur Umgehung zu finden.


1
Ich bin ein bisschen verwirrt. Hättest du es vorgezogen, wenn ich diesen widerlichen Trolling-Kommentar nicht gelöscht hätte? Wenn Sie das nächste Mal ein Problem mit einem solchen Kommentar haben, markieren Sie ihn, anstatt den Köder zu nehmen. Dies ist eine gute Antwort, aber sie verliert aufgrund ihrer Grobheit an Wert (wie bei einigen Ihrer anderen Antworten). Markieren Sie einfach den Mist und halten Sie Ihre Antworten professionell, so einfach ist das.
Yannis

Ja eigentlich. Ich werde beleidigt (wahrscheinlich zu Recht) und mein Kommentar bleibt. Warum sollte der herkunftsreizende Kommentar nicht auch bleiben? Es ist nur das Internet. Die Leute müssen mehr kämpfen, wenn es keine Waffen gibt.
Erik Reppen

1
Wenn Sie kämpfen möchten, nehmen Sie es woanders hin. Programmierer sind eine Q & A-Plattform, die wir bemühen, den Lärm gering zu halten.
Yannis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.