Ich erhalte diesen Fehler nach einer trivialen React-Beispielseite:
Nicht erfasster Fehler: Invariante Verletzung: _registerComponent (...): Der Zielcontainer ist kein DOM-Element.
Hier ist mein Code:
/** @jsx React.DOM */
'use strict';
var React = require('react');
var App = React.createClass({
render() {
return <h1>Yo</h1>;
}
});
React.renderComponent(<App />, document.body);
HTML:
<html>
<head>
<script src="/bundle.js"></script>
</head>
<body>
</body>
</html>
Was bedeutet das?
javascript
dom
reactjs
Dan Abramov
quelle
quelle
Antworten:
Zum Zeitpunkt der Ausführung des Skripts ist das
document
Element noch nicht verfügbar, da esscript
sich in der befindethead
. Zwar ist es eine gültige Lösung ist zu halten ,script
inhead
und auf machenDOMContentLoaded
Veranstaltung , ist es noch besser zu Ihrem setzenscript
am unteren Ende derbody
und Wurzelkomponente zu einem machen ,div
bevor es wie folgt aus :und in der
bundle.js
, rufen Sie an:Sie sollten immer in eine verschachtelte
div
statt rendernbody
. Andernfalls können alle Arten von Code von Drittanbietern (Google Font Loader, Browser-Plugins usw.) denbody
DOM-Knoten ändern , wenn React dies nicht erwartet, und seltsame Fehler verursachen, die sehr schwer zu verfolgen und zu debuggen sind. Lesen Sie mehr über dieses Problem.Das Schöne
script
am unteren Rand ist, dass das Rendern erst nach dem Laden des Skripts blockiert wird, falls Sie Ihrem Projekt das Rendern von React-Servern hinzufügen.Update: (07. Oktober 2015 | v0.14 )
Beispiel:
quelle
/index.html
/app.js
(IE9 +)
Hinweis : Wenn Sie
<script async src="..."></script>
den Header verwenden, wird sichergestellt, dass der Browser das JavaScript-Bundle herunterlädt, bevor HTML-Inhalte geladen werden.Quelle: React Starter Kit , isomorpher Lader
quelle
ReactDOM.render
stattReact.render
.defer
kann eine bessere Option seinDie Ready-Funktion kann folgendermaßen verwendet werden:
Wenn Sie jQuery nicht verwenden möchten, können Sie die folgende
onload
Funktion verwenden:quelle
DOMContentLoaded
wäre sogar angemessener zu handhaben alsload
(dies ist, was jQuery verwendet ). Sie können dies auch in JSwindow.addEventListener
ohne Inline-Handler und globale Funktionen tun .$(document).ready
Problem gelöst. Oh und jarender
statt verwendenrenderComponent
.Nur eine wilde Vermutung, wie wäre es, wenn Sie Folgendes zu index.html hinzufügen:
so was:
Bei mir hat es geklappt! :-)
quelle
type="text/javascript"
richtig funktionierte.Ich bin auf den gleichen Fehler gestoßen. Es stellte sich heraus, dass dies durch einen einfachen Tippfehler verursacht wurde, nachdem ich meinen Code geändert hatte von:
zu
Beachten Sie das fehlende '#'. Es hätte sein sollen
Nur posten, falls es jemand anderem hilft, diesen Fehler zu beheben.
quelle
Ja, im Grunde ist das , was Sie getan haben, richtig, außer dass Sie vergessen, dass JavaScript in vielen Fällen synchronisiert ist. Wenn Sie also den Code ausführen, bevor Ihr DOM geladen wird, gibt es nur wenige Möglichkeiten, dies zu lösen:
1) Überprüfen Sie, ob DOM vollständig geladen ist, und machen Sie dann, was Sie wollen. Sie können DOMContentLoaded zum Beispiel anhören :
2) Sehr häufig wird das Skript-Tag am unteren Rand Ihres
document
(nach dem Body-Tag) hinzugefügt :3) Using
window.onload
, das ausgelöst wird, wenn die gesamte Seite geladen wird (img usw.)4) Verwenden
document.onload
, das ausgelöst wird, wenn das DOM bereit ist:Es gibt noch mehr Optionen, um zu überprüfen, ob DOM bereit ist, aber die kurze Antwort lautet: Führen Sie KEIN Skript aus, bevor Sie sichergestellt haben, dass Ihr DOM in jedem Fall bereit ist ...
JavaScript arbeitet mit DOM- Elementen zusammen. Wenn diese nicht verfügbar sind, wird null zurückgegeben , die gesamte Anwendung kann beschädigt werden. Stellen Sie daher immer sicher, dass Sie bereit sind, Ihr JavaScript auszuführen, bevor Sie dies tun.
quelle
Wenn Sie Webpack zum Rendern Ihrer Reaktion verwenden und HtmlWebpackPlugin in Ihrer Reaktion verwenden, erstellt dieses Plugin seine leere index.html selbst und fügt eine js-Datei ein, sodass es kein div-Element enthält, da Sie als HtmlWebpackPlugin-Dokumente Ihren eigenen Index erstellen können. HTML und geben Sie seine Adresse an dieses Plugin in meiner webpack.config.js
und das ist meine index.html Datei
quelle
HtmlWebpackPlugin
Plugin verwenden, wenn es zum Verweisen auf statische HTML-Dateien verwendet wird?In meinem Fall wurde dieser Fehler durch Hot-Reload beim Einführen neuer Klassen verursacht. Verwenden Sie in dieser Phase des Projekts normale Beobachter, um Ihren Code zu kompilieren.
quelle
Für diejenigen, die ReactJS.Net verwenden und diesen Fehler nach einer Veröffentlichung erhalten:
Überprüfen Sie die Eigenschaften Ihrer .jsx-Dateien und stellen Sie sicher, dass auf eingestellt
Build Action
istContent
. Die festgelegten WerteNone
werden nicht veröffentlicht. Ich bin auf diese Lösung aus dieser SO-Antwort gestoßen .quelle
Ich bin auf eine ähnliche / gleiche Fehlermeldung gestoßen. In meinem Fall hatte ich nicht den Ziel-DOM-Knoten, der die ReactJS-Komponente definieren soll. Stellen Sie sicher, dass der HTML-Zielknoten mit der entsprechenden "ID" oder dem "Namen" sowie anderen HTML-Attributen (für Ihre Entwurfsanforderungen geeignet) gut definiert ist.
quelle
Es ist einfach, einfache HTML-CSS-JS zu erstellen und das Skript aus JS zu rendern
quelle
Wenn du hast:
Fehler: Nicht erfasst Fehler: Der Zielcontainer ist kein DOM-Element.
Sie können das DOMContentLoaded- Ereignis verwenden oder Ihr
<script ...></script>
Tag in den unteren Bereich Ihres Körpers verschieben.quelle