我正在尝试在dom中插入一些SVG图标,但是SVG(父节点)始终被use(子节点)替换。有人帮我弄清楚吗?
const icons = [
"html5" ,
"css3" ,
"javascript" ,
"bootstrap" ,
"sass" ,
"node" ,
"mongodb" ,
"d3" ,
"react" ,
"webpack" ,
"wordpress"
];
const tech_icons = document.querySelector( "#techs__icons" );
icons.forEach( icon=> {
const svg = document.createElement( "svg" );
const use = document.createElement( "use" );
svg.setAttribute( "class" , `techs__icon icon icon-${icon}` );
use.setAttribute( "href" , `./src/images/sprites.svg#icon-${icon}` );
tech_icons.appendChild( use ).appendChild( use );
} );
我可以在控制台中成功登录它们,但是它们似乎没有出现在文档中。
我已经将其附加到父节点(techs_icons),但目前无法解决!
更新代码
icons.forEach( icon=> {
const tech_icons = document.querySelector( "#techs__icons" );
const svg = document.createElement( "svg" );
svg.setAttribute( "class" , `techs__icon icon icon-${icon}` );
const use = document.createElement( "use" );
use.setAttribute( "href" , `./src/images/sprites.svg#icon-${icon}` );
svg.appendChild( use );
tech_icons.appendChild( svg );
} );
This snapshot seems to work here
仍然不会在DOM中显示。实际上,它们是附加的,因为当我将它们悬停在检查器中时,它们在那里但不可见。
第二次更新代码
您似乎需要在我的svg> use>“ fake element”中创建某种“ fake”元素,就像shadowRoot一样,我实际上不理解为什么导入SVG文件时浏览器会创建这样的元素! / p>
我在检查元素时发现了它,并发现浏览器实际上自动创建了该阴影。
SVG
<symbol id="icon-html5">
<path d="M2 0h28l-2.547 28.751-11.484 3.249-11.419-3.251-2.551-28.749zM11.375 13l-0.309-3.624 13.412 0.004 0.307-3.496-17.568-0.004 0.931 10.68h12.168l-0.435 4.568-3.88 1.072-3.94-1.080-0.251-2.813h-3.479l0.44 5.561 7.229 1.933 7.172-1.924 0.992-10.876h-12.789z"/>
</symbol>
Inspected code showing the auto created shadow element
const tech_icons = document.querySelector( "#techs__icons" );
const fragment = document.createDocumentFragment();
icons.forEach( icon => {
const svg = document.createElement( "svg" );
const use = document.createElement( "use" );
let shadow = use.attachShadow( { mode : open } );
svg.setAttribute( "class" , `techs__icon icon icon-${icon}` );
use.setAttribute( "href" , `./src/images/sprites.svg#icon-${icon}` );
shadow.appendChild( "I am a: child element inside shadowroot (svg>use>shadowroot>ME)" );
svg.appendChild( use );
fragment.appendChild( svg );
});
tech_icons.appendChild( fragment );
因此,现在来回顾一下:
问题仍然存在,将阴影添加到use元素时,DOM或控制台实际上都不会显示任何内容!
答案 0 :(得分:1)
componentDidMount (){
const script = document.createElement("script");
const script1 = document.createElement("script");
const script2 = document.createElement("script");
script.src = 'assets/js/jquery.showmore.js';
script1.src = 'assets/js/showmore.js';
script2.src = 'assets/js/owl-carousel.js';
script.async = true;
script1.async = true;
script2.async = true;
document.body.appendChild(script);
document.body.appendChild(script1);
document.body.appendChild(script2);
}
答案 1 :(得分:0)
我使用以下更正的代码与您的Codepen一起玩耍:
const icons = [
"html5" ,
"css3" ,
"javascript" ,
"bootstrap" ,
"sass" ,
"node" ,
"mongodb" ,
"d3" ,
"react" ,
"webpack" ,
"wordpress"
];
icons.forEach( icon=> {
const tech_icons = document.getElementById( "techs__icons" );
const svg = document .createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute( "class" , `techs__icon icon icon-${icon}` );
const use = document .createElementNS("http://www.w3.org/2000/svg", "use");
use.setAttribute( "xlink:href" , `./src/images/sprites.svg#icon-${icon}` );
svg.appendChild( use );
tech_icons.appendChild( svg );
console.log(tech_icons);
} );
在控制台中进行检查时,将创建SVG元素,并在文档的DIV中占据空间,但它们似乎为空或不可见。所以我要怪sprites.svg文件。
答案 2 :(得分:0)
SVG元素不是标准的HTML,因此您需要在createElementNS()
方法中指定SVG命名空间:
const svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' )
const use = document.createElementNS( 'http://www.w3.org/2000/svg', 'use' )
还必须在SVG源文件中的xmlns
属性中指定名称空间:
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="icon-html5">
<path d="M2 0h28l-2.547 28.751-11.484 3.249-11.419-3.251-2.551-28.749zM11.375 13l-0.309-3.624 13.412 0.004 0.307-3.496-17.568-0.004 0.931 10.68h12.168l-0.435 4.568-3.88 1.072-3.94-1.080-0.251-2.813h-3.479l0.44 5.561 7.229 1.933 7.172-1.924 0.992-10.876h-12.789z"/>
</symbol>
</svg>
答案 3 :(得分:-1)
var mylist = document.getElementById("myList")
list.forEach(item){
var node = document.createElement("LI"); // Create a <li> node
var textnode = document.createTextNode(item); // Create a text node
node.appendChild(textnode); // Append the text to <li>
mylist.appendChild(node) //Append to<Ul> id="myList"
}