我在一个独立于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,因为我通常只是直接将代码放在头部。
我已经有一段时间没有使用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上的括号。 如果调用它有效,则调用它太早了。