本文内容源于这里
首先来看下面这行代码:
[].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) })
你可以在浏览器的控制台执行这段代码,你会看到页面中不同的HTML结构被不同颜色的框圈着。是不是很神奇呢?
其实,它只是进行了如下的操作:获取页面的所有元素,然后给这些元素加上1px的外框(outline),并且使用了随见的颜色。
想法虽然简单,但是要想写出这样的代码,必须对web开发非常熟练。下面通过具体地分析这段代码,来学习相关的知识。
(1)选择页面中的所有元素
在浏览器的控制台中可以使用$$()方法来获取页面中相应的元素,如在浏览器的JavaScript控制台中输入$$('a')并执行,可以得到由当前页面所有<a>标签元素组成的一个列表。
$$函数是现代浏览器提供的一个命令行API,它相当于document.querySelectorAll,可以将当前页面中的CSS选择器作为参数传给该方法,然后它会返回匹配的所有元素。
所以,如果想在浏览器控制台外使用上面这段代码,可以将$$('*')替换为document.querySelectorAll('*')。
(2)遍历元素
通过$$('*')的方式,我们得到了由页面中所有元素组成的一个NodeList节点列表,我们希望为这些节点加上不同颜色的外框。
注意上段代码中的以下部分:
[].forEach.call( $$('*'), function( a ) { /* 具体的操作 */ });
NodeLists有点类似数组,可以通过中括号的方式获取列表中的节点,也可以通过length属性获得列表的长度,但是它不具备数组所具有的方法,因此,无法直接使用$$('*').forEach()。
在JavaScript中,有好几个对象表现得与数组类似,但是它们都不是数组,比如函数内部的arguments变量。
虽然无法直接调用数组方法,但是我们可以通过一个实用的模式来解决它:通过使用函数的call和apply方法,可以实现在类似NodeLists这样的非数组对象上调用数组方法。
函数的call方法使用示例:
function say(name) { console.log( this + ' ' + name ); } say.call( 'hola', 'Mike' ); // Prints out 'hola Mike' in the console // Also you can use it on the arguments object function example( arg1, arg2, arg3 ) { return Array.prototype.slice.call(arguments, 1); // Returns [arg2, arg3] }
在我们之前的那段代码中使用[].forEach.call而没有用Array.prototype.forEach.call简洁了许多。
(3)为元素添加颜色
代码中使用outline的CSS属性给元素添加一个边框。由于渲染的outline是不在CSS盒模型中的,所以为元素添加outline并不会影响元素的大小和页面的布局。但outline的语法与border属性类似,所以也不难理解。
a.style.outline="1px solid #" + color
关键是颜色的定义:
~~(Math.random()*(1<<24))).toString(16)
这里使用了位操作符。
我们希望得到是一个十六机制的颜色值如白色(FFFFFF)或者蓝色(0000FF)或者其它颜色(37f9ac)。
在上面这段代码中,首先我们学到的是使用toString()方法将一个小数转成十六进整数。toString()方法将数值转换成字符串时,接收一个参数用以指明数值的进制。如果省略了该参数,则默认采用十进制,但你可以指定为其他的进制,如下所示。
(30).toString(); // "30" (30).toString(10); // "30" (30).toString(16); // "1e" Hexadecimal (30).toString(2); // "11110" Binary (30).toString(36); // "u" 36 is the maximum base allowed
与之对应,你也可以使用parseInt()方法将一个字符串转换为数值,该方法的第一个参数为需要转换的字符串,第二个参数指明前面字符串所用的进制,结果返回十进制的数:
parseInt("30"); // "30" parseInt("30", 10); // "30" parseInt("1e", 16); // "30" parseInt("11110", 2); // "30" parseInt("u", 36); // "30"
根据前面颜色的分析,其实我们是希望在0和ffffff之间得到一个随机的十六进制数,也就有parseInt('ffffff', 16) = 16777215,而16777215刚好为2^24 - 1
不知道你是否熟悉二进制运算,不管怎样你该知道的是 1<<24 == 16777216(可以在控制台试一下)。
接下来,通过Math.random()*(1<<24)可以得到0~16777216之间的随机数。
到这里还没完事,因为Math.random返回的是一个浮点数,而我们希望得到的是它的整数部分。
这里使用了波浪号(~)操作符来实现,具体的内容可以看看:JavaScript的波浪操作符
上面这段代码使用两个波浪号等价于使用parseInt:
var a = 12.34, // ~~a = 12 b = -1231.8754, // ~~b = -1231 c = 3213.000001 // ~~c = 3213 ; ~~a == parseInt(a, 10); // true ~~b == parseInt(b, 10); // true ~~c == parseInt(c, 10); // true Again, if you go to the gist and have a look
这样最终我们得到了0至16777216之间的随机数,可以用于产生一个随机颜色。得到相应的颜色,我们只需将对应的随机数通过使用toString(16)方法将其转化为十六进制表示的字符串即可。
相关推荐
《JavaScript权威指南》是JavaScript编程领域的一本经典之作,由David Flanagan撰写,深受开发者喜爱。这本书深入浅出地介绍了...所以,即使有了示例代码,也建议新手们亲自敲打每一行代码,以加深理解和记忆。
说明:本资源展示了如何使用 JavaScript 修改 HTML 内容的20行代码示例。JavaScript 是一种强大的脚本语言,它能够在网页中动态地改变和控制 HTML 元素的内容和样式。通过该资源,您将学习基本的 JavaScript 和 ...
总结来说,"100行代码实现的JavaScript MVC样式框架"是一个简化版的前端MVC架构,利用哈希路由实现在客户端的页面导航,通过有限的代码实现基本的模型-视图-控制器功能,为小型项目或学习MVC模式提供了便捷的起点。...
通过这种方式,你可以直观地看到每一行代码的执行结果,这种实践学习法对于加深理解非常有帮助。 在学习这个教程时,建议你按照章节顺序逐步学习,每完成一个章节就尝试自己动手实践,理解并掌握每个概念。同时,...
例如,用 jQuery 选择元素只需一行代码 `$("#elementID")`,而原生 JavaScript 需要更复杂的语法。 在HTML(超文本标记语言)中,我们定义了网页的结构,如标题、段落、链接等。CSS(层叠样式表)则负责网页的布局...
总之,JavaScript编程通过Matlab质心算法定位学习的核心是理解和应用质心算法的数学原理,以及将这种理解转化为JavaScript代码,利用适当的库来实现矩阵运算,从而达到在JavaScript环境中进行图像处理的目的。
6. `<input style="ime-mode:-Disabled">`:这行代码禁用了输入法,适用于不需要输入法的输入字段,例如密码输入框。 7. `if (window == top) top.location.href = "frames.htm";`:这段代码检测当前页面是否在框架...
《JavaScript代码大全》是一本全面的JavaScript编程指南,内容覆盖了JavaScript的核心概念、DOM操作、事件处理、表单处理、CSS样式操控、定时器与cookie管理等多个方面。本书以清晰的字迹和全面的书签,使得阅读体验...
1.本书1~21章所附代码的运行环境 操作系统:Windows 2003、Windows XP Professional,或者Windows 2000 开发环境:UltraEdit12.10a、eclipse-jee-europa Web浏览器:Microsoft Internet Explorer 6.0及以上版本 ...
**谷歌JavaScript代码风格指南** 谷歌JavaScript代码风格指南是开发者遵循的一套编码规范,旨在提高代码的可读性、可维护性和一致性。...通过持续学习和实践,你可以成为一名更优秀的JavaScript开发者。
标签解释:删除添加一行,指的是在网页中通过 JavaScript 动态添加或删除表格行的操作。 部分内容解释: 该代码主要实现了两个功能:动态添加表格行和删除表格行。下面对这两个功能进行详细解释: 动态添加表格行...
1. 字体大小和行宽计算:定义了一个`fontsize`变量表示字体大小,然后通过将画布宽度除以字体大小得到一行能容纳的字符数量(`count`)。这决定了代码雨下落的速度和密度。 2. 字符数组:创建一个名为`arr`的数组,...
JavaScript是Web开发中不可或缺的一部分,尤其对于初学者来说,通过实践来学习是非常有效的途径。"javascript初学者练习代码"提供了一系列实例,旨在帮助新手更好地理解和掌握JavaScript的基本概念和功能。 首先,...
### 原生JS通过一行代码实现简易轮播图 #### 概述 在Web开发领域,轮播图(也称为幻灯片)是一种常见的视觉元素,用于展示多个图像或内容,通过自动或手动切换来增强用户体验。通常情况下,轮播图的实现需要借助于...
本资源的“代码1”可能是这些概念的具体实例,包含了实际的JavaScript代码行,通过学习和实践这些代码,可以帮助初学者更好地理解JavaScript语言的运作方式和应用场景。在学习过程中,结合实际的浏览器环境进行调试...
这款库以其简洁的API著称,开发者只需一行代码就能在网页上集成高质量的地图功能,极大地简化了地图开发流程。 Mapkick.js的核心是利用了现代Web技术如HTML5和SVG,它与流行的测绘服务如Google Maps、Mapbox、Open...
这段代码通过简单的JavaScript实现了表格中复选框的全选、反选和全不选功能。通过对函数的定义、HTML结构的设计以及事件绑定的实现,我们可以有效地管理用户界面上的复选框状态,提高用户体验。这种实现方式在实际...
Web前端工程师进阶修炼的必读之作,将为你通往“JavaScript技术殿堂...每一条建议都可能在你的下一行代码、下一个应用或下一个项目中被用到,建议你将此书放置在手边,随时查阅,一定能使你的学习和开发工作事半功倍。
JavaScript代码检视规范是软件开发中的一个重要环节,它旨在提高代码的质量、可读性和可维护性。遵循统一的编码规范可以使得团队合作更加顺畅,减少因理解差异导致的错误,并且提升整体项目的专业形象。本篇文章将...
《编写高质量代码:改善javascript程序的188个建议》是web前端...书中的每一条建议都可能在你的下一行代码、下一个应用或下一个项目中被用到,建议你将此书放置在手边,随时查阅,一定能使你的学习和开发工作事半功倍。