改进JavaScript代码,给水果有序赋色

简介: 改进JavaScript代码,给水果有序赋色

0 前言

在    完善JavaScript代码,给水果随机赋色 _PurpleEndurer@5lcto的技术博客_51CTO博客 中,我们使用系统随机数来生成随机的颜色代码来赋予用户输入的水果 ,增加了网页的视觉效果和灵动性。

同时我们也提出了另一种给水果有序赋色的方法:

添加一个颜色数组来存放一些预定义好的颜色,然后按照水果在列表的顺序依次赋予颜色,当颜色使用到数组的最后一个元素后又重头开始使用,这样虽然不同的水果可能会具有相同的颜色,但水果列表中水果名称将以具有一定顺序规律的颜色来显示,从用户的角度看起来,也是令人赏心悦目的。

现在我们就来改进代码,实现给水果有序赋色。

1 选择颜色表示方法

在    完善JavaScript代码,给水果随机赋色 _PurpleEndurer@5lcto的技术博客_51CTO博客 中,我们介绍了网页中表示颜色的三种方法。这三种方法都可以存储到数组中,并且具有不同的优点和缺点。

对于使用颜色名称的英文单词表示这种方式,优点是看名字就能识别颜色,缺点是在 W3C 的 HTML 4.0 标准中只支持 16 种颜色名,数量较少。

对于使用RGB格式 和 在css中使用HSL 这两种表示颜色的方法, 优点是可以表示的颜色数量非常多,缺点就是不够直观,不能直接识别出对应的颜色。

2 改进代码,给水果有序赋色

我们以  用HTML DOM实现有条件地渲染网页元素(下)_PurpleEndurer@5lcto的技术博客_51CTO博客中的代码:

<script>
  function showFruit(e)
  {
  //var oUL =  document.getElementById('ulFruit');
  //alert(oUL.childElementCount);
  var coLi = document.getElementById('ulFruit').children;
  //alert(coLi.length);
  for (var i = 0; i < coLi.length; i++)
  {
    //alert(coLi[i].title);
    coLi[i].style.display = (e.target.value==coLi[i].innerText ? "list-item" : "none");
  } // for
  } // showFruit(v)
var aFruits = new Array(['苹果', 'Apple', 'red'],
    ['桔子', 'Orange', 'orange'],
    ['葡萄', 'Grape', 'purple'],
    ['芒果','Mango','yellow'],
    ['其它', 'Other', 'blue']);
function genFruitOption()
{
  var oDivFruit = document.getElementById('divFruit');
  oDivFruit.innerHTML = '';//清空原有水果选项
  var oP;//<p>对象
  var oIn;// <input>对象
  var oLa;// <label>对象
  for (var i=0; i<aFruits.length; i++)
  {
  //创建<p>
  oP = document.createElement("P");
   
    //创建<input type="raido">
  oIn = document.createElement("input");
  oIn.type = 'radio';   //类型
  oIn.name = "fruit";   //
  oIn.id = 'ra' + aFruits[i][1];  //id
  oIn.value = aFruits[i][0];  //值
    oIn.addEventListener("click", showFruit); //增加click事件监听器
  //创建<label>
  oLa = document.createElement('label')
  oLa.htmlFor = 'ra' + aFruits[i][1];
  oLa.appendChild(document.createTextNode(aFruits[i][0]));
    //向<div>容器追加网页元素<P><input><label>对象
  oDivFruit.appendChild(oP);
  oDivFruit.appendChild(oIn);
  oDivFruit.appendChild(oLa);
  } //for
} //genFruitOption()
function genFruitLi()
{
  var oUL =  document.getElementById('ulFruit');
  oUL.innerHTML = ''; //清空原有水果列表项  
  var oLi;
  //添加水果列表项
  for (var i=0; i<aFruits.length; i++)
  {
  oLi = document.createElement("li");
  oLi.appendChild(document.createTextNode(aFruits[i][0]));
  oLi.style.color = aFruits[i][2]; //设置颜色
  oUL.appendChild(oLi);
  } //for  
} //genFruitLi()
function addFruit()
{
  //获取用户添加的水果名称
  var sFruit = document.getElementById('itFruit').value;
  //aFruits.unshift([sFruit, ('fruit'+aFruits.length) , 'black']);//把用户添加的水果名称加入数组头部,成为第1个元素
  aFruits.push([sFruit, ('fruit'+aFruits.length) , 'black']);//把用户添加的水果名称加入数组尾部,成为最后一个元素
  genFruitOption();//更新用户可选水果的列表
  genFruitLi(); //更新展示用户选择水果的列表
}
</script>
<p>用JavaScript响应click事件有条件地渲染网页元素</p>
<p>(允许用户添加自己喜欢的水果)</p>
<p style="margin-left:20%; color:purple; font-weight:bold;">
  by PurpleEndurer
</p>
<p>你喜欢哪种水果?</p>
<div id="divFruit">
<script>
  genFruitOption();
</script>
</div>  
<p style="color:#0033ff">
  温馨提示:如果以上没有您喜欢的水果,您可以输入和添加喜欢的水果名称到列表中:
  <input type="text" id="itFruit" value="水果名称" />  
  <input type="button" value="添加" onclick="addFruit()" />
</p>
<p>你喜欢的是:</p>
<ul id="ulFruit">
<script>
  genFruitLi();
</script>
</ul>


为基础进行改进。

2.1 定义颜色数组

我们选择 使用颜色名称的英文单词表示这种方式 来进行演示。

我们定义一个名为aColors的数组,数组的元素就是W3C 的 HTML 4.0 标准中所支持 16 种颜色名的英文单词,由于网页背景色一般默认为白色(white),所以我们水果名称使用白色来显示的话,就看不出来,所以我们把数组中的"while"注释掉,这样aColors数组包含15个元素,包括了除了白色外的其余15种颜色。

const aColors = new Array("aqua", //浅绿色
    "black",  //黑色
    "blue", //蓝色
    "fuchsia",  //紫红色
    "gray", //灰色
    "green",  //绿色
    "lime", //酸橙色
    "maroon", //栗色
    "navy", //海军蓝
    "olive",  //橄榄色
    "purple", //紫色
    "red",  //红色
    "silver", //银色
    "teal", //蓝绿色
    //"white",  //白色
    "yellow"  //黄色
);

2.2 修改aFruits数组

在原始的aFruits数组中:

var aFruits = new Array(['苹果', 'Apple', 'red'],
    ['桔子', 'Orange', 'orange'],
    ['葡萄', 'Grape', 'purple'],
    ['芒果','Mango','yellow'],
    ['其它', 'Other', 'blue']);

每行存储一种水果信息,其中最后一个元素存储的是水果的颜色,我们是直接指定了颜色,比如‘red''purple'等。

现在我们定义了 颜色数组aColors,那么我们从头开始就使用颜色数组aColors中的颜色来作为水果的颜色 ,用aColors[0]代替'red',用用aColors[1]代替'orange'……

替换完成后的aFruits数组代码如下:

var aFruits = new Array(['苹果', 'Apple',aColors[0]],
    ['桔子', 'Orange', aColors[1]],
    ['葡萄', 'Grape', aColors[2]],
    ['芒果','Mango',aColors[3]],
    ['其它', 'Other', aColors[4]]);

2.3 修改 addFruit函数

addFruit函数的功能是把用户输入的水果名称加入到aFruits数组。

原先的addFruit函数代码如下:

function addFruit()

{
  //获取用户添加的水果名称
  var sFruit = document.getElementById('itFruit').value;
  //aFruits.unshift([sFruit, ('fruit'+aFruits.length) , 'black']);//把用户添加的水果名称加入数组头部,成为第1个元素
  aFruits.push([sFruit, ('fruit'+aFruits.length) , 'black']);//把用户添加的水果名称加入数组尾部,成为最后一个元素
  genFruitOption();//更新用户可选水果的列表
  genFruitLi(); //更新展示用户选择水果的列表
}

其中:

aFruits.push([sFruit, ('fruit'+aFruits.length) , 'black']);//把用户添加的水果名称加入数组尾部,成为最后一个元素

在这行代码的功能是我们是把用户输入的水果名称加入水果信息数组aFruits的末尾,其中指定水果颜色是'black'(黑色),现在我们要把'black' 改为 颜色数组 aColors中的颜色名称aColors[x]。

这样修改的话,对于其中用来选择颜色的数组下标x,我们还需要考虑两个问题。

第一个问题,x的值是多少?也就是说, 我们要如何来计算它的值呢?

由于我们是从头开始就使用颜色数组aColors中的颜色来作为水果的颜色,用户输入的水果将会加入到数组aFruits的末尾,那么我们可以使用数组aFruits的长度(aFruits.length)作为x的值。

第二个问题,当水果数组aFruits的元素个数超过 颜色数组aColors的元素个数怎么办?

例如, 颜色数组aColors的元素个素是15个(数组下标取值范围是0~14),对于水果数组aFruits的第16个元素,它的颜色怎么获取呢?

我们可以重头开始使用数组aColors的颜色。

如何实现使用到数组aColors的最后一个颜色后又从头开始呢?我们可以使用%进行取模运算(取余运算),比如:14%15=14, 15%15=0,16 %15=1。

这样,我们计算aColors[x]中x值的表达式为:aFruits.length % aColors.length。

因此,我们把 'black'修改为 aColors[ aFruits.length % aColors.length ]。

进行以上改造后的addFruit函数代码如下:

function addFruit()
{
  //获取用户添加的水果名称
  var sFruit = document.getElementById('itFruit').value;
  /*
  //把用户添加的水果名称加入数组头部,成为第1个元素
  aFruits.unshift([sFruit,  //水果名称
  ('fruit'+aFruits.length) ,  //id
  aColors[aFruits.length % aColors.length ]   //颜色
  ]);
  */
  //把用户添加的水果名称加入数组尾部,成为最后一个元素
  aFruits.push([sFruit,    //水果名称
    ('fruit'+aFruits.length), //id
    aColors[ aFruits.length % aColors.length ] //颜色
  ]);
  genFruitOption();//更新用户可选水果的列表
  genFruitLi(); //更新展示用户选择水果的列表
}

2.4 修改网页元素描述代码

我们需要修改3个地方。

2.4.1 修改技术改进说明

即将

<p>(允许用户添加自己喜欢的水果)</p>

改为

<p>(允许用户添加自己喜欢的水果并依次赋色)</p>

为了方便查看代码运行的效果,我们还要修改 用户可选水果列表 和 显示用户选择结果的水果名称列表 ,为两个水果列表设置长度、宽度,并使用滚动条。

2.4.2 修改用户可选水果列表

<p>你喜欢哪种水果?</p>
<div id="divFruit">

改为

<p>你喜欢哪种水果?</p>
<div id="divFruit" style="height:200px; width:300px;  overflow-y:auto;">

在这里,我们通过 style属性指定列表的高度(height)为200象素,宽度(width)为300象素,垂直滚动条(overflow-y)根据需要显示(auto)。

2.4.3 修改显示用户选择结果的水果名称列表

我们参照 2.4.2 修改用户可选水果列表 来 修改显示用户选择结果的水果名称列表,即将:

<p>你喜欢哪种水果?</p>
<div id="divFruit" style="height:200px; width:300px;  overflow-y:auto;">

改为

<p>你喜欢的是:</p>
<ul id="ulFruit" style="height:200px; width:300px; overflow-y:auto;">

3 改造后的最终代码

综合以上修改后的最终代码如下:

<script>
  function showFruit(e)
  {
  //var oUL =  document.getElementById('ulFruit');
  //alert(oUL.childElementCount);
  var coLi = document.getElementById('ulFruit').children;
  //alert(coLi.length);
  for (var i = 0; i < coLi.length; i++)
  {
    //alert(coLi[i].title);
    coLi[i].style.display = (e.target.value==coLi[i].innerText ? "list-item" : "none");
  } // for
  } // showFruit(v)
const aColors = new Array("aqua", //浅绿色
    "black",  //黑色
    "blue", //蓝色
    "fuchsia",  //紫红色
    "gray", //灰色
    "green",  //绿色
    "lime", //酸橙色
    "maroon", //栗色
    "navy", //海军蓝
    "olive",  //橄榄色
    "purple", //紫色
    "red",  //红色
    "silver", //银色
    "teal", //蓝绿色
    //"white",  //白色
    "yellow"  //黄色
);
var aFruits = new Array(['苹果', 'Apple',aColors[0]],
    ['桔子', 'Orange', aColors[1]],
    ['葡萄', 'Grape', aColors[2]],
    ['芒果','Mango',aColors[3]],
    ['其它', 'Other', aColors[4]]);
function genFruitOption()
{
  var oDivFruit = document.getElementById('divFruit');
  oDivFruit.innerHTML = '';//清空原有水果选项
  var oP;//<p>对象
  var oIn;// <input>对象
  var oLa;// <label>对象
  for (var i=0; i<aFruits.length; i++)
  {
  //创建<p>
  oP = document.createElement("P");
   
    //创建<input type="raido">
  oIn = document.createElement("input");
  oIn.type = 'radio';   //类型
  oIn.name = "fruit";   //
  oIn.id = 'ra' + aFruits[i][1];  //id
  oIn.value = aFruits[i][0];  //值
    oIn.addEventListener("click", showFruit); //增加click事件监听器
  //创建<label>
  oLa = document.createElement('label')
  oLa.htmlFor = 'ra' + aFruits[i][1];
  oLa.appendChild(document.createTextNode(aFruits[i][0]));
    //向<div>容器追加网页元素<P><input><label>对象
  oDivFruit.appendChild(oP);
  oDivFruit.appendChild(oIn);
  oDivFruit.appendChild(oLa);
  } //for
} //genFruitOption()
function genFruitLi()
{
  var oUL =  document.getElementById('ulFruit');
  oUL.innerHTML = ''; //清空原有水果列表项  
  var oLi;
  //添加水果列表项
  for (var i=0; i<aFruits.length; i++)
  {
  oLi = document.createElement("li");
  oLi.appendChild(document.createTextNode(aFruits[i][0]));
  oLi.style.color = aFruits[i][2]; //设置颜色
  oUL.appendChild(oLi);
  } //for  
} //genFruitLi()
function addFruit()
{
  //获取用户添加的水果名称
  var sFruit = document.getElementById('itFruit').value;
  /*
  //把用户添加的水果名称加入数组头部,成为第1个元素
  aFruits.unshift([sFruit,  //水果名称
  ('fruit'+aFruits.length) ,  //id
  aColors[aFruits.length % aColors.length ]   //颜色
  ]);
  */
  //把用户添加的水果名称加入数组尾部,成为最后一个元素
  aFruits.push([sFruit,    //水果名称
    ('fruit'+aFruits.length), //id
    aColors[ aFruits.length % aColors.length ] //颜色
  ]);
  genFruitOption();//更新用户可选水果的列表
  genFruitLi(); //更新展示用户选择水果的列表
}
</script>
<p>用JavaScript响应click事件有条件地渲染网页元素</p>
<p>(允许用户添加自己喜欢的水果并依次赋色)</p>
<p style="margin-left:20%; color:purple; font-weight:bold;">
  by PurpleEndurer
</p>
<p>你喜欢哪种水果?</p>
<div id="divFruit" style="height:200px; width:300px;  overflow-y:auto;">
<script>
  genFruitOption();
</script>
</div>  
<p style="color:#0033ff">
  温馨提示:如果以上没有您喜欢的水果,您可以输入和添加喜欢的水果名称到列表中:
  <input type="text" id="itFruit" value="水果名称" />  
  <input type="button" value="添加" onclick="addFruit()" />
</p>
<p>你喜欢的是:</p>
<ul id="ulFruit" style="height:200px; width:300px; overflow-y:auto;">
<script>
  genFruitLi();
</script>
</ul>

4 代码运行效果

可以看到,水果16的颜色和列表中第1种水果苹果的颜色相同,水果17的颜色和列表中第2种水果桔子的颜色相同,说明我们又重头开始使用颜色了。

5 小结

我们把 W3C 的 HTML 4.0 标准中所支持的16 种颜色名的英文单词存储到颜色数组,从头依次把颜色数组中颜色分配给水果,实现了水果有序赋色。

由于 颜色数组 只有15种颜色 ,当水果种类超过15种之后,我们需要回头重新从头开始分配颜色。

如果我们把RGB格式 或HSL 这两种方法表示的颜色存储到颜色数组,那么颜色数组中的颜色数量可以大幅增加,只要存储的颜色足够多,就可以实现不同的水果具有不同的颜色。


相关文章
|
4月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
6月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
174 1
|
7月前
|
JavaScript 前端开发
怀孕b超单子在线制作,p图一键生成怀孕,JS代码装逼娱乐
模拟B超单的视觉效果,包含随机生成的胎儿图像、医疗文本信息和医院标志。请注意这仅用于前端开发学习
|
9月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
890 9
|
7月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
129 0
|
10月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
734 11
|
12月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
617 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
12月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
396 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
10月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~