js更优雅的兼容_javascript技巧
问题种种做底层接口兼容,无非就是利用if,判断客户端支持哪个接口的问题。最著名的例子就是事件:
var addEvent = function(e, what, how) {
if (e.addEventListener) e.addEventListener(what, how, false)
else if (e.attachEvent) e.attachEvent('on' + what, how)
}
这里考虑了给元素绑定事件时可能遇到的两种状况——标准的W3C DOM接口以及DHTML提供的接口。当然这个例子还很粗糙,但足够说明问题了。
原先的方法是在兼容层调用有现场判断并进入相应的if分支。很显然,这种“现场判断”的方法效率并不高。后来,人们采用这样的办法:
if (MSIE) {
addEvent = function(e, what, how) {
e.attachEvent('on' + what, how);
}
} else {
addEvent = function(e, what, how) {
e.addEventListener(what, how);
}
}
在一次判断后给addEvent绑定不同的代码,从而免去了运行时的分支判断。
很可惜,这个问题也不小。首先把“采用attachEvent”和“客户端是MSIE”绑定在一起是个很过时的想法。假如微软哪天良心发现了怎么办?这事情现在就发生了——IE9明确支持了DOM接口,甚至DOM3都支持。结果,就这个“良心发现”的举动会毁掉许多前端库,他们必须被迫修改代码(如同IE8来时那样)。况且这种做法没有考虑“未知的客户端”——据我所知,Google发布Chrome后也导致不少类库重写代码。
特性检测那究竟该怎么做?特性检测就可以最大限度地避免“新客户端”带来的麻烦——通过一组在类库初始化时定义的代码来检测客户端拥有的特性,并利用这一组检测值绑定类库代码:
var supportsAddEventListener = !!(checkerElement.addEventListener);
if (supportsAddEventListener) {
addEvent = function(e, what, how) {
e.addEventListener(what, how);
}
} else if (supportsAttachEvent) {
addEvent = function(e, what, how) {
e.attachEvent('on' + what, how);
}
}
特性检测实际上是将“使用某个客户端”和“支持某个特性”进行解耦——让if分支直接针对“特性有无”(接口是否一致)判断,从而消除客户端制造商“良心发现”造成的“好心办坏事”。事实上这么做也是符合历史潮流之选——当标准接口逐渐普及,客户端之间渐渐“表征一致”时,为什么不做个一致的兼容层接口呢?
跌落让我们重新看看这些代码。通常,一条利用特性检测进行兼容的代码往往是这样:
if (new_interface_detected) {
comp = function() {uses_new_interface};
} else if (old_interface_detected) {
comp = function() {uses_old_interface};
} else {
throw new Error('Unadaptable!')
}
换言之,过程是:
如果客户端支持新接口,就将兼容层绑定到新接口上
否则,如果客户端支持老接口/不一致接口,就将兼容层绑定到老接口上
否则,如果可以的话,给出错误回馈
亦即,兼容层程序是从高空“掉”下来,如果客户端支持“高级”特性(新接口、标准接口)就将它“接住”——兼容层就有了归宿;否则继续向下掉——哦,老接口接住了,就用老接口;如果一直没人接住,于是——啪——摔倒了地上,并且用最后一口气喊一声:“你用的客户端太小众,我拿你没办法了!”
这和什么比较像?事实上,如果你了解JavaScript对象系统的机理,你就可以类比:这不就是原型嘛!原型系统就是利用了这种跌落——寻找某个成员,如果它在这个对象里定义了,就返回之;否则沿着原型链向上搜(没错,这次是向上的),如此重复,直到真的连原型链都到头的时候,返回个undefined。
说做就做!这里同样用addEvent为例。首先,我们定义一个空驱动,它里面什么都不包含:
var nullDriver = {}然后,就是创建个对象,并且把原型链指向它。在ECMA V5时代,我们可以用Object.create,可惜,现在还有N多老客户端(否则做什么兼容啊),所以自己craft个函数:
var derive = Object.create ? Object.create: function() {
var T = function() {};
return function(obj) {
T.prototype = obj;
return new T
}
}()
这个用法你可能会觉得很诡异,但它工作起来一点问题没有,速度也不慢——能达到Object.create的一半。我们就用这个derive开动:
var dhtmlDriver = derive(nullDriver);
var dhtmlDriverBugfix = derive(dhtmlDriver);这里的bugfix是针对一些“bug”和特殊情况定义的特别Driver。这里你可以忽略它。好了,DHTML里面addEvent是什么来着?
if (supportsAttachEvent) {
dhtmlDriver.addEvent = function(e, what, how) {
e.attachEvent('on' + what, how)
}
}
然后呢?位于原型链最前端的应该是W3C的标准驱动啊,写上!
var w3cDriver = derive(dhtmlDriverBugfix);
var w3cDriverBugfix = derive(w3cDriver);
if (supportsAddEventListener) {
w3cDriver.addEvent = function(e, what, how) {
e.addEventListener(what, how)
}
}
最后,我们就放个东西上去做最后调用的接口。(因为w3cDriverBugfix太难看……)
var driver = derive(w3cDriverBugfix);
然后就调用好了。看,这就让那些长得吓人的分支判断变得简单有效,但不失fallback本色:在支持addEventListener上调用addEvent等价于调用w3cDriver.addEvent,而在不支持addEventListener的客户端上就会跌落到底下,比如调用dhtmlDriver.addEvent。另外,进行bugfix也很容易——可以在专门的“bugfix”层进行hook,而原有层丝毫不受影响。
等等,继承这么多层会很慢么?诚然,那么深的原型链肯定会慢,不过我有办法。还记得给对象的属性写入时会发生什么事情吗?
var ego = function(x) {return x}
for (var each in driver) {
if (! (each in nullDriver)) {
driver[each] = ego(driver[each])
}
}
没错,原来高企在原型链上面的方法会“哗”的一下掉到最下面!这回不用沿着原型链向上搜了,直接从最底端获取属性即可。这里用ego函数的原因是防止一些浏览器“优化掉”这里的代码。
总结虽然这里谈兼容,可是,它的精华却在语言特性上——利用原型继承,我们可以很优雅地完成这个令人头疼的操作。是的,框架的美感不应该只在外表,其内部——即使是最最令人烦的内部——也同样要优雅。
这里的技术可以在dess中找到。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Viele Benutzer werden beim Betrieb des Computers auf Abstürze oder Bluescreens stoßen. Zu diesem Zeitpunkt müssen wir die stabilste Win10-Version für den Betrieb finden. Insgesamt ist sie sehr einfach zu bedienen und kann Ihren täglichen Gebrauch reibungsloser gestalten. Die stabilste Win10-Version in der Geschichte. 1. Win10-Originalsystem. Hier können Benutzer einfache Vorgänge verwenden. Das System verfügt über eine starke Stabilität, Sicherheit und Kompatibilität. Benutzer können die Schritte befolgen, um die perfekte Maschine zu erhalten gestrafft Die Version von win10 wurde strikt gestrafft und viele unnötige Funktionen und Dienste wurden gelöscht. Nach der Optimierung hat das System eine geringere CPU- und Speicherauslastung und läuft schneller. 3. Win10 Lite Edition 1909 ist auf mehreren Computern mit unterschiedlichen Hardwaremodellen installiert.

Switch2 ist ein neues Modell, das Nintendo auf der Gamescom 2023 angekündigt hat. Einige Spieler sind besorgt darüber, ob es Kompatibilitätsprobleme zwischen dem neuen Modell und der Vorgängerversion der Kassette geben wird. Ist Switch2 mit der Switch-Kassette kompatibel? Antwort: Switch2 ist nicht mit der Switch-Kassette kompatibel. Einführung von Switch 2-Kassetten Nach Angaben des Produktionskettenunternehmens von Nintendo kann die Switch 2 64-GB-Kassetten verwenden. Da es eine bessere Leistung bietet und mehr 3A-Spielmeisterwerke unterstützt, ist eine größere Kassettenkapazität erforderlich. Denn viele Spielewerke müssen kastriert und komprimiert werden, bevor sie in eine Spielekassette gestopft werden können. Darüber hinaus neigen Switch-Kassetten dazu, Spielinhalte zu kopieren. Ersetzen Sie sie daher durch neue Kassetten.

Wie wir alle wissen, besteht ein Hauptmerkmal von Win11 darin, dass es mit dem Android-Subsystem ausgestattet ist, das es uns ermöglicht, Android-Software zu installieren, ohne einen Emulator zu verwenden. Allerdings gibt es auch das Problem, dass Win11-Android-Anwendungen hängen bleiben ? Ist Win11 nicht mit dynamischen Hintergrundbildern kompatibel? Antwort: Win11 ist mit dynamischen Hintergrundbildern kompatibel. Wenn es nicht verwendet werden kann, liegt das möglicherweise daran, dass die Software- oder Systemversion im Rückstand ist. Wenn es gerade aktualisiert wurde, wird es möglicherweise vom Systemhintergrund verdeckt. 1. Wenn die System- oder Softwareversion im Rückstand ist, aktualisieren Sie einfach das System und die Software für dynamische Hintergrundbilder. 2. Wenn es vom Systemhintergrund verdeckt wird, können Sie versuchen, „Einstellungen“ zu öffnen. 3. Geben Sie dann unter „Personalisierung“ die Einstellungen für „Hintergrund“ ein. 4. Ändern Sie dann den personalisierten Hintergrund in „Bild“. 5. Nachdem die Änderung abgeschlossen ist, können Sie das dynamische Hintergrundbild normal einstellen

In den letzten Jahren hat die Beliebtheit des Android-Systems im Bereich mobiler Geräte rasant zugenommen und viele Menschen haben begonnen, darauf zu achten, ob Android-Anwendungen auch auf anderen Plattformen ausgeführt werden können. Als gängiges Betriebssystem wird Linux von vielen Menschen bevorzugt. Die Frage ist also: Ist das Linux-System mit Android-Software kompatibel? Zunächst muss klargestellt werden, dass das Linux-System und das Android-System gewisse Ähnlichkeiten im Kernel aufweisen. Beide Betriebssysteme basieren auf dem Linux-Kernel. Daher kann das Linux-System theoretisch ausgeführt werden

So beheben Sie die Inkompatibilität von d3dx9_43.dll. In den letzten Jahren hat uns die rasante Entwicklung von Computern und Spielen ermöglicht, mehr Unterhaltung und Komfort zu genießen. Allerdings kann es bei der Installation oder Ausführung bestimmter Programme manchmal zu Fehlermeldungen wie „d3dx9_43.dll ist inkompatibel“ kommen. Wie sollen wir in diesem Fall dieses Problem lösen? Lassen Sie uns zunächst verstehen, was diese Fehlermeldung bedeutet. d3dx9_43.dll ist eine Systemdatei von DirectX, die im Betriebssystem verwendet wird

Der Grund, warum viele Freunde immer noch das Win7-System anstelle des Win10-Systems wählen, ist, dass sie Angst vor schlechter Kompatibilität haben. Tatsächlich kann das Win10-System jetzt den Kompatibilitätsmodus von Win7 festlegen. Sie müssen nur die Einstellungen in den Eigenschaften ändern. Wie mache ich Win10 mit Win71 kompatibel? Klicken Sie zunächst mit der rechten Maustaste auf das Programm, das wir unter dem Win7-System ausführen müssen, öffnen Sie dann „Eigenschaften“ 2 und klicken Sie dann oben auf „Kompatibilität“, um die Registerkarte „Kompatibilität“ aufzurufen. 3. Aktivieren Sie im Kompatibilitätsmodus „Dieses Programm im Kompatibilitätsmodus ausführen“. 4. Wählen Sie dann „Windows 7“ aus dem Dropdown-Menü unten. 5. Klicken Sie nach Abschluss einfach auf „Übernehmen“ oder auf „OK“.

Was soll ich tun, wenn ich auf eine inkompatible Version von Eclipse stoße? [Einführung] Als beliebtes Entwicklungstool bietet Eclipse nicht nur leistungsstarke Funktionen und umfangreiche Plug-Ins, sondern verfügt auch über plattformübergreifende Funktionen. Bei der Verwendung von Eclipse kann es jedoch manchmal zu Versionsinkompatibilitätsproblemen kommen, die dazu führen können, dass das Programm nicht ordnungsgemäß ausgeführt wird oder Fehler bei der Kompilierung auftreten. In diesem Artikel wird beschrieben, wie mit der Inkompatibilität der Eclipse-Version umgegangen wird, und einige Codebeispiele zur Lösung häufiger Kompatibilitätsprobleme bereitgestellt. [Lösung] Update Ecl

Viele Website-Benutzer müssen beim Surfen die alte Version des Browsers verwenden, und die neue Version muss kompatible Ausgänge hinzufügen, bevor sie verwendet werden kann. Daher werde ich Ihnen heute ein detailliertes Tutorial zum Hinzufügen kompatibler Ausgänge in Win11 vorstellen und lernen. So fügen Sie kompatible Steckdosen in Win11 hinzu 1. Öffnen Sie zunächst den IE-Browser im System, klicken Sie auf das kleine Zahnrad in der oberen rechten Ecke des Browsers, um „Einstellungen“ aufzurufen. 2. Öffnen Sie dann im sich öffnenden Einstellungsmenü „Einstellungen der Kompatibilitätsansicht“. 3. Geben Sie die hinzuzufügende URL in das Bearbeitungsfeld unter „Diese Website hinzufügen“ ein und klicken Sie dann auf „Hinzufügen“. 4. Abschließend sehen Sie unten den Domainnamen der hinzugefügten URL und können durch Schließen des Fensters direkt darauf zugreifen.
