如何从RubyonRails(html)调用函数?

pgccezyw  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(328)

我有一个按钮:

<button type="button" onclick = "myfunction()" class="collapsible">Expand content</button>

我有一个javascript函数:

function collapse() {
    var coll = document.getElementsByClassName("collapsible");
    var i;

    for (i = 0; i < coll.length; i++) {
        coll[i].addEventListener("click", function() {
            this.classList.toggle("active");
            var content = this.nextElementSibling;
            if (content.style.display === "block") {
                content.style.display = "none";
            } else {
                content.style.display = "block";
            }
        });
    }
}

通常,我们使用 onclick . 如果是RubyonRails呢?我注意到在RubyonRails中我不能以这种方式调用函数。如何从RubyonRails(html)调用函数?

2q5ifsrm

2q5ifsrm1#

对于新的rails应用程序,javascripts资产由webpack(通过webpacker gem)处理。默认情况下,webpack将函数隔离在定义函数的文件中,因此这些函数不会影响全局范围(web中的窗口对象)。
如果您希望浏览器在单击按钮时能够运行某个功能,则有许多选项,在您的情况下,您使用的是 onclick 属性,该属性将在全局范围内运行,因此它将尝试在窗口对象中执行函数。
由于您的函数实际上是隔离的,浏览器无法调用它,因此解决方案是使函数全局化而不是隔离。
要做到这一点,请不要这样做:

function collapse() {
    ...
}

您可以将函数定义为:

window.collapse = function() {
    ...
}

这样,该函数将在全局范围内可用,您可以在任何地方调用它。
虽然现在我更好地阅读了你的代码,你有一个奇怪的概念组合,你有 onclick="myFunction()" 但你没有定义 myFunction 任何地方,然后在 collapse 正在将eventlistener添加到按钮的函数。。。再一次?问题似乎不是你的按钮被点击了一次,而是 collapse 函数从未被调用以实际附加事件侦听器。
我会这样做:

function collapse() {
    ...
}

collapse() // call the function so it attaches the event listeners

然后你就不需要 onclick 在你的按钮上。

相关问题