NodeJS 窗口.onload内部的Astro js不工作

fquxozlt  于 2022-12-22  发布在  Node.js
关注(0)|答案(3)|浏览(161)

我有一组Astro组件可供我的应用调用:

apps/myProject

libs/components/header

在header.astro组件中,我有一个脚本,希望在呈现整个页面后运行该脚本:

<script is:inline>
  console.log('hej!');
  window.onload = (e) => {
    console.log('loaded!');
  };
</script>

正在打印'hej!',但没有打印'loaded!'。这是为什么?
对我来说,不清楚组件的生命周期在Astro中是如何工作的,我已经按照this solution的方法将is:inline属性添加到script标记中,但它仍然不起作用。

j8ag8udp

j8ag8udp1#

*.astro文件视为所有服务器端文件,您不能在

---
---

但是你可以在astro文件的html部分使用<script></script>。下面的例子对我来说很好用。

---
---

<script>
    console.log('hello');
    window.onload = (e) => {
        console.log('loaded!');
    };
</script>

<p>hello world!</p>
rsl1atfo

rsl1atfo2#

您应该能够在客户机上使用hoist加载模块。

<script type="module" hoist>
  console.log('loaded!');
</script>

window.onload是不必要的,因为ES模块会自动延迟。

pgky5nke

pgky5nke3#

溶液

解决方案应简单到

<script is:inline>
    console.log('hej!');
    console.log('loaded!');
</script>

其产生

误解和误导性解决方案

问题解决方案建议

这个脚本在page.astro中工作,如果问题假装它不工作,提供更多的元素如完整的示例项目是非常重要的,因为错误很可能是其他地方而不是在提供的代码中。

<script is:inline>
  console.log('hej!');
  window.onload = (e) => {
    console.log('loaded!');
  };
</script>

我在一个默认的astro示例中使用了它,它会生成以下输出

但由于不需要Windows.OnLoad而不是理想的:参见When to use "window.onload"?
请参见此处作为测试基础的天文学官方示例(https://github.com/withastro/astro/tree/main/examples

添加前页分隔

下面的解决方案不必要地添加了--- ---,它是可选的前页条目,当不可用时,内容被解释为脚本应该位于的第二个正文部分

---
---

<script>
    console.log('hello');
    window.onload = (e) => {
        console.log('loaded!');
    };
</script>

增加型模块或提升机

please udpate and see https://docs.astro.build/en/migrate/#new-default-script-behavior
从那里你会知道:

      • 断裂**:<script hoist>是新的默认<script>行为。hoist属性已被删除。要使用新的默认行为,请确保<script>标记上没有其他属性。例如,如果以前使用过type="module",请将其删除。

使用的是:内联

这个问题的作者已经被另一个帖子(How to use document and window element in astro JS?)误导了,理所当然地认为这是错误的,我提交了一个答案来纠正它,因为<script>中的is:inline是不需要的,并有意想不到的副作用,如不必要地复制脚本代码,请参阅这个答案的直接链接有如何在astro JS中使用文档和窗口元素?

相关问题