当前位置: 首页 > 知识库问答 >
问题:

获取不正确的offsetWidth和offsetHeight值

李昊苍
2023-03-14

这是我的angular2代码。

模板

<div #picker class="slider">
  <div class="slider-track">
    <div #sliderSelectionEl class="slider-selection"></div>
    <div #sliderHandle1 class="slider-handle"></div>
    <div #sliderHandle2 class="slider-handle"></div>
  </div>
  <div #tooltipEl class="tooltip">
    <div class="tooltip-arrow"></div>
    <div #tooltipInner class="tooltip-inner"></div>
  </div>
  <input type="text" class="span2" value="" id="sl2"><br/>
</div>


组件


    import {Component, OnInit, Input, ViewChild, ElementRef, Renderer} from '@angular/core';
    export class SliderComponent implements OnInit {
      @ViewChild('picker') picker: ElementRef;

      constructor(private renderer: Renderer, private el: ElementRef) {

      }

      ngAfterViewInit() {
        this.renderer.setElementClass(this.picker.nativeElement, 'slider-horizontal', true);

        console.log(this.picker.nativeElement.offsetWidth);
        console.log(this.picker.nativeElement.offsetHeight);
      }
    }

.slider-horizontal {
  width: 210px;
  height: 20px;
}

问题是每次加载的打印值都不一样。我猜这个问题是由于浏览器没有完成加载div。你知道这个的解决办法是什么吗?

共有1个答案

满增
2023-03-14

您可以通过使用

突变观察者

这个新api的最大受众可能是编写JS框架的人,[...]另一个用例是您正在使用操作DOM的框架,并且需要对这些修改做出有效的反应(并且不需要setTimeout攻击!)。

以下是如何使用它来检测元素中的更改:

// select the target node
var target = document.querySelector('#some-id'); // or 

// create an observer instance
var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        console.log(mutation.type);
    });
});

// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true }

// pass in the target node, as well as the observer options
observer.observe(target, config);

// later, you can stop observing
observer.disconnect();

对于您的情况,可以在NGAfterViewInit中使用它并刷新偏移量大小。你可以更具体,只检测一些突变,然后才提取你的偏移量。

更多信息:

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
       console.log(mutation);
       if(mutation.attributeName == 'class') // detect class change
          /*
          or if(mutation.target.clientWidth == myWidth)
          */
          showOffset(mutation.target);
          
          observer.disconnect();
    });
});

var config = { attributes: true}
var demoDiv = document.getElementById('demoDiv');
var logs = document.getElementById('logs');

// wait for document state to be complete
if (document.readyState === "complete") {
    ngAfterViewInit();
  }
  
document.onreadystatechange = function () {
  if (document.readyState === "complete") {
    ngAfterViewInit();
  }
}

// observe changes that effects demoDiv + add class
function ngAfterViewInit(){
	observer.observe(demoDiv, config);
  demoDiv.classList.add('slider-horizontal');
}

// show offsetWidth + height. 
// N.B offset width and height will be bigger than clientWidth because I added a border. If you remove the border you'll see 220px,20px

function showOffset(element){
  offsetMessage = "offsetWidth:" + demoDiv.offsetWidth + " offsetHeight: " + demoDiv.offsetHeight;
	console.log(offsetMessage);
  logs.innerHTML = offsetMessage;
}
.slider-horizontal {
  border: 2px solid red;
  width: 210px;
  height: 20px;
  background: grey;
}
<div id='demoDiv'> I am a demo div </div>
<div style="margin-top: 20px;"> logs : <span id='logs' style=" padding: 5px; border: 1px solid black"></span></div>
 类似资料:
  • 问题内容: 我正在使用Linux和C ++。我有一个大小为210732字节的二进制文件,但是seekg / tellg报告的大小为210728。 我从ls-la获得以下信息,即210732字节: -rw-rw-r– 1个pjs pjs 210732 2月17日10:25 output.osr 并使用以下代码段,我得到210728: 所以我的代码关闭了4个字节。我已经确认使用十六进制编辑器可以正确处

  • 问题内容: 我正在使用SentiWordNet做一些情绪分析,我在这里提到了如何使用SentiWordNet的帖子。但是,尽管尝试了各种输入,但我仍得到0.0分。我在这里做错什么了吗?谢谢! 这是SentiWordNet.txt的前10行 问题答案: 通常文件带有奇怪的格式。 您需要删除它的第一部分(包括注释和说明)和最后两行: 解析器不知道如何处理这些情况,如果删除这两行,就可以了。

  • 我试着打印出这个字符串长度, 但是它显示100是不正确的。应该是102。我已经在记事本上检查了两次,它显示102。我不知道我错过了什么。

  • 当我使用pdfbox提取图像时,我得到了一些PDF图像的不正确dpi。当我使用Photoshop或Acrobat Reader Pro提取图像时,我可以看到图像的dpi是200使用windows照片查看器,但当我使用pdfbox提取图像时,dpi是72。 为了提取图像,我使用以下代码:无法从PDFA1-a格式文档中提取图像 当我检查日志时,我看到一个不寻常的条目:2015-01-23-main——

  • 我们的LinkedIn APP不再适用于V2的演变。我已经尝试了几次,但未能创建正确的令牌。我正在寻求帮助以创建正确的授权链接以获取令牌。应用程序的错误目前是“清空开放2访问令牌” 我创建了一个新的LinkedIn应用程序来取代我们的旧应用程序。我试着按照LinkedIn和微软的指示去做,但是我的努力产生了下面的错误 我最近的尝试是: https://www.linkedin.com/oauth/

  • 问题内容: 我正在尝试从数据库中获取一些信息,然后使用该信息来获取一些统计信息。 我想获取基于小时间隔的统计信息,因此我创建了一个由两小时的小时和数据组成的数据。 为了获得正确的时间,我需要从数据库中获取时间。因此,我需要创建某种数据/日历对象。 现在,由于已弃用,我需要找到一种新的方式来设置时间。 有谁知道我能做到这一点吗? 到目前为止,此解决方案有效: 但是如上所述,日期已过时,因此我想学习“