javascript - Array.prototype.filter.call(forms, function(form) 这是干什么的?
问题描述
我很难完全理解这段代码是如何工作的。这只是从引导程序复制和粘贴的表单验证代码。
我的问题从这一行开始 var validation = Array.prototype.filter.call(forms, function(form)
在我看来,它正在创建一个名为验证的数组,其中包含任何类名为“needs-validation”的元素。然后是调用匿名函数并传入整个表单并运行后续代码行
form.addEventListener('submit', function(event) {
if (form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
}
在每个包含类名“needs-validation”的元素上?
<script>
// Example starter JavaScript for disabling form submissions if there are invalid fields
(function() {
'use strict';
window.addEventListener('load', function() {
// Fetch all the forms we want to apply custom Bootstrap validation styles to
var forms = document.getElementsByClassName('needs-validation');
// Loop over them and prevent submission
var validation = Array.prototype.filter.call(forms, function(form) {
form.addEventListener('submit', function(event) {
if (form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
}, false);
})();
此代码成功验证表单上的输入。我只是不明白它是如何工作的。
解决方案
该方法document.getElementsByClassName
返回 a HTMLCollection
,乍一看它类似于 Array 但HTMLCollection
没有方法.filter
, .map
,reduce
等。
所以为了使用这些方法,我们需要转换HTMLCollection
为数组。
或者我们可以使用特定于 javascript:Array.prototype.filter
的对象上的可迭代对象,如果您查看返回的详细信息,HTMLCollection
它document.getElementsByClassName
有键并且它是iterable
. 所以我们可以调用方法Array.prototype.filter.call(
并作为上下文(第一个参数)传递我们的HTMLCollection
,第二个参数将是一个函数,它将为集合中的每个元素调用。
关于 call() 方法的更多信息https://gomakethings.com/what-the-hell-is-the-call-method-and-when-should-you-use-it/
推荐阅读
- r - MatLab中“[tmp c]=max(S(:,I),[],2); c(I)=1:K; ”的含义
- azure - 如何让 AzureRM 应用程序网关将 ACME .PEM 证书作为 AGW SSL 端到端配置中的trusted_root_certificates?
- java - 如何使用 Jackson 反序列化混合类型的匿名数组
- typescript - 模拟续集打字稿模型
- amp-html - 如何在 google amp 脚本中应用逻辑运算符?
- c# - (WPF) 带有 TabItem 布局的弹出窗口
- node.js - nextjs 在指定的时间间隔内预取数据
- c - 我们可以在没有 static 关键字的情况下声明具有内部链接的文件范围标识符吗?
- python - Python 打印 3 次
- javascript - TypeScript:如何在 basic-ftp NodeJS 模块中引用 internal.Writable?