提问者:小点点

从外部HTML文件调用javascript函数


我在一个独立于HTML的文件中创建了一个函数,我想在select值发生变化时调用这个函数,但它说这个函数没有定义。 由此错误:

未捕获的ReferenceError:HtmlSelectelement.OnChange中未定义filterByClass(问题:149)

这是进行调用的HTML:

<select id="filter" onchange="filterByClass();">
    <option value="{}">{}</option>
</select>

选择不重要。

这是独立文件中的javascript:

function filterByClass() {
    const sqlite3 = require('sqlite3').verbose();
    var db = new sqlite3.Database("../sql/homework.db");
    var classId = [];

    db.all("SELECT * FROM class WHERE className = ?", [document.getElementById("filter").value], (err, row) => {
        row.foreach(function (row) {
        classId.push(row.id);
            var questionId = document.getElementsByClassName("question");
            if(row.id != document.getElementById(row.id)) {
                document.getElementById("filter").style.display = "none";
            }
        });
    });

    db.close();
}

我知道我的代码可能不对,但那是因为我还在学习JavaScript。

另外,我使用browserify来使用require,并将其转换为bundle.js。 这是指向bundle.js:的头部链接。

顺便说一下,这是我第一次在单独的文件中使用javascript,因为我通常只是直接将代码放在头部。


共3个答案

匿名用户

我已经有一段时间没有使用browserify了,但是它可以肯定地将您的代码包装成一个函数。

因此,函数filterByClass(){在全局范围内不可用,并且onchange=“filterByClass();”仅在filterByClass在全局范围内可用时才会工作。

您可以在函数FilterByClass(){之后编写Window.FilterByClass=FilterByClass,然后这个错误消息很可能消失,但是您应该以这种方式解决这个问题,但是使用AddEventListener代替在HTML中设置事件处理程序。

但是,虽然这可以解决错误消息,但仍然不能解决SQLite3不能在浏览器中运行的问题。

匿名用户

我假设浏览器在解析bundle.js时会遇到错误并中止解析(这更有可能,因为您需要在客户端中使用sqlite)。 这就是为什么你不能从HTML文件调用它中定义的函数。

我建议您检查控制台,并解决是否有任何错误或警告显示。

匿名用户

<select id="filter" onchange="filterByClass">
    <option value="{}">{}</option>
</select>

去掉FilterByClass上的括号。 如果调用它有效,则调用它太早了。

相关问题