Je suppose que SVGGElement ( documentation MDN ) n'est pas pris en charge dans jsdom ?
const { JSDOM } = require("jsdom");
const options = {
... your options here ...
};
const dom = new JSDOM(`
<svg>
<g id="g">
</svg>
`, options);
const g = dom.window.document.querySelector("#g");
if (g instanceof SVGGElement) { // throws "SVGGElement is not defined"
console.log("ok");
}
https://jsfiddle.net/p3ag4v85/
(vérifiez dans la console et recherchez ok
)
Je dois dire que j'ai remarqué le bogue lorsque j'ai testé mon code en utilisant Jest, c'est-à-dire en utilisant jsdom en interne. Voici l'erreur que j'ai :
● should throw an Error if g element is not found
expect(received).toThrowError(expected)
Expected message: "group element not found"
Received message: "SVGGElement is not defined"
46 | if (!(svgElement instanceof SVGSVGElement))
47 | throw new Error("svg element not found");
> 48 | if (!(groupElement instanceof SVGGElement))
| ^
49 | throw new Error("g element not found");
50 | this.groupElement = groupElement;
51 | this.groupBBoxWidth = 0;
at new Lib (lib/js/index.js:48:39)
at test/MyLib/constructor.test.js:86:15
at Object.<anonymous> (node_modules/expect/build/toThrowMatchers.js:81:11)
at Object.toThrowError (node_modules/expect/build/index.js:342:33)
at Object.<anonymous> (test/MyLib/constructor.test.js:87:7)
85 | expect(
86 | () => new Lib({ svgIdentifier: "svg", groupIdentifier: "g" })
> 87 | ).toThrowError(new TypeError("group element not found"));
| ^
88 | });
89 |
at Object.<anonymous> (test/MyLib/constructor.test.js:87:7)
SVGElement
est pris en charge. Cependant, votre code recherche SVGElement
dans le Node.js global. Vous devez utiliser dom.window.SVGElement
.
Ouais. Il s'agit bien d'un bug. La spécification ne semble pas être correctement implémentée pour les groupes SVG.
<!DOCTYPE html>
<html>
<body>
<svg id="svg">
<g id="group"></g>
</svg>
<script>
"use strict";
window.addEventListener("load", function() {
const svg = document.getElementById("svg");
const group = document.getElementById("group");
console.dir(svg.constructor); // ƒ SVGSVGElement()
console.dir(group.constructor); // ƒ SVGGElement()
});
</script>
</body>
</html>
"use strict";
const { JSDOM } = require("jsdom");
const dom = new JSDOM(`
<svg id="svg">
<g id="group"></g>
</svg>
`);
const svg = dom.window.document.getElementById("svg");
const group = dom.window.document.getElementById("group");
console.log(svg.constructor); // [Function: SVGSVGElement]
console.log(group.constructor); // [Function: SVGElement]
En effet, il semble que ce soit simplement parce que nous ne prenons pas en charge l'élément SVG g
. Notre support SVG n'est pas très bon pour le moment.
Commentaire le plus utile
En effet, il semble que ce soit simplement parce que nous ne prenons pas en charge l'élément SVG
g
. Notre support SVG n'est pas très bon pour le moment.