Es ist vielleicht das Allerallereste, das viele Leute in JavaScript lernen
alert("Hello, World");
Eines Tages wachten wir bei CodePen mit einer Flut von Kundensupport-Anfragen auf, da ihre Pens kaputt waren. Das lag letztendlich daran, dass eine Version von Chrome veröffentlicht wurde, bei der alert() in Cross-Origin-Iframes nicht mehr funktionierte. Und alle anderen nativen „JavaScript-Dialoge“ wie confirm(), prompt() und ich-weiß-nicht-was-noch-alles (onbeforeunload?, .htpasswd geschützte Assets?).
Cross-Origin-Iframes sind im Wesentlichen das Herzstück dessen, wie CodePen funktioniert. Sie schreiben Code und wir führen ihn für Sie in einem Iframe aus, der nicht dieselbe Domain wie CodePen selbst teilt, als erste Sicherheitsmaßnahme. Wir hatten keine Vorwarnung oder so etwas gehört, aber ich bin sicher, die Pläne lagen offen.
Ich twitterte aus Verdruss. Ich verstehe, dass es hier potenzielle Sicherheitsbedenken gibt. JavaScript-Dialoge sehen gleich aus, egal ob sie von einem Iframe ausgelöst werden oder nicht. Daher sind sie offenbar bestenfalls verwirrend, wenn sie von einem Iframe ausgelöst werden, insbesondere von einem Cross-Origin-Iframe, bei dem die übergeordnete Seite wahrscheinlich wenig Kontrolle hat. Nun, abgesehen von, wissen Sie, einer Website wie CodePen. Chrome nennt auch Performance-Bedenken, da diese JavaScript-Dialoge naturgemäß den Haupt-Thread blockieren, wenn sie offen sind, was im Wesentlichen alles anhält.
Es gibt jedoch allerlei Sicherheits- und UX-Ärgernisprobleme, die von Iframes ausgehen können. Deshalb gibt es Sandboxing. Ich kann das tun
<iframe sandbox></iframe>
Und dieser Kerl ist abgeriegelt. Wenn ein Formular etwas darin einreichen würde: nein, funktioniert nicht. Was ist, wenn es versucht, einen Download auszulösen? Nein. Gerätespeicherzugriff anfordern? Auf keinen Fall. Es kann nicht einmal JavaScript überhaupt laden. Das heißt, es sei denn, ich lasse es zu
<iframe sandbox="allow-scripts allow-downloads ...etc"></iframe>
Warum also kein Attribut für JavaScript-Dialoge? Ironischerweise gibt es bereits eines: allow-modals. Ich bin mir nicht ganz sicher, warum das nicht ausreicht, aber soweit ich weiß, ist die Zerstörung von JavaScript-Dialogen in Cross-Origin-Iframes nur ein Sprungbrett für das ultimative Ziel: sie komplett von der Webplattform zu entfernen.
Verdammt. Komplett? Das ist das Wort. Stellen Sie sich die Anzahl der Programmier-Tutorials vor, die einfach kaputt gehen werden.
Vorerst ist selbst die Entfernung für Cross-Origin auf Januar 2022 verschoben, aber soweit wir wissen, wird dies fortgesetzt und dann werden weitere Schritte unternommen, um sie vollständig zu entfernen. Dies wird von Chrome angeführt, aber die Statusberichte zeigen, dass sowohl Firefox als auch Safari mit der Änderung einverstanden sind. Außerdem ist dies eine spezifizierte Änderung, also können wir hier buchstäblich überall mit den Fingern wackeln, wenn Sie, wie ich, das Gefühl haben, dass dies nicht besonders gut gehandhabt wurde.
Was uns bisher mitgeteilt wurde, ist die Lösung, postMessage zu verwenden, wenn Sie diese Funktionalität für Cross-Origin-Iframes wirklich unbedingt beibehalten müssen. Dies sendet den String, den der Benutzer in window.alert verwendet, an die übergeordnete Seite und löst den Alarm von dort aus. Ich bin kein großer Fan davon, weil
postMessageist nicht blockierend wie JavaScript-Dialoge. Das ändert den Anwendungsfluss.- Ich muss Code in den Code der Benutzer injizieren. Das ist neue technische Schuld und es kann die Erwartungen an die erwartete Benutzerausgabe beeinträchtigen (z. B. ein zusätzliches
<script>in ihrem HTML hat seltsame Auswirkungen, wie z. B. die Änderung dessen, was:nth-childund ähnliche auswählen). - Ich bin generell besorgt, irgendetwas benutzergeneriertes an ein übergeordnetes Element zur Ausführung zu übergeben. Ich bin sicher, es gibt theoretische Wege, dies sicher zu tun, aber XSS-Angriffsvektoren sind immer überraschend in ihrer Genialität.
Selbst weniger drastische Vorschläge, wie window.alert = console.log, haben im Wesentlichen die gleichen Probleme.
Gestatten Sie mir, das Mikrofon an andere für ihre Meinungen weiterzugeben.
Könnte der Alarm auf das Iframe beschränkt werden, anstatt im übergeordneten Fenster angezeigt zu werden?
Jaden Baptista, Twitter
Ja, bitte! Löst das nicht einen großen Teil davon? Und macht die UX dieser Dialoge nützlicher? Platziert die verdammten Dialoge im <iframe>.
„Brecht das Web nicht.“ zu „Brecht 90% des Webs nicht.“ und jetzt „Brecht das Web, dessen Inhalt wir zustimmen.“ nicht.
Matthew Phillips, Twitter
Ich respektiere den Wunsch, ungelenke Teile [der HTML-Spezifikation] loszuwerden, die als historische Fehler angesehen werden können und Implementierungskomplexität verursachen, aber ich kann das Gefühl nicht loswerden, dass die bestehenden Anwendungsfälle mit sehr wenig Respekt oder Neugier behandelt werden.
Dan Abramov, Twitter
Es ist seltsam für mich, dass dies Teil der HTML-Spezifikation und nicht der JavaScript-Spezifikation ist. Oder?
Ich dachte immer, es gäbe eine Art „Oberste Direktive“, das Web nicht zu brechen? Ich habe buchstäblich webbasierte Spiele gesehen, die
Ben Lesh, Twitteralertals „Pause“ verwendeten und die blockierende Natur als Funktion nutzten. Wie:<button onclick="alert('paused')">Pause</button>[.] Lustig, aber wahr.
Eine Metrik wurde zitiert, die besagt, dass nur 0,006 % aller Seitenaufrufe ein Cross-Origin-Iframe enthalten, das diese Funktionen verwendet, doch
Scheint eine irreführende Metrik für etwas wie
Dan Abramov, Twitterconfirm()zu sein. Wenn zum Beispiel der Fluss zur Kontolöschungconfirm()verwendet und aufgrund einer Änderung daran kaputt geht, bedeutet das nicht, dass der Fluss zur Kontolöschung nicht wichtig war. Es bedeutet nur, dass die Leute ihn nicht in jeder Sitzung aufrufen.
Das ist es, was mich zusätzlich beunruhigt: alert() ist eine Sache, aber confirm() gibt buchstäblich true oder false zurück, was bedeutet, dass es eine logische Kontrollstruktur in einem Programm ist. Die Entfernung davon bricht Websites, keine Frage. Chris Ferdinandi hat mir diese kleine obskure Website gezeigt, die es verwendet.

Wo wir gerade von Chris sprechen
Das herablassende „hast du es wirklich gelesen, es ist so klar“ ist patronisierend AF. Es ist das Äquivalent von „nur“ oder „einfach“ in der Entwicklerdokumentation.
Ich habe es gelesen. Ich habe es nicht verstanden. Deshalb habe ich jemanden gefragt, dessen Aufgabe es buchstäblich ist, mit Entwicklern über Änderungen zu kommunizieren, die Chrome an der Plattform vornimmt.
Dies ist nicht auf einen Entwickler bei Chrome beschränkt. Der gesamte Nachrichtenthread, in dem diese Änderung aufgetaucht ist, ist voller Leute, die Chrome bitten, diesen Vorschlag nicht weiterzuverfolgen, da er alles kaputt machen wird.
Chris Ferdinandi, „Google vs. the web“
Und hier ist Jeremy
[…] brechende Änderungen passieren auf dem Web nicht oft. Sie sind – und sollten sein – selten. Wenn sich das ändern würde, würde das Web massiv unter der Vorhersagbarkeit leiden.
Zweitens liegt die Verantwortung nicht bei den Webentwicklern, ältere Funktionen im Auge zu behalten, die von der Abschaffung bedroht sind. Das liegt bei den Browserherstellern. Ich hoffe aufrichtig, dass von uns nicht erwartet wird, dass wir eine Seite namens
Jeremy Keith, „Foundations“canistilluse.comkonsultieren.
Ich habe hier ein ziemlich düsteres Bild gezeichnet. Um fair zu sein, gab es einige Tweets mit der Stimmung Ja!! Endlich!!, aber sie fühlten sich für mich nicht wie kritische Einschätzungen an, sondern eher wie zufälliges Google-Jubel.
Ob Sie es glauben oder nicht, ich bin im Allgemeinen ein Fan von Google und denke, dass sie gute Arbeit leisten, das Web voranzutreiben. Ich denke auch, dass es angebracht ist, mit dem Finger zu zeigen, wenn ich Probleme sehe und sie bitte, sich zu verbessern. „Besser“ bedeutet hier viel mehr Entwickler- und Nutzer-Outreach, um die Situation zu erläutern, viel mehr Gespräche über die potenziellen Auswirkungen und Übergangsideen und viel mehr Offenheit, den Kurs zu ändern.
Google ist viel zu groß für seine Verhältnisse geworden.
Hallo. Ich teile Ihre Bedenken hinsichtlich dieser Änderung, obwohl ich nicht viel mit Iframes arbeite. Die relevanten Antworten auf diese vorgeschlagene Änderung sowie Ihr Artikel sind jedoch sehr überzeugend.
Ich möchte wissen, ob Sie Ihre Aussage bezüglich der Eventualität, dass alle Anbieter-Alarme abgeschafft werden, klären könnten
„…aber soweit ich weiß, ist die Zerstörung von JavaScript-Dialogen in Cross-Origin-Iframes nur ein Sprungbrett für das ultimative Ziel: sie komplett von der Webplattform zu entfernen.“
Ich habe das in Ihren Hyperlinks nicht gesehen. Aber wenn sie das planten, würden sie es wahrscheinlich nicht so klar sagen. Gibt es einen Grund, warum Sie dies als Unvermeidlichkeit betrachten?
Das ist eine großartige Frage, ich schätze Ihre Skepsis als jemand, der zu oft liest, ohne über solche Dinge nachzudenken. Ich bin neugierig zu sehen, ob der Autor antwortet.
Das ist Teil des Problems, Matt. Diese vollständige Abschaffung wird tief in den Kommentaren kommuniziert.
Hier ist einer der ersten Orte, an denen sie darüber sprechen: https://groups.google.com/a/chromium.org/g/blink-dev/c/hTOXiBj3D6A/m/Ut5AZXwuBAAJ
Sie behaupten, es sei noch weit entfernt, und das ist in Ordnung, aber das überrascht die Leute immer noch. Besonders nachdem sie sie bereits in einem bestimmten Kontext ohne klare Warnung kaputt gemacht haben. Wie sollen wir ihnen vertrauen, dass sie nicht wieder dasselbe tun?
Domenic Denicola, Chrome Web Standards Team: https://groups.google.com/a/chromium.org/g/blink-dev/c/hTOXiBj3D6A/m/Ut5AZXwuBAAJ
Ja, sie planen tatsächlich die Abschaffung für alle Websites und Implementierungen.
Ich weiß nicht, warum ich fast sicher war, dass wir Änderungen an der Alert-Funktion sehen würden, aber das habe ich nicht erwartet!
Ich dachte, wir würden eine Anpassung/Stilierung erhalten, ich dachte, sie wären zum Beispiel asynchron.
Ich denke, das geht zu weit.
Erinnern Sie sich, was passiert ist, als Microsoft dachte, sie würden das Web mit Internet Explorer besitzen?
☝️
➕♨️
Es gibt brechende Änderungen, die wir uns wünschen würden, aber es wird nicht dazu kommen, weil eine obskure Website diese hässliche alte Bibliothek verwendet, die den globalen Raum verschmutzt hat.
Und es gibt brechende Änderungen, die wir uns nicht wünschen, die aber die einfache, effiziente und zugängliche Art der Interaktion mit dem Benutzer wegnehmen werden.
Wenn Google der eigentliche Besitzer von Microsoft Windows wäre, würde keine Software, die vor 20 Jahren geschrieben wurde, heute noch laufen. Ich hasse die Produkte von Google und werde niemals ein scheiß OS von ihnen auf meinen Computern verwenden.
Wenn Sie uns zwingen, den Cookie-Topf zu zerstören, dann werden wir Ihnen… Ihre… Ihre JavaScript-Dialoge wegnehmen! Ja, das ist es, wir nehmen Ihnen Ihre JavaScript-Dialoge weg!
https://dev.to/richharris/stay-alert-d
Ich hatte gehofft, sie würden
alert,confirmundpromptweiterentwickeln, damit wir sie stylen könnten! Sind diese Methoden aber nicht der einzige Weg, JavaScript wirklich zu pausieren, während man auf Benutzereingaben wartet?Rich Harris hat auch einen Artikel darüber geschrieben.
Ich versuche immer noch herauszufinden, warum
allow-modalsdafür nicht ausreicht. Ich stimme voll und ganz zu, dass Änderungen auf dem Niveau von „Breaking the Web“ selten sein und außergewöhnliche Bedingungen für ihre Akzeptanz erfordern sollten.Das wurde mir von einem Kollegen gezeigt, aber viele Router (einschließlich moderner 6E-Router) verlangen von Ihnen, sich über einen JS-Dialog anzumelden.
Das wird also ein riesiges Problem sein, das den Router-Zugriff für viele brechen wird.
Die meisten davon sind keine Alerts oder Confirms. Die meisten sind HTTP Basic Auth Credential-Prompts. Sie sind völlig anders und nicht mal JavaScript. Diese werden vom Browser selbst verwaltet.
Warum nicht zumindest das
<dialog>Element vorantreiben undalert,confirmundprompteinfach eine Spezifikation eines<dialog>auslösen lassen, das lokal für den gegebenen Frame ist?Aber ich wäre ziemlich glücklich, wenn ich nie wieder einen verdrehten
.confirm()mit dem Text „Klicken Sie auf Abbrechen zum Speichern und OK zum Überraschenden tun.“ sehen müsste.Jemand hat mir ein Beispiel geschickt, wie Googles Gmail alert verwendet, um einen Benutzer über wichtige Informationen zu informieren.
Es gibt auch die Auswirkungen auf die Barrierefreiheit, die ich bisher noch nicht viel erwähnt gesehen habe. Ich habe vor einiger Zeit über diese Auswirkungen auf die Barrierefreiheit geschrieben, aber im Grunde genommen tun diese Modal-Fenster derzeit vieles, was den Ersatz der ordentlichen Ein-Zeilen-
alert()durch Dutzende von Zeilen JavaScript erfordern würde, etwas, das viele Entwickler einfach nicht tun werden, weil sie zeitlich oder in Bezug auf das Bewusstsein für Barrierefreiheit eingeschränkt sind (ich gehe nicht davon aus, dass es ihnen egal ist, denn fast alle Entwickler kümmern sich darum). Die aktuellen Modal-Fenster tun Dinge wieVerhindern Sie den Zugriff auf den darunter liegenden Inhalt, sowohl per Maus als auch per Tastatur (sowie jedes andere Eingabegerät), bis das Modal geschlossen wird. Das ist nicht trivial, da das Abfangen von Tastatureingaben kompliziert werden kann.
Sie handhaben den Fokus, indem sie ihn beim Anzeigen auf das Modal verschieben und beim Schließen zurück.
Sie präsentieren sich assistierenden Technologien als ihre Modal-Art, was diesen Benutzern eine Erwartung gibt, was als Nächstes passieren wird.
Sie halten die Ausführung aller JavaScript an, was verhindern kann, dass der darunter liegende Inhalt aktualisiert wird und Menschen verwirrt, die am anfälligsten für solche unerwarteten Änderungen sind.
Von Michael Michlin (wurde in einem Cloudflare-Filter gefangen)
Lieben Sie Google nicht manchmal?
Nur ein Update… ab dem 4. November 2021 hat Chrome mitgeteilt, dass sie diese Abschaffung von Alerts/Confirms auf unbestimmte Zeit verschieben und eine Opt-in-Berechtigungsfunktion in Betracht ziehen, um sie zu erhalten, auch wenn sie sie später in Zukunft standardmäßig deaktivieren.
Quelle: https://groups.google.com/a/chromium.org/g/blink-dev/c/hTOXiBj3D6A/m/JPELPWqUAAAJ
Scheint eine gute Bewegung zu sein.
Immer noch von Interesse für mich