- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 JavaScript 新手。我想要做的是重写我的 data-project
属性以显示我的 projects
数组中的内容,如果 projects
数组大于 6,因为项目框只能容纳 6 个。我一直在尝试查找有关 DOM 的更多信息,但我没有找到适合我的情况的信息。 如果需要更多代码来帮助您理解,请告诉我。还有一些按钮可以过滤存储在数组(位于不同文件中)中的内容。此文件也导入到我的 index.html
中。
此外,如果您有任何学习 DOM 的重要资源,我很乐意将它们发送给我。谢谢!
我的 HTML
<div class="wrapper">
<div class="row" data-project="1">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
<div class="top">
<h3 class="title">Job Listing</h3>
<h6 class="language">HTML/CSS</h6>
<p class="desc">Static Page Containing Job Listings</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">Personal</p>
</div>
</div>
<div class="row" data-project="2">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
<div class="top">
<h3 class="title">Calculator</h3>
<h6 class="language">HTML/CSS, JavaScript</h6>
<p class="desc">Basic JavaScript Calculator</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">Personal</p>
</div>
</div>
<div class="row" data-project="3">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
<div class="top">
<h3 class="title">TODO</h3>
<h6 class="language">HTML/CSS, JavaScript, React</h6>
<p class="desc">Organize your everyday life with this web app made with React</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">Personal</p>
</div>
</div>
<div class="row" data-project="4">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
<div class="top">
<h3 class="title">Login and Signup</h3>
<h6 class="language">HTML/CSS</h6>
<p class="desc">Static Page for logging in and signing up</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">Personal</p>
</div>
</div>
<div class="row" data-project="5">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
<div class="top">
<h3 class="title">RNG Therapy Site</h3>
<h6 class="language">WordPress</h6>
<p class="desc">WordPress site that allows users to schedule appointments.</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">Client</p>
</div>
</div>
<div class="row" data-project="6">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
<div class="top">
<h3 class="title">Coffee Shop Website</h3>
<h6 class="language">HTML/CSS, JavaScript, React</h6>
<p class="desc">Static Page for a Coffee Shop</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">Client</p>
</div>
</div>
</div>
我的 JavaScript(我知道它很乱)
const projectAttributes = [
document.querySelector('[data-project="1"]'),
document.querySelector('[data-project="2"]'),
document.querySelector('[data-project="3"]'),
document.querySelector('[data-project="4"]'),
document.querySelector('[data-project="5"]'),
document.querySelector('[data-project="6"]'),
];
let i = 0;
function domReplaceProjects(projects) {
console.log(projectAttributes.length);
//Use projects array size for loop conditional
if(projects.length <= 6) {
for(i = 0; i <= projects.length; i++) {
projectAttributes[i] = `
<div class="top">
<h3 class="title">${project.name}</h3>
<h6 class="language">${project.desc}</h6>
<p class="desc">${project.language}</p>
</div>
<div class="bottom">
<div class="image"> </div>
<p class="type">${project.type}</p>
</div>
<div class="row">
<img class="logo" src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="image">
</div>
`
}
}
//Use data attributes array size for loop conditional
else {
for(i = 0; i < projectAttributes.length; i++) {
//logic here
}
}
}
最佳答案
动态添加元素——有两种方式。
向 DOM 添加元素的两种最常见的方法是:
创建 htmlString
元素的一部分,并通过...将其呈现给父元素
.innerHTML
用 htmlString
覆盖目标元素中现有 HTML 的属性或者……
.insertAdjacentHTML()
哪个插入 htmlString
到与目标元素相关的给定位置。
通过 document.createElement()
创建一个元素并将其添加到目标元素作为最后一个子元素 .appendChild()
.
问题
选项 #1 似乎是 OP 代码打算实现的。虽然有一个 htmlString
为 projectAttributes
的每次迭代声明,没有呈现 htmlString
的明显属性、方法或函数作为真正的 HTML 到 DOM。此外,projectAttributes
数组已经声明(顺便说一句,有更好的方法将元素收集到 NodeList 或数组 -- document.querySelectorAll('.row')
中)。
此外,大约有 6 个单独的对象实例及其键/值,但在每次迭代中表示时,当前对象未正确指示。通过property
效率不是很高作为一个对象(例如 {key1: value, key2: value,...}
),因为似乎没有办法处理多个对象。
演示
下面的演示有一个函数将接受一个对象数组(例如 [{a: 1, b: "c"}, {a: 2, b: "d"},...]
,一个确定迭代限制的数字,以及一个可选的 bool 值,它确定 DOM 的现有 HTML 是否被新的覆盖HTML 或新的 HTML 被插入到 DOM 中,从而保留了现有的 HTML。还有一个 float 的 <form>
将演示三个用法示例(该部分源代码对于答案的解决方案不是必需的,它是在代码中明确注明)。更多详细信息在演示中进行了评论。
let projects = [{
title: "Convertor",
tech: "HTML/CSS/JavaScript",
desc: "Calculates and converts measurements",
url: "/projects/convertor.html",
pro: false
},
{
title: "RNG Therapy",
tech: "WordPress Platform",
desc: "Schedules appointments for clients",
url: "https://app.rngt.com",
pro: true
},
{
title: "TODO List",
tech: "HTML/CSS/JavaScript",
desc: "Editable task list with autosave",
url: "/projects/todo_list.html",
pro: false
},
{
title: "Kelly's Krafts",
tech: "Etsy Platform",
desc: "Custom shopping cart",
url: "https://etsy.com/shop/KellysKrafts",
pro: true
},
{
title: "TEST 5",
tech: "HTML/CSS/jQuery",
desc: "Test client object (professional list)",
url: "https://example.com",
pro: true
},
{
title: "TEST 6",
tech: "HTML/CSS",
desc: "Test demo object (personal list)",
url: "/projects/test.html",
pro: false
},
{
title: "TEST 7",
tech: "HTML/CSS/JavaScript",
desc: "Test limit object (professional list) - if limit is set to 6, this should not be rendered",
pro: true
}
];
let TEST = [{
title: "TEST 8",
tech: "React Framework",
desc: "Test demo object (personal list)",
pro: false
},
{
title: "TEST 9",
tech: undefined,
desc: "Test client object (professional list)",
pro: true
},
{
title: "TEST A",
tech: "JavaScript (ES6)",
desc: "Test client object (professional list)",
pro: true
},
{
title: "TEST B",
tech: "HTML/CSS(LESS)",
desc: "Test demo object (personal list)",
pro: false
}
];
/*
** setLists(array, limit, overwrite)
** @Params
** - array [Array]: An array of objects.
** Each object should have the following keys:
** title, tech, desc, and pro
** - limit [Number]: How many objects get processed.
** - overwrite [Boolean] {optional}: If undefined it is `true` by default.
** true: All content of each list will be removed before the new content is added.
** false: New content will be added after the old content.
** Purpose: Render <li> with content determined by a given array of objects.
*/
const setLists = (array, limit, overwrite = true) => {
// Collect all <ul> into a NodeList
const lists = document.querySelectorAll('ul');
/* If {limit} is greater than the number of objects in {array} OR (ie ||)
if {limit} is less then 1 OR (ie ||) {limit} isn't a number at all...
then {limit} will be equal to the number of objects within {array}
*/
if (limit > array.length || limit < 1 || Number.isNaN(limit)) {
limit = array.length;
}
/* If {overwrite} is true (this is default)...
then remove all content of each <ul>
*/
if (overwrite) {
for (let list of lists) {
let range = document.createRange();
range.selectNodeContents(list);
range.deleteContents();
}
}
// Each <ul>...
for (let i = 0; i < limit; i++) {
/* Declare {item} as a htmlString
Note:
- Each array element is an object (ex. array[i])
- The current position of the object is indicated by an index number (ex. array[i] "i" is index)
- The property (or key) name is suffixed (ex. array[i].key)
- The result is the value:
(ex. <h3>${array[2].title}</h3> is <h3>TODO List</h3>)
*/
let item = `
<li>
<header>
<h3><a href='${array[i].url}'>${array[i].title}</a></h3>
<p>${array[i].tech}</p>
</header>
<article>${array[i].desc}</article>
</li>`;
// If the current object key "pro" is true...
if (array[i].pro) {
// Insert and render the htmlString as HTML as the last <li> of the first <ul>...
lists[0].insertAdjacentHTML('beforeend', item);
// otherwise...
} else {
// do it to the second <ul>
lists[1].insertAdjacentHTML('beforeend', item);
}
}
// Terminate function
return false;
}
/*~~~The JS below is for demo purposes only~~~*/
document.querySelector('legend, summary').onclick = function(e) {
document.querySelector('main').classList.toggle('shift-down');
}
const ui = document.forms[0];
ui.onchange = runExamples;
function runExamples(e) {
const examples = [{
fnc: 'setLists(projects, null)',
act: 'Passing an array of objects and null'
},
{
fnc: 'setLists(projects, 3)',
act: 'Passing array of only the first 3 objects and overwritting previous lists'
},
{
fnc: 'setLists(TEST, null, false)',
act: 'Passing a different array of objects and appending it to the lists'
}
];
const fields = ui.elements;
const exampleBtn = fields.exp;
const messageOut = fields.msg;
if (e.target.name === 'exp') {
let index = Number(e.target.dataset.idx);
switch (index) {
case 0:
setLists(projects, null);
break;
case 1:
setLists(projects, 3);
break;
case 2:
setLists(TEST, null, false);
break;
default:
break;
}
messageOut[0].value = examples[index].fnc;
messageOut[1].value = examples[index].act;
for (let button of exampleBtn) {
button.parentElement.classList.remove('active');
}
e.target.parentElement.classList.add('active');
}
return false;
}
/*~~~The JS above is not required~~~*/
:root {
font: 16px/1 Arial
}
html,
body {
width: 100%;
height: 100%;
}
/*~~~The CSS below is for demo purposes only~~~*/
form {
position: relative;
}
details {
position: fixed;
top: 5vh;
right: 10vw;
z-index: 1;
width: 50vw;
}
details[open] summary {
position: absolute;
}
fieldset {
font-size: 0.8rem;
padding: 5px 5px 5px 8px;
background: #fff;
}
summary,
legend {
color: #930;
font-size: 1rem;
cursor: pointer;
border: 1px solid grey;
border-radius: 4px;
padding: 3px 5px;
background: #fff;
}
.btn {
display: inline-block;
width: max-content;
padding: 3px 5px;
margin: 5px -3px;
cursor: pointer;
border: 1px solid grey;
}
.btn.active {
color: blue;
}
.btn:hover {
color: green;
}
.left {
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
margin-left: 8px;
}
.right {
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
margin-right: 8px;
}
output {
display: block;
height: 3ex;
width: 90%;
margin: 5px;
padding: 6px 3px 3px;
}
output:first-of-type {
color: lime;
background: #333;
font-family: 'Lucida Console';
font-weight: 700;
padding-bottom: 0;
}
output:last-of-type {
margin-top: 0
}
/*The CSS above is not required*/
main {
display: flex;
flex-flow: column nowrap;
width: 70vw;
height: max-content;
padding: 5vh 20vw 10vh 10vw
}
main.shift-down {
padding-top: 50vh;
}
h1 {
font-size: 1.55rem;
margin-bottom: 5px
}
h2 {
font-size: 1.45rem;
margin-bottom: 5px
}
h3 {
font-size: 1.25rem;
margin-bottom: 5px
}
header {
margin-bottom: 5px
}
header p {
font-style: italic;
margin: 0;
}
h1+p {
font-size: 1.4rem
}
h2+p {
font-size: 1.3rem
}
h3+p {
font-size: 1.1rem
}
.row {
display: flex;
flex-flow: row nowrap;
width: 100%;
height: max-content;
}
.logo {
max-height: 120px;
padding: 0;
margin-left: -10px;
margin-right: 5px
}
.logo img {
display: block;
max-width: 75px;
height: auto;
}
.line {
margin-top: -5px;
}
ul {
list-style: none;
padding-left: 5vw;
margin-top: 5px
}
a {
text-decoration: none;
color: #930;
}
a:hover {
text-decoration: underline
}
<!DOCTYPE html>
<html lang='en'>
<head>
<title>Web Portfolio</title>
<meta charset='utf-8'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--<link href='/projects/externalStyleFile.css' ref='stylesheet'>-->
<style>
/*CSS goes here (see <link> above for external CSS)*/
</style>
</head>
<body>
<!--The HTML below is for demo purposes only-->
<form>
<details>
<summary>Examples</summary>
<fieldset>
<legend>Examples</legend>
<label class='btn left'><input name='exp' data-idx='0' type='radio' hidden>Example 1</label>
<label class='btn'><input name='exp' data-idx='1'type='radio' hidden>Example 2</label>
<label class='btn right'><input name='exp' data-idx='2' type='radio' hidden>Example 3</label><br>
<label>Function: </label><br>
<output name='msg'></output>
<label>Action: </label><br>
<output name='msg'></output>
</fieldset>
</details>
</form>
<!--The HTML above is not required-->
<main>
<header class='row'>
<figure class='logo'>
<img src="https://static.vecteezy.com/system/resources/previews/000/350/423/non_2x/vector-checklist-icon.jpg" alt="icon of a checklist">
</figure>
<hgroup>
<h1>Web Portfolio</h1>
<p>Web development projects</p>
</hgroup>
</header>
<div class='line'>
<hr>
</div>
<header>
<h2>Profesional</h2>
<p>List of client projects</p>
</header>
<ul></ul>
<header>
<h2>Personal</h2>
<p>List of project demos</p>
</header>
<ul></ul>
</main>
<!--<script src='/projects/externalScriptFile.js'></script>-->
<script>
/*JavaScript goes here (see <script> above for external JS)*/
</script>
</body>
</html>
关于javascript - 使用 JavaScript DOM 使用对象数组重写数据属性数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276857/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
Polymer的light DOM和local DOM有什么区别?来自文档(1): The DOM that an element creates and manages is called its
当内容添加到网页时,我需要触发一个 Action 。更新可能具有不同的性质(例如 AJAX、延迟脚本、用户操作)并且不受我的控制。 我想使用 DOM 突变事件,但它们并非在所有浏览器中都可用。是否有为
我刚遇到一个有趣的情况,我有一个提交 放置在 内的 native 自定义元素的 Shadow DOM 内. Select #shadow-root ...
假设有一个滚动列表,当我插入一些新的 DOM 附加到当前 dom 时,它工作正常。上拉 但是如果我之前插入一些新的 DOM,新的 DOM 将在视口(viewport)中,而旧的 DOM 将被下推。下拉
在我的项目中实现 Shadow DOM 是否会使它们像 React 使用的虚拟 DOM 一样更快? 最佳答案 它们是不同用途的不同事物,因此比较性能没有意义。 虚拟 DOM 虚拟 DOM 旨在避免对
在我的页面内容上,我将多张卡片组织成网格 __________________ | ____ ____ | | | | | | | | | | | |
是否可以在浏览器中看到(调试)从 DOM 元素触发的自定义事件? 假设我想查看 Bootstrap Collapse 的哪个特定元素触发了 show.bs.collapse event ,我能以某种方
我正在生成用于客户端的 XPaths 服务器端,我很困惑为什么在 DOM 中找不到表路径(即 td 中的内容)。 事实证明,现代浏览器(至少是 Chrome 和 Firefox)插入了 tbody在文
是否可以检索文本节点的几何位置(即从父元素、页面等的顶部/左侧偏移量)? 最佳答案 不是直接的。 TextNode 没有用于测量视口(viewport)定位的原始 IE 偏移*(和类似的)扩展。 仅在
以下语句中的 DOM 元素的含义是什么? Statement #1 You can add multiple classes to a single DOM element. Statement #2
有没有办法让 firebug(或任何其他浏览器,或使用任何其他工具)阻止任何 dom 操作的发生?有时布局调试充满悬停事件的屏幕是不可能的,因为元素可能会消失,并且您看不到它们的复合布局。 最佳答案
我需要在html文档中搜索 text here 然后输出完整的节点路径(CSS或XPATH) 例如 html > body > div class ="something" > table > tr
这是我的一个页面的典型加载时间如何拆分为:- Domain Lookup 0 0 % Connect 134 .3% Request
我的 .on() 工作时遇到一些问题。我的网站是here . 如果你看看 www.eliteweb-creation.co.uk/dev/js/nav.js,我正在 mouseenter 和 mous
我是 Javascript 的新手,负责将我们产品的 UI 从 YUI2 迁移到 YUI3。看起来哪里都没有迁移指南,所以我现在正在浏览互联网帖子和 yui 文档。 在我的全局范围内,我临时添加了类似
我想和实习生一起测试一些 DOM 相关的东西,不需要特定的固定装置,只是一般的 DOM 东西,比如我改变了 Element.prototype。这是否需要通过本地 Selenium 服务器(或 sau
我是 HTML 和 HTML5 的初学者。 当我阅读以下内容时 link ,我找到了术语 DOM 和 DOM API。我通读了维基百科,但无法理解其背后的全部思想。 谁能给我解释一下: 文档对象模型
我有两个主要问题。 Object 之类的扩展是否算数? 什么是 DOM 包装? http://perfectionkills.com/whats-wrong-with-extending-the-do
对不起查询,原型(prototype),雅虎 YUI,道场在考虑小的时候不吸引我。我想要一个模块化的库,代码尽可能小,最多 20Kb [un compressed] 是我所期望的。应该提供 Dom 操
我是一名优秀的程序员,十分优秀!