javascript DOM渲染完成后执行函数

bfnvny8b  于 2023-01-29  发布在  Java
关注(0)|答案(3)|浏览(741)

我记得阅读过下面的摘录从一个博客。
$timeout将新事件添加到浏览器事件队列(渲染引擎已经在此队列中),以便它将在新的超时事件之前完成执行。
我想知道在angular/ javascript中是否有比使用

setTimeout(() => {  
    // do something after dom finishes rendering
}, 0);

以在DOM完全完成任务(如更新 *ngFor并在页面上呈现结果)时执行代码。

zqdjd7g9

zqdjd7g91#

您可以尝试ngAfterViewInit生命周期钩子,它是按时间顺序最后一个单次触发生命周期钩子。
https://angular.io/guide/lifecycle-hooks
它的工作原理与ngInit非常相似,但是它在视图和子视图初始化之后才触发。
如果需要每次DOM完成时都触发的函数,可以尝试ngAfterViewCheckedngAfterContentChecked

y1aodyip

y1aodyip2#

**问题:**有时在加载了一些部分之后,我需要运行一个函数。(我想扩展一个输入和一个标签)

ngAfterViewInit和路由更改检测没有解决我的问题

**解决方案:**我制作了一个组件

import { Component,  AfterViewInit } from '@angular/core';

declare var jquery: any;
declare var $: any;

@Component({
selector: 'app-inline-label',
templateUrl: './inline-label.component.html',
styleUrls: ['./inline-label.component.scss']
})
/** InlineLabel component*/
/**

this component stretch inline labels and its input size

*/
export class InlineLabelComponent implements AfterViewInit {

/** InlineLabel ctor */
constructor() {
}
ngAfterViewInit(): void {

var lblWidth = $('.label-inline').width();
var parentWidth = $('.label-inline').parent().width();
var fieldWidth = parentWidth - lblWidth;
$('.form-control-inline').css("width", fieldWidth);

}

}

然后我把它用在html的任何地方

<app-inline-label></app-inline-label>

即使我的html有*ngIf="",我也会在那个标记中使用app-inline-label,这样就解决了所有的问题

实际上,它将在渲染<app-inline-label> </app-inline-label>时触发

lvmkulzt

lvmkulzt3#

如果函数要渲染多次,则ngAfterContentChecked将更可取。

    • 应用程序组件. ts**
export class AppComponent implements OnInit, OnDestroy {
      
      searchRegister: any = [];
    
      constructor() {
      }
      
        ngAfterContentChecked(): void {
        this.setHTMLElements();
      }

      setHTMLElements() {
        this.searchRegister = ['cards-descriptor__subtitle','insights-card__title','article-headline__title','wysiwyg__content','footer-logo__heading','hero-breadcrumbs__blurb','multi-column-text__body','small-two-column-image-text__blurb','two-column-image-text__blurb','image-blurbs-expandable__desc',];
          for (var val of this.searchRegister) {
            var classLength = this.dom.body.getElementsByClassName(val).length;
            for (var i = 0; i <= classLength; i++) {
              if (
                this.dom.body.getElementsByClassName(val)[i]?.innerHTML != undefined
              ) {
                this.dom.body.getElementsByClassName(val)[
                  i
                ].innerHTML = this.dom.body
                  .getElementsByClassName(val)
                  [i]?.innerHTML?.replace(/[®]/gi, '<sup>®</sup>');
              }
            }
          }
        }
    }
    • 其他组件ts**
import { AppComponent } from '../../app.component';
export class IndustryComponent implements OnInit {

  constructor(private appComponent: AppComponent) { }

  ngAfterContentChecked(): void {
    this.appComponent.setHTMLElements();
  }
}

相关问题