ReferenceError:b87b 未在 HTMLButtonElement.onclick 处定义

问题描述 投票:0回答:1

这是数据的 JSON 文件

let listApi = 'http://localhost:3000/jobs';
let listJobsBlock = document.querySelector('#list-jobs');

// function
const getJobs = (callback) => {
    fetch(listApi)
        .then((response) => response.json())
        .then(callback)
};

function handleDeleteJob(id) {
    let options = {
        method: "DELETE",
        headers: {
            "Content-Type": "application/json",
        }
    };
    fetch(listApi + '/' + id, options)
        .then((response) => response.json())
        .then(() => {
            let jobItem = document.querySelector('.job_item_' + id)
            if (jobItem) {
                jobItem.remove()
            }
        })
};

const renderJob = (jobs) => {
    let html = jobs.map((job) => {
        return `
        <li class="job_item_${job.id}">
            <h4>${job.title}</h4>
            <p>I started this job from ${job.started_year}</p>
            <button onclick="handleDeleteJob(${job.id})">Delete</button>
        </li>
        `;
    });
    listJobsBlock.innerHTML = html.join('')
};

const createJob = (data, callback) => {
    let options = {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
        },
        body: JSON.stringify(data)
    }
    fetch(listApi, options)
        .then((response) => response.json())
        .then(callback)
};

const handleCreateForm = () => {
    let createBtn = document.querySelector('#create');
    createBtn.onclick = () => {
        let title = document.querySelector('input[name="title"]').value
        let started_year = document.querySelector('input[name="started_year"]').value
        let formData = {
            title: title,
            started_year: parseInt(started_year)
        }

        createJob(formData);
    }
};

const start = () => {
    getJobs(renderJob);
    handleCreateForm();
};

start();
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./style.css">
</head>

<body>
    <div id="wrapped">
        <h2>List of jobs</h2>
        <ul id="list-jobs">

        </ul>
    </div>

    <div id="add_job">
        <div class="input__form">
            <label for="title" name="title">Title</label>
            <input type="text" name="title">
        </div>
        <div class="input__form">
            <label for="started_year" name="started_year">Started Year</label>
            <input type="text" name="started_year">
        </div>
        <button id="create">Create</button>
    </div>

    <script src="./script.js"></script>
</body>

</html>

当我尝试在 JS 中使用 fecth() 时,我遇到了这个问题。 我正在使用 Mock API 来练习 fetch api。我为按钮中的onclick事件定义了一个handleDeleteJob()函数来删除DOM元素并发送一个“DELETE”方法来删除数据。然而,当 id 是数字时,它只适用于 id。如果 id 是字符串,则会显示 'id' 未定义

我已经尝试了很多次来解决这个问题,但我无法弄清楚问题出在哪里?

postman fetch
1个回答
0
投票

考虑这会产生什么:

<button onclick="handleDeleteJob(${job.id})">Delete</button>

但是,当 id 是数字时,它只适用于 id。

因为当它是一个数字时,你会生成这样的代码:

<button onclick="handleDeleteJob(123)">Delete</button>

数字是语言语法的一部分,所以这里没有问题。

如果 id 是字符串,则会显示 'id' 未定义

非数值会产生什么? 像这样的东西:

<button onclick="handleDeleteJob(thisisastring)">Delete</button>

这在语法上无效,因为您没有使用string,而是像变量一样使用它。 并且该变量未定义。

JavaScript 中字符串需要用引号引起来:

<button onclick="handleDeleteJob('${job.id}')">Delete</button>
© www.soinside.com 2019 - 2024. All rights reserved.