- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想向我的 Eleventy 网站添加一小段客户端 JavaScript。我似乎无法使用 Eleventy 访问 document.
,这意味着我无法访问元素并监听它们的事件。 不起作用的示例:
const formElement = document.querySelector("form")
我从 Eleventy 收到的错误消息:
ReferenceError: document is not defined
我如何使用 Eleventy 来监听文档元素更改并进行页面更改?
例子:
formElement.addEventListener("change", function () {
// Update nearby paragraph element based on form value
});
我的真实场景:我想让一个段落元素显示 form
的哪个 input type="radio"
具有值 已检查
。
我在/data 中有一个名为 fruits.json 的文件:
{
"items": [
{
"name": "Apple"
},
{
"name": "Banana"
},
{
"name": "Strawberry"
},
{
"name": "Mango"
},
{
"name": "Peach"
},
{
"name": "Watermelon"
},
{
"name": "Blueberry"
}
]
}
还有/_includes/layouts 中的一个 HTML 文件基于我的 base.html 文件:
{% extends "layouts/base.html" %}
{% block content %}
<form>
{% for item in fruits.items %}
{# Create a radio button for each, with the first one checked by default #}
<input type="radio" name="screen" id="{{ item.name | slug }}" value="{{ item.name | slug }}" {% if loop.index === 1 %} checked {% endif %}>
<label for="{{ item.name | slug }}">{{ item.name }}</label>
{% endfor %}
{% set selectedFruit = helpers.getSelectedFruit() %}
<p>Currently selected item from above is: {{ selectedFruit }}</p>
</form>
{% endblock %}
请注意,名为 selectedFruit
的变量已分配给辅助函数:
{% set selectedScreen = helpers.getSelectedScreen() %}
getSelectedScreen()
函数如下所示:
getSelectedScreen() {
const formEl = document.querySelector("form")
console.log(formEl)
}
除了无法使用 .document
之外,我觉得这种方法可能在其他方面“违背了 Eleventy 的原则”,即静态站点生成器:
我想知道我是否一开始就处理了这个错误,或者我是否只需要做一些事情来允许 .document
访问。
最佳答案
这里存在一些误解 — JavaScript 代码最重要的区别在于它是在构建时还是在客户端在运行时执行。
Eleventy 核心以及您的 .eleventy.js
配置文件是用 JavaScript 编写的,它在构建步骤中执行一次,即在生成静态站点时执行一次。这发生在 NodeJS 环境中,而不是浏览器中,这就是没有 document
变量和 DOM 的原因。
如果您想动态更改您网站上的某些内容以响应用户交互,您需要编写一个单独的 JavaScript 文件,该文件被复制到静态网站的输出目录中。然后,您可以将其包含在静态网站的 HTML 模板中,以便在部署网站后正常页面访问期间包含它。
首先,修改您的模板,只为您的 JavaScript 函数生成一个占位符元素,以便稍后添加文本:
{% extends "layouts/base.html" %}
{% block content %}
<form id="fruits-form">
{% for item in fruits.items %}
{# Create a radio button for each, with the first one checked by default #}
<input type="radio" name="screen" id="{{ item.name | slug }}" value="{{ item.name | slug }}" {% if loop.index === 1 %} checked {% endif %}>
<label for="{{ item.name | slug }}">{{ item.name }}</label>
{% endfor %}
<p id="selected-fruits-output"></p>
</form>
{% endblock %}
然后,创建一个 JavaScript 文件来响应表单上的更改事件:
// fruit-form.js
const fruitForm = document.getElementById('fruits-form');
const formOutput = document.getElementById('selected-fruits-output');
fruitForm.addEventListener('change', e => {
// update the formOutput with the list of selected fruits
});
现在您需要使用Passthrough file copy 确保将此javascript 文件复制到您的输出目录中。 :
eleventyConfig.addPassthroughCopy("path/to/fruit-form.js");
最后,确保在您的 HTML 模板中包含脚本元素(确保路径是上面指定的输出的绝对路径):
{# layouts/base.html #}
<script src="/path/to/fruit-form.js" defer></script>
现在它应该可以正常工作了。一般而言,请务必了解构建时和运行时 JavaScript 之间的区别,以便您可以决定在不同情况下哪种效果最好。
关于javascript - 在 Eleventy 中执行小型客户端 JavaScript 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64981081/
是否有可能以某种方式为 Eleventy 进行一般配置,以便输入文件夹中的“my_file.html”最终与 _site 文件夹中的“my_file.html”一样,而不是“/my_file/inde
看来您应该能够使用global data files和data cascade为11ty网站中的所有页面指定一个后备布局,但是我不知道如何。 我在多个位置尝试了以下JSON: { "layout"
我正在设置一个新的 Eleventy网站,我遇到了一个小障碍。我的页面被组织成子目录。我希望每个目录的索引页列出该目录中的所有页面。 例如: |--section1 | |--index.njk /
我正在从 Jekyll 迁移到 Eleventy,之前我的博文链接具有这种样式的永久链接:/:title/ What I want: https://example.com/my-blog-post/
我正在从 Jekyll 迁移到 Eleventy,之前我的博文链接具有这种样式的永久链接:/:title/ What I want: https://example.com/my-blog-post/
Eleventy 是一个基于 JavaScript 的 Jekyll 和 Hugo 的替代品,用于构建静态网站。 静态网站生成器是一种基于原始数据和一组模板生成完整的静态 HTML 网站的工具
目标:为 Eleventy 博客的帖子列表中的每个帖子显示帖子摘录 我正在适应 this starter project作为我自己的博客。 我指的是this Eleventy document 获取帖
我是 nunjucks 新手 - 和 eleventy 一起试用。 精简版:我可以在 nunjucks 的标签内使用变量和过滤器吗?例如: {% 设置 myVar = {{ 标题 |降低 }} %}
我有一个调用 eleventy.write() 或 eleventy.toJSON() 方法的 aws lambda 函数,但似乎无法使其工作。我尝试了不同的项目结构并设置了不同的路径,但它要么返回一
问题 我想向我的 Eleventy 网站添加一小段客户端 JavaScript。我似乎无法使用 Eleventy 访问 document.,这意味着我无法访问元素并监听它们的事件。 不起作用的示例:
问题 我想向我的 Eleventy 网站添加一小段客户端 JavaScript。我似乎无法使用 Eleventy 访问 document.,这意味着我无法访问元素并监听它们的事件。 不起作用的示例:
我正在开发一个Eleventy based blog and website 。社交媒体共享功能,例如 Facebook OpenGraph 和 Twitter cards ,需要有图像等资源的完整绝
背景: Eleventy 和 Nunjucks(和 Markdown) 大量长格式文本(使用 markdown 更容易创建/编辑)。 复杂的布局。 对 SSG 还是新手 目标: 使用 markdown
我是一名优秀的程序员,十分优秀!