Schlüsselpunkte
Einmal war die Browsererkennung die beste Fähigkeit von JavaScript -Programmierern. Wenn wir wissen, dass einige Funktionen in IE5 funktionieren, jedoch nicht in Netscape 4, werden wir den Browser testen und den Code entsprechend ändern. Zum Beispiel:
if (navigator.userAgent.indexOf('MSIE 5') != -1) { // 我们认为此浏览器是 IE5 }
Aber als ich zum ersten Mal in die Branche kam, hatte das Wettrüsten bereits begonnen! Anbieter fügen den Saiten von Benutzeragenten zusätzliche Werte hinzu, sodass sie wie die Browser ihrer Konkurrenten und ihre eigenen aussehen. Dies ist beispielsweise Safari 5 für Mac:
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
Dies entspricht Tests für "Safari", "Webkit" und "KHTML" (die Konqueror -Codebasis, die Webkit basiert); Mozilla "" (aus historischen Gründen behauptet fast jeder Browser, Mozilla zu sein).
Der Zweck des Hinzufügens aller dieser Werte besteht darin, die Browsererkennung zu umgehen. Wenn das Skript davon ausgeht, dass nur Firefox bestimmte Funktionen bewältigen kann, kann Safari ausgeschlossen werden, auch wenn es funktioniert. Vergessen Sie nicht, dass Benutzer ihren Benutzeragenten selbst ändern können. Ich habe meinen Browser so festgelegt, dass ich "GoogleBot/1.0" erkannte, damit ich auf das zugreifen kann, was der Site -Besitzer nur für das Kriechen hält!
Im Laufe der Zeit ist diese Art von Browsererkennung zu einem unmöglichen Chaos geworden und ist weitgehend nicht mehr in Gebrauch, ersetzt durch etwas Besseres - Feature -Erkennung.
Die Funktionserkennung besteht nur darin, die von uns gebrauchten Funktionen zu testen. Wenn wir beispielsweise getBoundingClientRect
benötigen (die Position eines Elements relativ zum Ansichtsfenster erhalten), ist es wichtig, ob der Browser es nicht kann, nicht welcher Browser es ist. schlimmer als das Testmerkmal selbst:
if (typeof document.documentElement.getBoundingClientRect != "undefined") { // 浏览器支持此函数 }
Aber die Wahrheit ist - die Erkennung von Merkmalen ist nicht ganz zuverlässig - manchmal fehlschlägt sie. Schauen wir uns jetzt einige Beispiele an und sehen, was wir tun können, um jeden Fall zu lösen.
Das vielleicht berühmteste Beispiel für den Fehler bei der Erkennung von Funktionen ist das Testen von ActiveXObject für AJAX -Anforderungen im Internet Explorer.
activeX ist ein Beispiel für verspätete Objekte, und die praktische Bedeutung ist, dass Sie nicht wissen, ob es unterstützt wird , bis Sie versuchen, es zu verwenden. Wenn der Benutzer ActiveX deaktiviert, wirft der folgende Code daher einen Fehler aus:
if (navigator.userAgent.indexOf('MSIE 5') != -1) { // 我们认为此浏览器是 IE5 }
Versuchen Sie das Objekt instanziieren, fangen alle Fehler und verarbeiten Sie es entsprechend:
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
die draggierbare API unterstützt, indem Sie nach draggablen Eigenschaften suchen: [draggable="true"]
if (typeof document.documentElement.getBoundingClientRect != "undefined") { // 浏览器支持此函数 }
HTML -Eigenschaften auf DOM -Eigenschaften automatisch zugeordnet werden. Aus diesem Grund ist in diesen älteren Versionen so verwirrend, da es überhaupt keine Eigenschaften, sondern DOM -Eigenschaften zurückgibt.
getAttribute
Dies bedeutet, wenn wir ein Element verwenden, das bereits das Attribut
dann, selbst wenn sie nicht unterstützt werden, wird IE8 oder früher
fürif (typeof window.ActiveXObject != "undefined") { var request = new ActiveXObject("Microsoft.XMLHTTP"); }
true
Attribut kann alles sein: ("draggable" in element)
Aber das Ergebnis wird das gleiche sein - IE8 oder früher wird
fürif (typeof window.ActiveXObject != "undefined") { try { var request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) { request = null; } if (request !== null) { //... 我们有一个请求对象 } }
true
In diesem Fall besteht die Lösung darin, ein Element zu verwenden, das dieses Attribut zum Testen nicht hat. Die sicherste Möglichkeit besteht darin, das erstellte Element zu verwenden: ("nonsense" in element)
Annahmen über Benutzerverhalten
if ("draggable" in element) { // 浏览器支持拖放 }
Die meisten Touch -Geräte implementieren manuelle Verzögerungen, bevor ein Klickereignis ausgelöst wird (normalerweise etwa 300 Millisekunden), um zu vermeiden, dass Sie auf Elemente klicken und gleichzeitig klicken. Dadurch fühlt sich die Anwendung jedoch träge und nicht mehr an. Daher verwenden Entwickler diesen Funktionstest manchmal, um das Ereignis zu geben:
<div draggable="true"> ... </div>
Diese Bedingung stammt jedoch aus einem
-Fehler des<div nonsense="true"> ... </div>
In diesem Fall besteht die Lösung darin, Ereignisunterstützung überhaupt nicht zu testen - stattdessen zwei
Ereignisse gleichzeitig zu binden und dann zu verhindern, dass die Berührung Klicks erzeugt: Dies ist schmerzhaft, aber manchmal müssen wir nicht das Feature testen - , sondern der Browser - weil ein bestimmter Browser behauptet, etwas zu unterstützen, das nicht funktioniert. Ein aktuelles Beispiel ist Feature -Test schlägt hier aus, da Opera 12 behauptet, dies zu unterstützen. Es funktioniert einfach nicht: Nun, wenn Sie nur versuchen möchten, ein benutzerdefiniertes Drag -Image hinzuzufügen und den Standardwert ohne Unterstützung beizubehalten (was passieren wird), kann dies in Ordnung sein. Aber was ist, wenn Ihre Anwendung benutzerdefinierte Bilder benötigt, damit Browser, die sie nicht unterstützen, eine völlig andere Implementierung verwenden sollte (d. H. Verwenden Sie benutzerdefinierte JavaScript, um alle Dragverhalten zu implementieren)?
Oder was ist, wenn der Browser bestimmte Merkmale implementiert, aber unvermeidliche Rendering -Fehler gibt? Manchmal haben wir keine andere Wahl, als den problematischen Browser explizit zu erkennen und ihn aus den Funktionen auszuschließen, die er mit dem mit der Verwendung versuchte. Das Problem wird also - was ist der sicherste Weg, um die Browsererkennung zu erzielen? Ich habe zwei Vorschläge:
Wir haben festgestellt, dass Benutzeragentenketten ein unzuverlässiges Chaos sind, aber Anbieterketten tatsächlich ziemlich vorhersehbar sind und verwendet werden können, um Chrom oder Safari zuverlässig zu testen: Die goldene Regel für all dies ist äußerst vorsichtig. Stellen Sie sicher Bekannte Merkmale (dies ist der Zweck des Feature -Tests)
Testsyntax auswählen
Vor dem Ende möchte ich die verschiedenen Arten von Syntax überprüfen, die wir für Objekt- und Eigenschaftstests verwenden können. Zum Beispiel ist die folgende Syntax in den letzten Jahren üblich geworden: Wir konnten es in der Vergangenheit nicht verwenden, weil IE5 und seine ähnlichen Produkte aufgrund von Syntax Fehler werfen würden. im Wesentlichen ist es genau das gleiche wie die folgenden, aber es ist kürzer zu schreiben: Die Testbedingungen beruhen jedoch normalerweise auf automatische Typumwandlung: Wir haben diese Syntax früher in einigen Browser -Objekt -Tests (z. B. Aber wir testen möglicherweise etwas, das null oder leere Zeichenfolgen effektiv zurückgibt, die beide auf False bewerten. Zum Beispiel wird das Es wird nur zu true bewertet, wenn das Die allgemeine Regel lautet: Die Herstellung der automatischen Typumwandlung ist für Objekte und Funktionen sicher, aber nicht unbedingt sicher für Zeichenfolgen und Zahlen oder Werte, die null sein können. , das gesagt - wenn Sie es sicher verwenden können, tun Sie es, weil es in modernen Browsern normalerweise viel schneller ist (wahrscheinlich weil sie für diese Art von Zustand optimiert sind). Weitere Informationen hierzu finden Sie unter: Automatische Konvertierung in der realen Welt. JavaScript -Feature -Erkennung ist eine Technologie, die von Entwicklern verwendet wird, um festzustellen, ob der Browser eines Benutzers eine bestimmte Funktion oder API unterstützt. Dies ist entscheidend, da nicht alle Browser alle Funktionen von JavaScript unterstützen. Durch die Verwendung von Feature -Erkennung können Entwickler alternative Lösungen oder Fallbacks für nicht unterstützte Funktionen bereitstellen und sicherstellen, dass Websites oder Anwendungen in verschiedenen Browsern korrekt ausgeführt werden. Dies verbessert die Benutzererfahrung und gewährleistet die Kompatibilität. JavaScript -Merkmalserkennung kann aus mehreren Gründen fehlschlagen. Ein häufiger Grund ist, dass der Feature -Erkennungscode falsch implementiert wird. Wenn der Code beispielsweise nach Eigenschaften prüft, die im Objekt nicht vorhanden sind, gibt er undefinierter und führt zu einem falsch negativen Negativ zurück. Ein weiterer Grund könnte eine Browser -Quirk oder ein Fehler sein, der dazu führen kann, dass die Merkmalserkennung ungenaue Ergebnisse liefert. Die Funktionserkennung von Features besteht darin, zu überprüfen, ob der Browser eines Benutzers eine bestimmte Funktion oder eine bestimmte API unterstützt, während die Browsererkennung den Browser und die Version des Benutzers erkennt. Während beide Techniken so konzipiert sind, dass die Kompatibilität und Funktionalität sichergestellt wird, wird die Erkennung von Merkmalen häufig als bessere Praxis angesehen, da sie direkt auf Funktionen überprüft, anstatt ihre Unterstützung basierend auf dem Browsertyp oder -version zu übernehmen. Sie können das Attribut feature.js ist ein leichtes, schnelles und einfaches JavaScript -Dienstprogramm zur Erkennung von Funktionen. Es bietet eine benutzerfreundliche API, mit der Entwickler testen können, ob der Browser bestimmte Funktionen unterstützt. Dies bietet eine Sicherungslösung oder alternative Lösung für nicht unterstützte Funktionen, wodurch die Kompatibilität und Funktionalität der Website oder Anwendung verbessert wird. modernizr ist eine JavaScript -Bibliothek, die Entwicklern hilft, HTML5- und CSS3 -Funktionen zu nutzen und gleichzeitig die Kompatibilität mit älteren Browsern aufrechtzuerhalten. Es wird die Funktionserkennung verwendet, um zu überprüfen, ob der Browser bestimmte Funktionen unterstützt und HTML -Elemente Klassen hinzufügt, sodass Sie bestimmte Browserfunktionen in Stylesheets oder JavaScript finden können. Geräte-Detektor-JS ist ein leistungsstarkes Tool für die Erkennung von Geräten. Es analysiert User Agent Strings und erkennt Smartphones, Tablets, Desktops, Fernseher und andere Geräte. Es erkennt auch Browser, Motoren, Betriebssysteme und andere nützliche Informationen. Sie können dieses Paket verwenden, um das Verhalten einer Website oder Anwendung basierend auf den erkannten Geräten anzupassen. Einige Best Practices für die Implementierung von Funktionen sind: Verwenden von zuverlässigen und getesteten Bibliotheken wie Modernizr oder Feature.js, gründlich testen Sie Ihren Feature -Erkennungscode auf verschiedenen Browsern und Geräten, da nicht unterstützte Funktionen alternative Lösungen oder Fallbacks liefern und die Übernahme von Merkmalsunterstützung vermeiden können basierend auf Browsertyp oder -version. Ja, die Erkennung von Funktionen kann die Leistung der Website verbessern. Indem Sie nicht unterstützte Funktionen erkennen und alternative Lösungen oder Fallback -Lösungen bereitstellen, können Sie verhindern, dass unnötiger Code im Browser ausgeführt wird. Dies verkürzt die Ladezeit und verbessert die Gesamtleistung der Website. Aufgrund der schnellen Entwicklung der Webentwicklung kann es schwierig sein, die neuesten Funktionen zu verstehen, die von verschiedenen Browsern unterstützt werden. Ressourcen wie das Mozilla Developer Network (MDN), kann ich jedoch verwenden, und JavaScript -Dokumentation kann die neuesten Informationen zur Funktionsunterstützung in verschiedenen Browsern liefern. Das obige ist der detaillierte Inhalt vonWenn die Erkennung von JavaScript -Funktionen fehlschlägt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!if (navigator.userAgent.indexOf('MSIE 5') != -1) {
// 我们认为此浏览器是 IE5
}
Dinge, die überhaupt nicht funktionieren
setDragImage()
in Opera 12 (was eine Möglichkeit ist, dataTransfer
Objekte zu ziehen und zu fallen). <code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
Objekterkennungsoper 12 oder früher verwenden, sodass wir diesen Ausschluss verwenden können, um die draggable Unterstützung zu testen: window.opera
if (typeof document.documentElement.getBoundingClientRect != "undefined") {
// 浏览器支持此函数
}
if (typeof window.ActiveXObject != "undefined") {
var request = new ActiveXObject("Microsoft.XMLHTTP");
}
if (typeof window.ActiveXObject != "undefined") {
try {
var request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (ex) {
request = null;
}
if (request !== null) {
//... 我们有一个请求对象
}
}
if ("draggable" in element) {
// 浏览器支持拖放
}
if (navigator.userAgent.indexOf('MSIE 5') != -1) {
// 我们认为此浏览器是 IE5
}
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
if (typeof document.documentElement.getBoundingClientRect != "undefined") {
// 浏览器支持此函数
}
window.opera
Tests) verwendet, was aufgrund der Art und Weise, wie Objekte bewerten als falsch bewertet werden. style.maxWidth
Attribut manchmal verwendet, um IE6: if (typeof window.ActiveXObject != "undefined") {
var request = new ActiveXObject("Microsoft.XMLHTTP");
}
maxWidth
Attribut unterstützt wird und der den Autor definierte Wert hat. Wenn wir also den Test so schreiben, kann er fehlschlagen: if (typeof window.ActiveXObject != "undefined") {
try {
var request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (ex) {
request = null;
}
if (request !== null) {
//... 我们有一个请求对象
}
}
häufig gestellte Fragen zur JavaScript -Funktionserkennung
Was ist die Erkennung von JavaScript -Funktionen und warum ist es wichtig?
Wie fällt die Erkennung von JavaScript -Funktionen aus?
Was ist der Unterschied zwischen Merkmalserkennung und Browsererkennung?
Wie kann ich JavaScript verwenden, um mobile Geräte zu erkennen?
navigator.userAgent
in JavaScript verwenden, um mobile Geräte zu erkennen. Diese Eigenschaft gibt eine Zeichenfolge zurück, die den User Agent Header des Browsers darstellt. Durch die Überprüfung von bestimmten Schlüsselwörtern in dieser Zeichenfolge (z. B. "Android", "iPhone" oder "iPad") können Sie feststellen, ob sich der Benutzer auf einem mobilen Gerät befindet. Was ist feature.js und wie hilft es bei der Funktionserkennung?
Was ist Modernizr und wie hilft es bei der Erkennung von Funktionen?
Wie verwenden Sie das Paket für Geräte-Detektor-JS zur Funktionserkennung?
Das Paket Was sind einige Best Practices für die Implementierung der Funktionserkennung?
Kann die Erkennung von Erkenntnissen helfen, die Leistung der Website zu verbessern?
Wie kann man die neuesten Funktionen verstehen, die von verschiedenen Browsern unterstützt werden?