gpt4 book ai didi

javascript - 使用 JS 将 REST 数据附加到矩阵网格

转载 作者:行者123 更新时间:2023-12-04 07:43:13 26 4
gpt4 key购买 nike

我创建了一个网格/矩阵,我想附加我通过 Fetch 从 SharePoint 列表收集的 JSON 数据。
我为每个方块应用了一个 ID,以便可以附加元素。我到了这个地步,脑子里放了个屁,无法弄清楚如何实际输入/附加数据。我不想要方块上的文字,我在想 (::before and ::after)当我将鼠标悬停在事件所在的方块上时,会弹出一个包含有关事件信息的模式或对话框。
我通过 fetch 提取的数据在 data.d.results 中被格式化为 JSON。
这是数据的示例
JSON 响应

{
"d": {
"results": [
{
"Title": "Pandemic & Natural Disasters",
"Status": "Active",
"Priority": "(1) High",
"Category": "(2)",
"Likelihood": "5",
"Consequence": "3"
},
{
"Title": "New Example",
"Status": "Active",
"Priority": "(1) High",
"Category": "(3)",
"Likelihood": "4",
"Consequence": "4"
},
{
"Title": "Example #2",
"Status": "Active",
"Priority": "(1) High",
"Category": "(3) Performance (Scope)",
"Likelihood": "4",
"Consequence": "3"
},
{
"Title": "Delays",
"Status": "Active",
"Priority": "(1) High",
"Category": "(2) Schedule",
"Likelihood": "5",
"Consequence": "2"
}
]
}
}
所以网格是一个 5x5,对话框/模态的去向取决于数据值 Likelihood(Y-Axis) 和 Consequence(X-Axis)。所以在样本数据中 x=3, y=4 所以它会在黄色方块中。然后在对话框/模式内,文本应显示如下:
-------------------------------------
| Title |
| Category |
| Priority |
| Status |
| Severity
|
------------------------------------
我怎样才能做到这一点?
这是我的矩阵:

.box {
position: relative;
background-color: lightgrey;
color: #fff;
border-radius: 0px;
padding: 20px;
font-size: 150%;
border: 1px solid black;
}

.wrapper {
margin: 60px 0 90px 90px;
display: grid;
grid-gap: 0;
grid-template-columns: repeat(5, 100px);
grid-template-rows: repeat(5, 100px);
grid-auto-flow: column;
}

#red {
background-color: red;
}
#yellow {
background-color: yellow;
}
#green {
background-color: green;
}
section {
position: relative;
width: 600px;
}
p.likelihood {
transform: rotate(-90deg) translateY(-50%);
transform-origin: top;
position: absolute;
top: 50%;
left: -20px;
font-size: 30px;
margin: 0;
}

p.consequence {
font-size: 30px;
position: absolute;
transform: translateX(-50%);
left: calc(50% + 45px);
bottom: -60px;
margin: 0;
}

.numbers-container {
position: absolute;
display: flex;
}

.numbers-container-x {
padding-top: 10px;
left: 90px;
bottom: -25px;
}

.numbers-container-x .number {
width: 100px;
text-align: center;
}

.numbers-container-y {
flex-direction: column-reverse;
left: 70px;
top: 0;
}

.numbers-container-y .number {
height: 100px;
line-height: 100px;
}
<section>
<div class="wrapper">
<div class="box box1" id="5" style="background-color:
#329932;">
</div>
<div class="box box1" id="4" style="background-color:
#329932;">
</div>
<div class="box box1" id="3" style="background-color:
#329932;">
</div>
<div class="box box1" id="2" style="background-color:
#329932;">
</div>
<div class="box box1" id="1" style="background-color:
#329932;">
</div>
<div class="box box1" id="6" style="background-color: #ffff32;">

</div>
<div class="box box1" id="7" style="background-color: #ffff32;">

</div>
<div class="box box1" id="8" style="background-color:
#329932;">

</div>
<div class="box box1" id="9" style="background-color:
#329932;">

</div>
<div class="box box1" id="10" style="background-color:
#329932;">

</div>
<div class="box box1" id="15" style="background-color: #ff3232;">

</div>
<div class="box box1" id="14" style="background-color: #ffff32;">

</div>
<div class="box box1" id="13" style="background-color: #ffff32;">

</div>
<div class="box box1" id="12" style="background-color:
#329932;">

</div>
<div class="box box1" id="11" style="background-color:
#329932;">

</div>
<div class="box box1" id="16" style="background-color: #ff3232;">

</div>
<div class="box box1" id="17" style="background-color: #ff3232;">

</div>
<div class="box box1" id="18" style="background-color: #ffff32;">

</div>
<div class="box box1" id="19" style="background-color: #ffff32;">

</div>
<div class="box box1" id="20" style="background-color:
#329932;">

</div>
<div class="box box1" id="25" style="background-color: #ff3232;">

</div>
<div class="box box1" id="24" style="background-color: #ff3232;">

</div>
<div class="box box1" id="23" style="background-color: #ff3232;">


</div>
<div class="box box1" id="22" style="background-color: #ffff32;">

</div>
<div class="box box1" id="21" style="background-color: #ffff32;">

</div>
</div>

<div class="numbers-container numbers-container-y">
<div class="number">1</div>
<div class="number">2</div>
<div class="number">3</div>
<div class="number">4</div>
<div class="number">5</div>
</div>

<div class="numbers-container numbers-container-x">
<div class="number">1</div>
<div class="number">2</div>
<div class="number">3</div>
<div class="number">4</div>
<div class="number">5</div>
</div>

<p class="likelihood">
Likelihood
</p>
<p class="consequence">
Consequence
</p>
</section>

最佳答案

如果可能的话,您可以按照此模板修改 DOM 结构并让 5 行包含 5 个框,从而使您更轻松:

  <div class="wrapper">
<div class="row">
<div class="box"></div>
<div class="box"></div>
...
</div>
<div class="row">
<div class="box"></div>
<div class="box"></div>
...
</div>
</div>
然后你可以很容易地在 JavaScript 中使用这个函数来获取相应的框节点:
const getBoxNode = (x, y) => {
const rowId = Math.abs(y - 5)
const row = document.querySelector(`.row:nth-child(${rowId + 1})`)

return row.querySelector(`.box:nth-child(${x})`)
}
然后,您可以将数据添加到此节点:
const appendData = (data) => {
const {Title, category, Priority, Status, Severity} = data
const x = data.consequence
const y = data.likelihood

const box = getBoxNode(x, y);

// add texts
[Title, category, Priority, Status, Severity].forEach((text) => {
const pNode = document.createElement('p')
pNode.textContent = text

box.appendChild(pNode)
})
}
这里是完整的代码:

const risks = {
"d": {
"results": [{
"Title": "Pandemic & Natural Disasters",
"Status": "Active",
"Priority": "(1) High",
"Category": "(2)",
"Likelihood": "5",
"Consequence": "3"
},
{
"Title": "New Example",
"Status": "Active",
"Priority": "(1) High",
"Category": "(3)",
"Likelihood": "4",
"Consequence": "4"
},
{
"Title": "Example #2",
"Status": "Active",
"Priority": "(1) High",
"Category": "(3) Performance (Scope)",
"Likelihood": "4",
"Consequence": "3"
},
{
"Title": "Delays",
"Status": "Active",
"Priority": "(1) High",
"Category": "(2) Schedule",
"Likelihood": "5",
"Consequence": "2"
}
]
}
}




const getBoxNode = (x, y) => {
const rowId = Math.abs(y - 5)
const row = document.querySelector(`.row:nth-child(${rowId + 1})`)

return row.querySelector(`.box:nth-child(${x})`)
}

const appendData = (item) => {
const {
Title,
Category,
Priority,
Status,
Severity
} = item
const x = Number(item.Consequence)
const y = Number(item.Likelihood)

const box = getBoxNode(x, y);

// add texts
[Title, Category, Priority, Status, Severity].forEach((text) => {
const pNode = document.createElement('p')
pNode.textContent = text

box.appendChild(pNode)
})
}

Promise.resolve(risks)
.then((data) => {
data.d.results.forEach((item) => {
appendData(item)
});
});
.row {
display: flex;
}

.box {
position: relative;
background-color: lightgrey;
color: #fff;
border-radius: 0px;
width: 98px;
height: 98px;
font-size: 150%;
border: 1px solid black;
overflow: scroll;
}

.box p {
font-size: 12px;
color: black;
margin: 5px;
}

.wrapper {
margin: 60px 0 90px 90px;
}

#red {
background-color: red;
}

#yellow {
background-color: yellow;
}

#green {
background-color: green;
}

section {
position: relative;
width: 600px;
}

p.likelihood {
transform: rotate(-90deg) translateY(-50%);
transform-origin: top;
position: absolute;
top: 50%;
left: -20px;
font-size: 30px;
margin: 0;
}

p.consequence {
font-size: 30px;
position: absolute;
transform: translateX(-50%);
left: calc(50% + 45px);
bottom: -60px;
margin: 0;
}

.numbers-container {
position: absolute;
display: flex;
}

.numbers-container-x {
padding-top: 10px;
left: 90px;
bottom: -25px;
}

.numbers-container-x .number {
width: 100px;
text-align: center;
}

.numbers-container-y {
flex-direction: column-reverse;
left: 70px;
top: 0;
}

.numbers-container-y .number {
height: 100px;
line-height: 100px;
}
<section>
<div class="wrapper">
<div class="row">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="row">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="row">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="row">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="row">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>

<div class="numbers-container numbers-container-y">
<div class="number">1</div>
<div class="number">2</div>
<div class="number">3</div>
<div class="number">4</div>
<div class="number">5</div>
</div>

<div class="numbers-container numbers-container-x">
<div class="number">1</div>
<div class="number">2</div>
<div class="number">3</div>
<div class="number">4</div>
<div class="number">5</div>
</div>

<p class="likelihood">
Likelihood
</p>
<p class="consequence">
Consequence
</p>
</section>

查看 JsFiddle .

关于javascript - 使用 JS 将 REST 数据附加到矩阵网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67338277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com