科百科
当前位置: 首页 范文大全

javascript怎么创建html(使用JavaScript创建可排序的)

时间:2023-06-04 作者: 小编 阅读量: 1 栏目名: 范文大全

数据排序是指将数据按照指定的值,按升序或降序排列。在本教程中,我们将使用JavaScript将来自模拟JSON响应的数据显示到HTML表中。表格内容的单元格将使用来自我们JSON响应的数据通过JavaScript添加。表格可能存在单元格重叠问题或超出整页边界。map方法在数组中的每个项目上执行我们传递给它的函数。在这个map函数中,我们为数组中的每个项目创建一个新单元格,并将单元格innerHTML设置为相应的对象键值。

javascript怎么创建html?在网站上显示数据时,提供使用户更容易浏览数据的功能非常重要其中一项功能是对数据进行排序的能力,接下来我们就来聊聊关于javascript怎么创建html?以下内容大家不妨参考一二希望能帮到您!

javascript怎么创建html

在网站上显示数据时,提供使用户更容易浏览数据的功能非常重要。其中一项功能是对数据进行排序的能力。

数据排序是指将数据按照指定的值,按升序或降序排列。我们可以使用 JavaScript 在网站的客户端手动处理数据排序。如果您在静态网站上工作或从服务器中删除排序数据的冲击,这将特别有用。

在本教程中,我们将使用 JavaScript 将来自模拟 JSON 响应的数据显示到 HTML 表中。我们还将包括根据表头中的值使表可排序的功能。

下面来看看成品。单击任何表格标题以对表格进行相应的排序。

1.用 HTML 放置内容

<table>标签是用于在网页上显示数据的语义 HTML 标签。我们将把我们的<table>标签放在一个表格容器 div 中,这将允许我们在 CSS 中包含一些响应式样式。

<div >

<table >

</table>

</div>

我们的表格将包含表格标题、thead表格内容、tbody标签。在我们的表格标题中,我们将在每个th单元格中包含用于处理排序功能的按钮。表格内容的单元格将使用来自我们 JSON 响应的数据通过 JavaScript 添加。

<div >

<table >

<thead>

<tr>

<th><button >Name</button></th>

<th><button >Type</button></th>

<th><button >HP</button></th>

<th><button >Attack</button></th>

<th><button >Defense</button></th>

<th><button >Sp. Attack</button></th>

<th><button >Sp. Defense</button></th>

<th><button >Speed</button></th>

<th><button >Total</button></th>

</tr>

</thead>

<tbody ></tbody>

</table>

</div>

2.使用 CSS 制作响应式表格

使用 HTML 表格时更常见的问题之一是缺乏响应能力。表格可能存在单元格重叠问题或超出整页边界。

我们可以通过将表格放置在一个表格容器中来解决这些问题,该表格容器是具有溢出滚动属性的整个页面的宽度。这样,表格总是只有整页宽,并且由于可滚动溢出,无需缩小单元格。我们还将在表格单元格中包含 min-width 属性以避免文本换行。

表格溢出视口而不被压扁

这是使我们的表格可滚动所需的 CSS:

.table-container {

width: 100%;

overflow: scroll;

}

table {

width: 100%;

}

然后我们可以添加其余的样式:

.table-container {

margin: auto;

max-width: 1200px;

min-height: 100vh;

overflow: scroll;

width: 100%;

}

table {

border-collapse: collapse;

width: 100%;

}

thead tr {

border-bottom: 1px solid #ddd;

border-top: 1px solid #ddd;

height: 1px;

}

th {

font-weight: bold;

height: inherit;

padding: 0;

}

th:not(:first-of-type) {

border-left: 1px solid #ddd;

}

th button {

background-color: #eee;

border: none;

cursor: pointer;

display: block;

font: inherit;

height: 100%;

margin: 0;

min-width: max-content;

padding: 0.5rem 1rem;

position: relative;

text-align: left;

width: 100%;

}

tbody tr {

border-bottom: 1px solid #ddd;

}

td {

padding: 0.5rem 1rem;

text-align: left;

}

3.将 JSON 数据放入 HTML 表中

对于此示例,我们将使用模拟解析的 JSON 响应。这是我们的数据的样子:

const response = {

"pokedata": [

{

"name": "Bulbasaur",

"type": "Grass",

"hp": 45,

"attack": 49,

"defense": 49,

"spAttack": 65,

"spDefense": 65,

"speed": 45,

"total": 318

},

...

]

}

我们将把数据放在我们的<tbody >标签中,以便我们在 JavaScript 中定位该元素;

const tableContent = document.getElementById("table-content")

行内容将基于我们的response.pokedata. 让我们定义一个基于对象数据创建新行的函数:

const createRow = (obj) => {

const row = document.createElement("tr");

const objKeys = Object.keys(obj);

objKeys.map((key) => {

const cell = document.createElement("td");

cell.setAttribute("data-attr", key);

cell.innerHTML = obj[key];

row.appendChild(cell);

});

return row;

};

在这个函数中,我们使用Object.keys()方法来获取对象键作为一个数组。这是返回值的样子:

Object.keys() 返回一个包含对象键的数组

一旦我们获得了对象键的数组,我们就使用该.map()方法遍历每个键。map 方法在数组中的每个项目上执行我们传递给它的函数。

在这个 map 函数中,我们为数组中的每个项目创建一个新单元格,并将单元格 innerHTML 设置为相应的对象键值。

使用键数组映射对象

最后,我们使用该方法将我们创建的单元格附加到函数开头定义的行中.appendChild()。

现在我们有了行创建函数,我们将定义一个函数来循环遍历response.pokedata数组并将每个新行附加到我们的tableContent元素。

const getTableContent = (data) => {

data.map((obj) => {

const row = createRow(obj);

tableContent.appendChild(row);

});

};

我们将把我们的getTableContent函数传递给一个事件监听器,以便在页面加载后将内容添加到表中。

window.addEventListener("load", () => {

getTableContent(response.pokedata);

});

4.使用 JavaScript 对数据进行排序

现在我们已经创建了表格,让我们添加排序功能。在我们的 HTML 中,我们在标题单元格中包含按钮,这些按钮将对象键作为其 id。现在让我们定位这些按钮:

const tableButtons = document.querySelectorAll("th button");

我们希望根据单击的按钮对数据进行排序,并且还包括一个在单击按钮时切换排序方向(升序或降序)的功能。

我们可以使用该.sort()方法对response.pokedata数组中的数据进行排序。sort 方法接受一个比较两个不同参数的函数,并根据函数响应对它们进行排序:

> 0排序 a 后 b

< 0a先排序b

=== 0a保持和的原始顺序b

compareFunction(a, b) 返回值排序

来源:MDN

关于 sort 方法需要注意的另一件事是它会改变它所操作的原始数组。这意味着它改变了我们原始数组的值。

使用 .sort() 时的数组突变

我们可以通过使用扩展语法来避免改变我们的原始数组[...]

使用扩展语法避免数组变异

现在我们可以创建排序函数了。这就是我们排序函数的逻辑:

  1. 清除 tableContent 元素中的内容
  2. 根据选择的参数和方向对数据进行排序
  3. getTableContent使用函数将排序后的数据附加到我们的 tableContent

const sortData = (data, param, direction = "asc") => {

tableContent.innerHTML = '';

const sortedData =

direction == "asc"

? [...data].sort(function (a, b) {

if (a[param] < b[param]) {

return -1;

}

if (a[param] > b[param]) {

return 1;

}

return 0;

})

: [...data].sort(function (a, b) {

if (b[param] < a[param]) {

return -1;

}

if (b[param] > a[param]) {

return 1;

}

return 0;

});

getTableContent(sortedData);

};

我们的排序函数接受三个参数:

  • data:要排序的数组
  • param:用于对数组进行排序的值
  • direction: 按升序或降序对数组进行排序。默认参数值设置为“asc” 。

    我们通过将 innerHTML 设置为空白字符串来清除 tableContent 元素中的内容。然后我们使用.sort()方法和direction参数来确定数据应该如何排序。我们反转比较函数以便按降序排序。以这种方式使用比较函数可以让我们对数据进行排序,而不考虑类型值(字符串、整数、浮点数等)

    最后,我们将sortedData作为新值传递给我们的表格内容。

    现在我们将排序函数传递给表格按钮的单击事件侦听器,并处理切换排序方向。

    window.addEventListener("load", () => {

    getTableContent(response.pokedata);

    [...tableButtons].map((button) => {

    button.addEventListener("click", (e) => {

    if (e.target.getAttribute("data-dir") == "desc") {

    sortData(response.pokedata, e.target.id, "desc");

    e.target.setAttribute("data-dir", "asc");

    } else {

    sortData(response.pokedata, e.target.id, "asc");

    e.target.setAttribute("data-dir", "desc");

    }

    });

    });

    });

    在这个函数中,我们通过data-dir在按钮上设置一个属性来确定排序方向来处理切换。我们还将更新我们的 CSS 以根据排序方向在按钮旁边显示一个图标:

    th button::after {

    position: absolute;

    right: 0.5rem;

    }

    th button[data-dir="asc"]::after {

    content: url("data:image/svg xml,");

    }

    th button[data-dir="desc"]::after {

    content: url("data:image/svg xml,");

    }

    我们不希望图标显示在所有先前单击的按钮上,因此我们将定义一个resetButtons函数,该函数删除任何未单击按钮的按钮上的 data-dir 属性。

    const resetButtons = (event) => {

    [...tableButtons].map((button) => {

    if (button !== event.target) {

    button.removeAttribute("data-dir");

    }

    });

    };

    我们将该函数传递给我们的按钮事件侦听器,以在单击新按钮时重置以前的按钮

    window.addEventListener("load", () => {

    getTableContent(response.pokedata);

    [...tableButtons].map((button) => {

    button.addEventListener("click", (e) => {

    resetButtons(e);

    if (e.target.getAttribute("data-dir") == "desc") {

    sortData(response.pokedata, e.target.id, "desc");

    e.target.setAttribute("data-dir", "asc");

    } else {

    sortData(response.pokedata, e.target.id, "asc");

    e.target.setAttribute("data-dir", "desc");

    }

    });

    });

    });

    结论

    这样,我们就完成了!我们只使用原生 JavaScript 创建了一个可排序的表!

    • 推荐阅读
    • 铁皮石斛怎么吃是最佳的(自从学会铁皮石斛鲜条)

      ,今天小编就来说说关于铁皮石斛怎么吃是最佳的?下面更多详细答案一起来看看吧!铁皮石斛怎么吃是最佳的铁皮石斛炖鸡对半开剪,利于胶质释出准备煮石斛瘦肉汤小火炖了40分钟铁皮石斛鲜条,铁皮石斛鲜花泡茶红枣30克石斛20克加水400克,用豆浆机上面的稀粥,米糊,辅食功能都可以煮石斛红枣汤,比较稠,胶质煮出来了煲,东北菜,一家三口,一人食,晚餐,午餐,锅具,炖锅,荤菜,热菜

    • 什么是氧化反应(氧化反应简述)

      氧化反应是指物质与氧发生的化学反应,氧气在此过程中提供氧,我来为大家科普一下关于什么是氧化反应?以下内容希望对你有帮助!物质与氧气发生的化学反应是氧化反应的一种;氧气可以和许多物质发生化学反应。氧化时氧化值升高;还原时氧化值降低。氧化、还原都指反应物。氧化也称氧化作用或氧化反应。

    • 冷水腌酸菜50斤放几袋盐(腌酸菜放盐比例是多少)

      冷水腌酸菜50斤放几袋盐腌酸菜大约每100公斤白菜,加0.5-1公斤盐就可以了。大概按照这个比例来放,放少了容易腐烂,而且味道会比较淡,放多了会比较咸。因此,放的时候还要看自己的口味轻重。事情总是“从量变到质变”的,盐加多了,就会抑制细菌的活力,停止繁殖了,酸菜就不可能酸。乳酸菌的繁殖需要一定的盐分,才能够激发乳酸菌的活力,白菜就会比较快的变成酸菜了。

    • 财运旺的妙招(财运旺的妙招有哪些)

      偏财运受七赤破军星影响。五帝铜钱开运法催旺偏财运五帝钱是风水学中非常常用的招财风水摆件之一。“五帝”的意思是指五个清朝最兴旺的皇帝年号分别是“雍正”、“顺治”、“乾隆”、“康熙”、“嘉庆”。而且,清五帝钱中,五位帝王乾隆属金、康熙属木、顺治属水、嘉庆属火、雍正属土。五帝配五行,作为民俗法器,五帝钱兼具天地阴阳五行之精华,威力无穷。或者将其放置在自家神案前四十九天也能有此神效。

    • 成都三级蔬菜批发市场(蔬菜日均可供应量3500吨)

      目前,市场内蔬菜日均可供应量约3500吨,肉类日均供应量600吨,水产海鲜日均可供应量约1000吨。据了解,目前成都农产品公司已与商务、公安、城管等部门开展联动协同,有序开展市场交通疏导、路口三码及核酸报告检查、开设核酸监测点等多项工作。管控区域居民可前往“成都益民购”线上平台下单购买蔬菜类产品,非管控区域居民克前往“惠民白家”线上平台购买特惠蔬菜及肉类套餐。

    • 酒蒙子什么意思(酒蒙子的含义)

      酒蒙子,东北话,有贬义指与酒为友、沾酒就醉,能力低下,醉眼惺忪,整天处于和酒亲密接触的状态,基本上每餐必须要喝酒,或者多或者少,下面我们就来说一说关于酒蒙子什么意思?我们一起去了解并探讨一下这个问题吧!酒蒙子什么意思酒蒙子,东北话,有贬义。从他或者她身边走过,总能闻到酒精的味道。但是人在很多时候是比较清醒的,不过容易喝的缺少理性,东倒西歪,酒后胡言乱语,不能自持。与其相近一词是酒篓子。

    • ipadmini忘记id和密码激活不了(Mini找回密码失败无法激活)

      老婆家姐在2014年招行抽奖得到一台iPadMini,激活后,放在家里一直很少使用。前几天整理家里物品时,这台iPadMini才算重见天日。于是老婆家姐把这台iPadMini寄给了我,希望我能帮她重置AppleID和密码。等拿到这台iPadMini,我才知道重置AppleID和密码,可没有想象中那么简单,甚至对我来说,那是一件不可能完成的任务。

    • 和平精英怎样自己捏脸(和平精英如何自己捏脸)

      和平精英怎样自己捏脸?接下来我们就一起去研究一下吧!在“仓库”的“时装”页面的左上角,有“更改形象”功能,点击进入。进入后,在性别选择下方有3个“自定义形象”框,可保存玩家自定义的人物形象。

    • 亚马逊1075元(亚马逊泄露的信息显示Nothing)

      Nothing将于7月12日推出其首款作品phone,它将运行在骁龙778G芯片之上。最新的价格信息今天在亚马逊上泄露,它在定位上将与更强大的GooglePixel6和三星GalaxyS21FE竞争。德国亚马逊发布的一份清单,显示该公司将以469.99欧元的价格出售这款手机的8/128GB入门型号,12/256GB型号为549.99欧元。欧洲的价格大大高于印度方面传言中的成本。在Nothing确认新设备不会在北美上市后,旧大陆将成为该手机的主要市场。