Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提交按钮调用函数而不被单击_Javascript_Html - Fatal编程技术网

Javascript 提交按钮调用函数而不被单击

Javascript 提交按钮调用函数而不被单击,javascript,html,Javascript,Html,我正在尝试编写一个简单的银行应用程序来学习基本的DOM操作。这将是一个单页网站,有很多函数调用和隐藏/显示容器 单击主屏幕上的register按钮后,它将调用registerScreen()函数,该函数随后隐藏主屏幕元素,并显示带有文本框的表单组和保存填写信息的submit按钮。然而,saveCustomer()函数会在我打开注册屏幕时自动调用。显然,它提交了一份空白表格,这是一个问题 我尝试了不同的事件侦听器方法,如submit、click、getElementById().onclick,等

我正在尝试编写一个简单的银行应用程序来学习基本的DOM操作。这将是一个单页网站,有很多函数调用和隐藏/显示容器

单击主屏幕上的register按钮后,它将调用
registerScreen()
函数,该函数随后隐藏主屏幕元素,并显示带有文本框的表单组和保存填写信息的submit按钮。然而,
saveCustomer()
函数会在我打开注册屏幕时自动调用。显然,它提交了一份空白表格,这是一个问题

我尝试了不同的事件侦听器方法,如
submit
click
getElementById().onclick
,等等。我不想在HTML上调用
saveCustomer()
函数,因为我不知道如何用这种方法传递信息

function registerScreen() {
    document.getElementById("welcome-container").style.display = "none";
    document.getElementById("registerScreen").style.display = "block";

    let customerFirstName = document.getElementById('firstName').value;
    let customerLastName = document.getElementById('lastName').value;
    let customerPassword = document.getElementById('password').value;

    let randomID = document.getElementById("randomID");
    let ID = Math.floor((Math.random() * 999) + 100);

    randomID.innerHTML += ID;

    //This is the line I am having problems with
    document.getElementById("submitInfo").addEventListener("click", saveCustomer(ID, customerFirstName, customerLastName, customerPassword));
}

function saveCustomer (ID, customerFirstName, customerLastName, customerPassword) {
    let customer = {
        id: ID,
        firstname: customerFirstName,
        lastname: customerLastName,
        password: customerPassword,
        cashAmount: 0,
    }

    if (localStorage.getItem("customers") === null) {
        let customers = [];
        customers.push(customer);
        localStorage.setItem("customers", JSON.stringify(customers));
    } else {
        let customers = JSON.parse(localStorage.getItem("customers"));
        customers.push(customer);
        localStorage.setItem("customers", JSON.stringify(customers));
    }

    alert("Registration successful.");
}

尝试在匿名回调函数中包装saveCustomer,如下所示:

document.getElementById("submitInfo").addEventListener("click", () => {saveCustomer(ID, customerFirstName, customerLastName, customerPassword)});

尝试在匿名回调函数中包装saveCustomer,如下所示:

document.getElementById("submitInfo").addEventListener("click", () => {saveCustomer(ID, customerFirstName, customerLastName, customerPassword)});

问题在于,单击#submitInfo时,您没有注册要调用的函数,但事件侦听器的格式不正确,您正在使用声明调用另一个函数。相反,您应该在单击#submitInfo时注册一个新的匿名函数,并仅使用该匿名函数调用saveCustomer()

下面是您在案例中使用的错误方法

<button id="btn">Click</button>
<script>
    document.getElementById("btn").addEventListener("click", alertSomething("test"));

    function alertSomething(text) {
        alert("Inside here, alerting "+text);
    }
</script>
点击
document.getElementById(“btn”).addEventListener(“单击”,警报内容(“测试”));
函数(文本){
警报(“此处内部,警报”+文本);
}
初始化eventListener时,它正在调用alertSomething()函数。这将在加载文档后立即触发alertSomething()函数

相反,您需要定义一个新的匿名函数,该函数在单击按钮后将被调用,并且只从这个新函数内部调用alertSomething()函数。它被称为匿名函数,因为它没有普通函数那样的名称

实现这一点的正确方法是:

<button id="btn">Click</button>
<script>
    document.getElementById("btn").addEventListener("click", function() {
        alertSomething("test")
    });

    function alertSomething(text) {
        alert("Inside here, alerting "+text);
    }
</script>
点击
document.getElementById(“btn”).addEventListener(“单击”,函数)(){
警告某事(“测试”)
});
函数(文本){
警报(“此处内部,警报”+文本);
}

问题在于,单击#submitInfo时,您没有注册要调用的函数,但事件侦听器的格式不正确,您正在使用声明调用另一个函数。相反,您应该在单击#submitInfo时注册一个新的匿名函数,并仅使用该匿名函数调用saveCustomer()

下面是您在案例中使用的错误方法

<button id="btn">Click</button>
<script>
    document.getElementById("btn").addEventListener("click", alertSomething("test"));

    function alertSomething(text) {
        alert("Inside here, alerting "+text);
    }
</script>
点击
document.getElementById(“btn”).addEventListener(“单击”,警报内容(“测试”));
函数(文本){
警报(“此处内部,警报”+文本);
}
初始化eventListener时,它正在调用alertSomething()函数。这将在加载文档后立即触发alertSomething()函数

相反,您需要定义一个新的匿名函数,该函数在单击按钮后将被调用,并且只从这个新函数内部调用alertSomething()函数。它被称为匿名函数,因为它没有普通函数那样的名称

实现这一点的正确方法是:

<button id="btn">Click</button>
<script>
    document.getElementById("btn").addEventListener("click", function() {
        alertSomething("test")
    });

    function alertSomething(text) {
        alert("Inside here, alerting "+text);
    }
</script>
点击
document.getElementById(“btn”).addEventListener(“单击”,函数)(){
警告某事(“测试”)
});
函数(文本){
警报(“此处内部,警报”+文本);
}

在上面提供的代码中,一切看起来都很好。可能有更多的代码在干扰。我想到的一件事是有多少id=“submitInfo”的按钮或元素?单页应用程序最大的一个警告是,每个东西都在同一个html页面中,有时我们有多个id相同的项目,认为它是一个不同的区域/面板/分区。我们可能也需要查看html。@NawedKhan只有“提交”按钮有该id。我在这里发布之前已经仔细检查过,甚至更改了id名称。可能的如何调用registerScreen()的副本?点击提交按钮?也许这个按钮是在提交表单。SPA(单页应用程序)本身就有挑战。如果您的目标是更好地理解DOM,那么我建议您不要从SPA项目开始。上面提供的代码看起来一切都很好。可能有更多的代码在干扰。我想到的一件事是有多少id=“submitInfo”的按钮或元素?单页应用程序最大的一个警告是,每个东西都在同一个html页面中,有时我们有多个id相同的项目,认为它是一个不同的区域/面板/分区。我们可能也需要查看html。@NawedKhan只有“提交”按钮有该id。我在这里发布之前已经仔细检查过,甚至更改了id名称。可能的如何调用registerScreen()的副本?点击提交按钮?也许这个按钮是在提交表单。SPA(单页应用程序)本身就有挑战。如果你的目标是更好地理解DOM,我建议你不要从一个SPA项目开始。这个项目很有效。唯一的问题是它只提交ID,而不是oher信息,但我怀疑这与我上面的问题无关,而是与文本框值在更改后未被读取有关。非常感谢。尽管我试图理解将其称为arrow函数是如何使其工作的。这是否与下面解释的Ivica Pesovski将其作为匿名函数调用的方法相同?这是相同的方法,问题是在附加事件时,需要传递函数refe