【发布时间】:2022-01-05 20:38:27
【问题描述】:
我在选择带有accordion 的所有类并将它们带入 knckoutjs 以对其进行操作时遇到问题。
点击此链接:https://wpbeaches.com/create-expandcollapse-faq-accordion-collapse-click/
我设法创建了很好的可扩展对象(矩形),但它们“死了”,因为我使用的是 knockotjs,而不是 JS。
所以我的问题是如何使它工作?
第一步是由于某种原因我无法选择所有 accordion 类。这是我的代码:
define(['viewmodels/shell', 'durandal/services/logger', 'mediator-js', 'knockout', 'toastr'],
function (shell, logger, mediator, ko, toastr) {
var vm = {
shell: shell,
activate: activate,
mediator: mediator
}
function activate() {
var acc = jQuery.getElementsByClassName("accordion");
var panel = document.getElementsByClassName('panel');
for (var i = 0; i < acc.length; i++) {
acc[i].onclick = function () {
var setClasses = !this.classList.contains('active');
setClass(acc, 'active', 'remove');
setClass(panel, 'show', 'remove');
if (setClasses) {
this.classList.toggle("active");
this.nextElementSibling.classList.toggle("show");
}
}
}
function setClass(els, className, fnName) {
for (var i = 0; i < els.length; i++) {
els[i].classList[fnName](className);
}
}
return true;
}
return vm;
});
我实际上尝试的是将上面链接中的 js 部分复制到我的解决方案中并使其工作(展开每个矩形..)
【问题讨论】:
-
您不是“选择所有类”,而是选择具有特定类的所有元素。
-
"因为我使用的是 knockoutjs,而不是 JS。" - KnockoutJS 是 JavaScript...
-
activate函数在哪里以及如何被调用? -
你是对的。它是名为 router.js 和 durandal.js 的插件的一部分,但这与此事无关。我可以通过调试看到它停止到要按类名获取所有元素的位置。
-
脚本的宿主环境总是相关的,例如,如果脚本在 DOM 完全加载之前运行,那么
querySelector将无法按预期工作,并且脚本何时运行取决于其宿主 - 其他环境,如 ReactJS 和 Angular,具有某种形式的虚拟 DOM,这也打破了开发人员对 DOM API 的期望。
标签: javascript html twitter-bootstrap knockout.js