Merge pull request #1376 from ae-utbm/fix-link-once

Fix crashes on *-once elements when called at bad timings
This commit is contained in:
2026-05-06 23:23:02 +02:00
committed by GitHub
2 changed files with 8 additions and 4 deletions
@@ -84,7 +84,11 @@ const refreshElement = <
return; return;
} }
element.refresh(); // This might be called at some bad timing
// This prevents crashes of the observer
if (element.refresh) {
element.refresh();
}
} }
}; };
@@ -130,7 +134,7 @@ startObserver(observer);
export class LinkOnce extends elementOnce("link") { export class LinkOnce extends elementOnce("link") {
getElementQuerySelector(): string { getElementQuerySelector(): string {
// We get href from node.attributes instead of node.href to avoid getting the domain part // We get href from node.attributes instead of node.href to avoid getting the domain part
return `link[href='${this.node.attributes.getNamedItem("href").nodeValue}']`; return `link[href='${this.node.attributes.getNamedItem("href")?.nodeValue}']`;
} }
} }
@@ -142,6 +146,6 @@ export class LinkOnce extends elementOnce("link") {
export class ScriptOnce extends inheritHtmlElement("script") { export class ScriptOnce extends inheritHtmlElement("script") {
getElementQuerySelector(): string { getElementQuerySelector(): string {
// We get href from node.attributes instead of node.src to avoid getting the domain part // We get href from node.attributes instead of node.src to avoid getting the domain part
return `script[src='${this.node.attributes.getNamedItem("src").nodeValue}']`; return `script[src='${this.node.attributes.getNamedItem("src")?.nodeValue}']`;
} }
} }
@@ -3,7 +3,7 @@
<script-once type="module" src="{{ js }}"></script-once> <script-once type="module" src="{{ js }}"></script-once>
{% endfor %} {% endfor %}
{% for css in statics.css %} {% for css in statics.css %}
<link-once rel="stylesheet" type="text/css" href="{{ css }}" defer></link-once> <link-once rel="stylesheet" type="text/css" href="{{ css }}"></link-once>
{% endfor %} {% endfor %}
<{{ component }} name="{{ widget.name }}" {% include "django/forms/widgets/attrs.html" %}> <{{ component }} name="{{ widget.name }}" {% include "django/forms/widgets/attrs.html" %}>