javascript - 有没有办法访问 marko 类中的 "window"和 "document"引用?

标签 javascript html marko

我正在使用Marko并且需要访问窗口和视口(viewport)高度。我需要特定 div 的高度和视口(viewport)的高度。这通常是通过类似的东西来实现的

var viewportHeight = window.innerHeight
var elementHeight = document.getElementById("#myDiv").clientHeight

我可以像这样在类中访问windowdocument吗?

class {
    onCreate(){
        var windowHeight = window.innerHeight
        var elementHeight = document.getElementById("#myDiv").clientHeight
        this.state = { winHeight: winHeight, elemHeight: elementHeight }
    }
}

#myDiv
    p -- ${state.winHeight}
    p -- ${state.elemHeight}

我收到错误:

ReferenceError:文档未定义

引用错误:窗口未定义

在我的标记中访问这些值的最佳方式是什么?

最佳答案

Marko 组件设计为在服务器和浏览器上呈现。因此,在 onCreate(以及 onRenderonInput)中访问 window/document )将在这些值不存在的服务器上抛出错误。 此外,在 DOM 节点安装到文档之前,您无法测量它们。

出于这些原因,onMount 可能是放置此逻辑的最佳位置。 onMount 仅在浏览器中且节点存在于 DOM 中后调用。

但这确实意味着您的初始渲染不会完全正确。您可能需要将 state.winHeightstate.elemHeight 设置为默认值。初始渲染后,将进行测量,并且您的组件将更新以反射(reflect)新值。

class {
  onCreate() {
    this.state = { winHeight:0, elemHeight:0 }
  }
  onMount() {
    this.state.elemHeight = this.getEl("measure").clientHeight;
    this.state.winHeight = window.innerHeight;
  }
}

<div key="measure">
  <p>Element ${state.elemHeight}!</p>
  <p>Window ${state.winHeight}!</p>
</div>

根据您使用这些值的目的,这可能是可以接受的,并且对于您的用户来说大多不会被注意到。但是,如果更新这些值导致内容明显跳跃,您可能会考虑在这些值不可用时呈现占位符。

关于javascript - 有没有办法访问 marko 类中的 "window"和 "document"引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55814683/

相关文章:

javascript - jquery 将值放入输入框

javascript - 我可以在 Javascript 中重复函数参数名称吗?

javascript - 当您更改屏幕分辨率时,有没有办法在 bootstrap 3 上订购两个 div : image, 和文本?

javascript - 将 Active Class 添加到当前列表菜单项而不在 marko 中使用客户端 JS/jquery?

javascript - 使用 .forEach() 动态生成数组

Javascript:为什么我的 javascript 不运行两个动画?

围绕可变大小内容的 CSS 不规则框架?

javascript - Internet Explorer 7 中 css 中的链接和背景的奇怪问题

javascript - 马科和 Koajs : Why is my async-fragment rendering not working?