【问题标题】:How to change element's specific children attributes and content after cloning克隆后如何更改元素的特定子属性和内容
【发布时间】:2021-08-03 11:01:30
【问题描述】:

我一直在阅读几个看似相似的问题,但没有找到一个可以解决我的问题或建议的解决方案解决了我的问题

我有以下html:

<div id="template">
    <div class="section1" id="sec1">                
        <div class="content">
            <img id="sec1-is" *ngIf="!tstEnded" src="assets/images/r1.png" srcset="assets/images/r1@2x.png 2x,assets/images/r1@3x.png 3x" >
            <img id="sec1-if" *ngIf="tstEnded" src="assets/images/r2.png" srcset="assets/images/r2@2x.png 2x,assets/images/r2@3x.png 3x" />
            <div class="audio-controls">
                <button *ngIf="do1()" (click)="act1()" class="control-btn r1-btn" [ngClass]="{'disabled':!r1Enabled()}"></button>
                <button *ngIf="do2()" (click)="act2()" class="control-btn r2-btn" [ngClass]="{'disabled':!r2Enabled()}"></button>
            </div>
            <div class="test-wrapper">
                <span class="test-line">
                    {{eta}}
                </span>
            </div>
            <div class="test-wrapper">
                <div class="test" tst testType="R" (tstGo)="go($event)"></div>
            </div>
        </div>              
    </div>                  
    <div class="section2" id="sec2" style="background-image: linear-gradient(to top, #d0f6f6, rgba(255, 255, 255, 0));">
        <div class="content">
            <div *ngIf="ended">         
                <img *ngIf="!open" class="case1" (click)="case1()" src="assets/images/case1c.svg" />
                <img *ngIf="open" class="case1" src="assets/images/case1.svg" />
            </div>
        </div>
    </div>
</div>

克隆template 后,我希望更改第1 和第2 部分的id 属性以及section1 图像sec1-issec1-ifsrcsrcset 并改变

let itm = document.getElementById("template");
let cln = itm.cloneNode(true);

如何在不遍历 template 的所有子代和孙代的情况下获得特定的“嵌套”元素,搜索正确的标签?

【问题讨论】:

  • cln.setAttribute("id-to-obj", "2949019043");或将 id-to-obj 更改为您想要的任何内容?我会识别元素并以某种方式将其记录下来? :) 调整答案以给出更好的主意,然后您可以根据属性查询选择器,这是一个不同的问题或简单的搜索。 :)

标签: javascript angular dom nodechildren


【解决方案1】:

希望得到帮助:

    var origin, clone, item;
    origin = document.getElementById("template");
    clone = origin.cloneNode(true);
    item = clone.querySelector("#sec1");
    item.setAttribute("id", "sec2");

总体: 在您的clone 上使用querySelector,然后使用setAttribute 进行更新。

因为你的img已经有id所以你可以直接用#sec1-is查询。

但通常,使用querySelector,您可以使用#sec1 img 之类的查询字符串。类似于css选择器

您可以在这里了解更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector

【讨论】:

  • 谢谢!这会更改克隆中的属性值。不幸的是,clone 的 ngif 和(点击)不起作用。有什么想法吗?
【解决方案2】:

您可以尝试使用querySelector()querySelectorAll() 从克隆的元素中获取特定信息。

演示:

let itm = document.getElementById("template");
let cln = itm.cloneNode(true);
//get element with .section1
let section1 = cln.querySelector('.section1');
//set id
section1.id = 'sec123'
console.log(section1);
//get element with img in .section1
let img = section1.querySelectorAll('.content img');
//set src of first image
img[0].src = '../test';
//set srcset of first image
img[0].srcset = '../test/test';
console.log(img[0]);
//set src of second image
img[1].src = '../test2';
//set srcset of second image
img[1].srcset = '../test2/test';
console.log(img[1]);
<div id="template">
    <div class="section1" id="sec1">                
        <div class="content">
            <img id="sec1-is" *ngIf="!tstEnded" src="assets/images/r1.png" srcset="assets/images/r1@2x.png 2x,assets/images/r1@3x.png 3x" >
            <img id="sec1-if" *ngIf="tstEnded" src="assets/images/r2.png" srcset="assets/images/r2@2x.png 2x,assets/images/r2@3x.png 3x" />
            <div class="audio-controls">
                <button *ngIf="do1()" (click)="act1()" class="control-btn r1-btn" [ngClass]="{'disabled':!r1Enabled()}"></button>
                <button *ngIf="do2()" (click)="act2()" class="control-btn r2-btn" [ngClass]="{'disabled':!r2Enabled()}"></button>
            </div>
            <div class="test-wrapper">
                <span class="test-line">
                    {{eta}}
                </span>
            </div>
            <div class="test-wrapper">
                <div class="test" tst testType="R" (tstGo)="go($event)"></div>
            </div>
        </div>              
    </div>                  
    <div class="section2" id="sec2" style="background-image: linear-gradient(to top, #d0f6f6, rgba(255, 255, 255, 0));">
        <div class="content">
            <div *ngIf="ended">         
                <img *ngIf="!open" class="case1" (click)="case1()" src="assets/images/case1c.svg" />
                <img *ngIf="open" class="case1" src="assets/images/case1.svg" />
            </div>
        </div>
    </div>
</div>

【讨论】:

  • cln 的 ngif 和(点击)不起作用。有什么想法吗?
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2016-01-30
相关资源
最近更新 更多