Привязка события клика к элементу ввода - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь обслуживать html-файлы с сервера без использования шаблонизаторов . Пожалуйста, найдите ниже скрипт для запуска сервера.

// script.js
const express = require("express");
const bodyParser = require("body-parser");
const app = express();

app.use(express.static(__dirname));

app.get("/", (req, res) => {
   res.set("Content-Type", "text/html");
   const f = require("./templates")();
   console.log(f);
   res.send(f);
});

app.listen(3103, () => console.log("hi"));

// template.js
const fs = require("fs");
const html = fs.readFileSync(__dirname + "/temp.html", "utf8");

module.exports = (variables) => {
   return html;
};

Ниже приведен мой HTML-файл:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=<device-width>, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./script.js"></script> <!-- The click function was served in a different file -->
</head>
<body>
    <p>Home Page</p>

    <input type="button" value="Click Me" id="btn" onclick="click()">
    <script>

        console.log("hi");
        function click(){ console.log("_Button clicked"); }                
        //document.getElementById("btn").addEventListener("click", () => {
            //console.log("Button Clicked");
        //});

    </script>
</body>
</html>

Я попробовал следующее безуспешно:

  • Я включил click() inline в элемент button, и функция была объявлена ​​в теге script в том же html-файле. Это не сработало.

  • Я включил функцию fromScript в файл script.js и использовал этот файл в качестве статического содержимого. Это не сработало, как ожидалось.

Затем я использовал addEventListener, чтобы связать событие click с элементом ввода. Теперь, когда я нажимаю кнопку, сообщение «Нажатие кнопки» печатается дважды.

Как правильно / лучше всего связывать события dom с элементами?

Редактировать

Спасибо за ответ Тийс Крамер . Но проблема связана с именем функции.

Если я назову функцию , нажмите , она не работает. Но если я переименую его в fromScript , он будет работать.

Разве мы не должны использовать «щелчок» для имени функции?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Ваша проблема не имеет ничего общего с экспрессом :) Например, для привязки событий кликов рекомендуется следующее:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=<device-width>, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <p>Home Page</p>

    <input type="button" value="Click Me" id="btn">
    <script>
        const button = document.getElementById("btn");
        button.addEventListener("click", () => {
            console.log("Button Clicked");
        });
    </script>
</body>
</html>

Редактировать : Мне кажется, я знаю, что вы имеете в виду:

Если вы переименуете функцию fromScript в click, вам, очевидно, придется также изменить значение атрибута onclick:

<input type="button" onclick="click()" />

0 голосов
/ 10 ноября 2018

Причина вашей проблемы с именами заключается в том, что API HTMLElement (от которого наследуются все html-элементы) имеет свойство click. Это function, предназначенный для программного запуска события щелчка элемента.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click

Чтобы избежать путаницы и непредсказуемого поведения, всегда проверяйте имена переменных и функций однозначно в отношении унаследованных и встроенных свойств из цепочки прототипов.

0 голосов
/ 09 ноября 2018

Код ниже должен нормально работать:

// script.js
const express = require("express");
// const bodyParser = require("body-parser"); 
const app = express();

app.use(express.static(__dirname));
app.listen(3103, () => console.log("hi"));

затем node script.js и попробуйте получить к нему доступ, перейдя на http://localhost:3103/temp.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...