Ich bin damit einverstanden, dass wir auf Funktionen testen sollten, aber es ist schwierig, eine einfache Antwort auf "Welche Funktionen werden von" modernen Browsern ", aber nicht von" alten Browsern "unterstützt?" Zu finden.
Also habe ich eine Reihe von Browsern gestartet und Modernizer direkt inspiziert. Ich habe ein paar Funktionen hinzugefügt, die ich definitiv benötige, und dann "inputtypes.color" hinzugefügt, da dies alle wichtigen Browser abzudecken scheint, die mir wichtig sind: Chrome, Firefox, Opera, Edge ... und NICHT IE11. Jetzt kann ich sanft vorschlagen, dass der Benutzer mit Chrome / Opera / Firefox / Edge besser dran wäre.
Dies ist, was ich benutze - Sie können die Liste der Dinge bearbeiten, die für Ihren speziellen Fall getestet werden sollen. Gibt false zurück, wenn eine der Funktionen fehlt.
/**
* Check browser capabilities.
*/
public CheckBrowser(): boolean
{
let tests = ["csstransforms3d", "canvas", "flexbox", "webgl", "inputtypes.color"];
// Lets see what each browser can do and compare...
//console.log("Modernizr", Modernizr);
for (let i = 0; i < tests.length; i++)
{
// if you don't test for nested properties then you can just use
// "if (!Modernizr[tests[i]])" instead
if (!ObjectUtils.GetProperty(Modernizr, tests[i]))
{
console.error("Browser Capability missing: " + tests[i]);
return false;
}
}
return true;
}
Und hier ist die GetProperty-Methode, die für "inputtypes.color" benötigt wird.
/**
* Get a property value from the target object specified by name.
*
* The property name may be a nested property, e.g. "Contact.Address.Code".
*
* Returns undefined if a property is undefined (an existing property could be null).
* If the property exists and has the value undefined then good luck with that.
*/
public static GetProperty(target: any, propertyName: string): any
{
if (!(target && propertyName))
{
return undefined;
}
var o = target;
propertyName = propertyName.replace(/\[(\w+)\]/g, ".$1");
propertyName = propertyName.replace(/^\./, "");
var a = propertyName.split(".");
while (a.length)
{
var n = a.shift();
if (n in o)
{
o = o[n];
if (o == null)
{
return undefined;
}
}
else
{
return undefined;
}
}
return o;
}
Browser identification based on detecting the user agent string is unreliable and is not recommended, as the user agent string is user configurable.
Sie können Modernizr verwenden , um einfach IE oder nicht IE zu erkennen, indem Sie nach SVG SMIL- Animationsunterstützung suchen.
Wenn Sie die Erkennung von SMIL- Funktionen in Ihr Modernizr-Setup aufgenommen haben, können Sie einen einfachen CSS-Ansatz verwenden und auf die .no-smil- Klasse abzielen, die Modernizr auf das HTML- Element anwendet :
Alternativ können Sie Modernizr mit einem einfachen JavaScript-Ansatz verwenden, wie folgt:
Bedenken Sie, dass IE / Edge eines Tages möglicherweise SMIL unterstützen , dies ist jedoch derzeit nicht geplant.
Als Referenz finden Sie hier einen Link zur SMIL- Kompatibilitätstabelle unter caniuse.com .
quelle
Erkennen von CSS 3D-Transformationen
Modernizr kann CSS-3D-Transformationen erkennen , ja. Die Wahrhaftigkeit von
Modernizr.csstransforms3d
wird Ihnen sagen, ob der Browser sie unterstützt.Über den obigen Link können Sie auswählen, welche Tests in einen Modernizr-Build aufgenommen werden sollen. Dort steht die gesuchte Option zur Verfügung.
IE spezifisch erkennen
Alternativ können Sie , wie user356990 antwortete, bedingte Kommentare verwenden, wenn Sie nur nach IE und IE suchen. Anstatt eine globale Variable zu erstellen, können Sie den
<html>
Trick für bedingte Kommentare von HTML5 Boilerplate verwenden , um eine Klasse zuzuweisen:Wenn Sie jQuery bereits initialisiert haben, können Sie dies einfach überprüfen
$('html').hasClass('lt-ie9')
. Wenn Sie überprüfen müssen, in welcher IE-Version Sie sich befinden, damit Sie entweder jQuery 1.x oder 2.x bedingt laden können, können Sie Folgendes tun:NB IE-bedingte Kommentare werden nur bis einschließlich IE9 unterstützt. Ab IE10 empfiehlt Microsoft die Verwendung der Funktionserkennung anstelle der Browsererkennung.
Welche Methode Sie auch wählen, Sie würden sie dann testen
Nehmen Sie das
||
natürlich nicht wörtlich.quelle
Wenn Sie nach einer JS-Version (mit einer Kombination aus Feature-Erkennung und UA-Sniffing) suchen, für die HTML5-Boilerplate verwendet wurde:
quelle
Nachdem ich mehr zu diesem Thema recherchiert hatte, verwendete ich die folgende Lösung für das Targeting von IE 10+. Da IE10 und 11 die einzigen Browser sind, die die kontrastreiche Medienabfrage -ms unterstützen, ist dies eine gute Option ohne JS:
Funktioniert perfekt.
quelle
CSS-Tricks bieten eine gute Lösung für IE 11:
http://css-tricks.com/ie-10-specific-styles/
.NET und Trident / 7.0 sind nur für den Internet Explorer verfügbar und können daher zur Erkennung der IE-Version 11 verwendet werden.
Der Code fügt dann die HTML-Zeichenfolge des Benutzeragenten mit dem Attribut 'data-useragent' zum HTML-Tag hinzu, sodass IE 11 gezielt ...
quelle
Sie können den
< !-- [if IE] >
Hack verwenden, um eine globale js-Variable festzulegen, die dann in Ihrem normalen js-Code getestet wird. Ein bisschen hässlich, hat aber bei mir gut funktioniert.quelle
Ich musste IE gegen fast alles andere erkennen und wollte mich nicht auf die UA-Zeichenfolge verlassen. Ich fand, dass die Verwendung
es6number
mit Modernizr genau das tat, was ich wollte. Ich habe nicht viel Bedenken mit dieser Änderung, da ich nicht erwarte, dass der IE jemals die ES6-Nummer unterstützt. Jetzt kenne ich den Unterschied zwischen einer beliebigen Version von IE und Edge / Chrome / Firefox / Opera / Safari.Weitere Details hier: http://caniuse.com/#feat=es6-number
Beachten Sie, dass ich mir keine Sorgen über falsche Negative von Opera Mini mache. Du könntest sein.
quelle