`
2008winstar
  • 浏览: 60750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • chenke: 写的很好,也可以看看那这个文章,我感觉学的还可以。http:/ ...
    HTML

通过一行代码学JavaScript

 
阅读更多

本文内容源于这里

 

首先来看下面这行代码:

[].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权威指南示例代码.zip

    《JavaScript权威指南》是JavaScript编程领域的一本经典之作,由David Flanagan撰写,深受开发者喜爱。这本书深入浅出地介绍了...所以,即使有了示例代码,也建议新手们亲自敲打每一行代码,以加深理解和记忆。

    JavaScript 能够改变 HTML 内容(20行代码)

    说明:本资源展示了如何使用 JavaScript 修改 HTML 内容的20行代码示例。JavaScript 是一种强大的脚本语言,它能够在网页中动态地改变和控制 HTML 元素的内容和样式。通过该资源,您将学习基本的 JavaScript 和 ...

    100 行代码实现的 JavaScript MVC 样式框架

    总结来说,"100行代码实现的JavaScript MVC样式框架"是一个简化版的前端MVC架构,利用哈希路由实现在客户端的页面导航,通过有限的代码实现基本的模型-视图-控制器功能,为小型项目或学习MVC模式提供了便捷的起点。...

    JavaScript 案例教程源码

    通过这种方式,你可以直观地看到每一行代码的执行结果,这种实践学习法对于加深理解非常有帮助。 在学习这个教程时,建议你按照章节顺序逐步学习,每完成一个章节就尝试自己动手实践,理解并掌握每个概念。同时,...

    JavaScript+jQuery交互式Web前端开发-源代码.zip

    例如,用 jQuery 选择元素只需一行代码 `$("#elementID")`,而原生 JavaScript 需要更复杂的语法。 在HTML(超文本标记语言)中,我们定义了网页的结构,如标题、段落、链接等。CSS(层叠样式表)则负责网页的布局...

    【JavaScript源代码】JavaScript编程通过Matlab质心算法定位学习.docx

    总之,JavaScript编程通过Matlab质心算法定位学习的核心是理解和应用质心算法的数学原理,以及将这种理解转化为JavaScript代码,利用适当的库来实现矩阵运算,从而达到在JavaScript环境中进行图像处理的目的。

    javascript经典代码大全.pdf

    6. `&lt;input style="ime-mode:-Disabled"&gt;`:这行代码禁用了输入法,适用于不需要输入法的输入字段,例如密码输入框。 7. `if (window == top) top.location.href = "frames.htm";`:这段代码检测当前页面是否在框架...

    JavaScript代码大全

    《JavaScript代码大全》是一本全面的JavaScript编程指南,内容覆盖了JavaScript的核心概念、DOM操作、事件处理、表单处理、CSS样式操控、定时器与cookie管理等多个方面。本书以清晰的字迹和全面的书签,使得阅读体验...

    JavaScript完全自学宝典 源代码

    1.本书1~21章所附代码的运行环境 操作系统:Windows 2003、Windows XP Professional,或者Windows 2000 开发环境:UltraEdit12.10a、eclipse-jee-europa Web浏览器:Microsoft Internet Explorer 6.0及以上版本 ...

    Google JavaScript代码风格指南

    **谷歌JavaScript代码风格指南** 谷歌JavaScript代码风格指南是开发者遵循的一套编码规范,旨在提高代码的可读性、可维护性和一致性。...通过持续学习和实践,你可以成为一名更优秀的JavaScript开发者。

    JS删除或者添加一行的代码

    标签解释:删除添加一行,指的是在网页中通过 JavaScript 动态添加或删除表格行的操作。 部分内容解释: 该代码主要实现了两个功能:动态添加表格行和删除表格行。下面对这两个功能进行详细解释: 动态添加表格行...

    【JavaScript源代码】JavaScript canvas实现代码雨效果.docx

    1. 字体大小和行宽计算:定义了一个`fontsize`变量表示字体大小,然后通过将画布宽度除以字体大小得到一行能容纳的字符数量(`count`)。这决定了代码雨下落的速度和密度。 2. 字符数组:创建一个名为`arr`的数组,...

    javascript初学者练习代码

    JavaScript是Web开发中不可或缺的一部分,尤其对于初学者来说,通过实践来学习是非常有效的途径。"javascript初学者练习代码"提供了一系列实例,旨在帮助新手更好地理解和掌握JavaScript的基本概念和功能。 首先,...

    原生js通过一行代码实现简易轮播图.docx

    ### 原生JS通过一行代码实现简易轮播图 #### 概述 在Web开发领域,轮播图(也称为幻灯片)是一种常见的视觉元素,用于展示多个图像或内容,通过自动或手动切换来增强用户体验。通常情况下,轮播图的实现需要借助于...

    javascript学习代码

    本资源的“代码1”可能是这些概念的具体实例,包含了实际的JavaScript代码行,通过学习和实践这些代码,可以帮助初学者更好地理解JavaScript语言的运作方式和应用场景。在学习过程中,结合实际的浏览器环境进行调试...

    Mapkickjs用一行JavaScript代码创建漂亮的交互式地图

    这款库以其简洁的API著称,开发者只需一行代码就能在网页上集成高质量的地图功能,极大地简化了地图开发流程。 Mapkick.js的核心是利用了现代Web技术如HTML5和SVG,它与流行的测绘服务如Google Maps、Mapbox、Open...

    javascript脚本代码

    这段代码通过简单的JavaScript实现了表格中复选框的全选、反选和全不选功能。通过对函数的定义、HTML结构的设计以及事件绑定的实现,我们可以有效地管理用户界面上的复选框状态,提高用户体验。这种实现方式在实际...

    《编写高质量代码-改善JavaScript程序的188个建议》PDF

    Web前端工程师进阶修炼的必读之作,将为你通往“JavaScript技术殿堂...每一条建议都可能在你的下一行代码、下一个应用或下一个项目中被用到,建议你将此书放置在手边,随时查阅,一定能使你的学习和开发工作事半功倍。

    Javascript代码检视规范

    JavaScript代码检视规范是软件开发中的一个重要环节,它旨在提高代码的质量、可读性和可维护性。遵循统一的编码规范可以使得团队合作更加顺畅,减少因理解差异导致的错误,并且提升整体项目的专业形象。本篇文章将...

    编写高质量代码-改善JavaScript程序的188个建议,完整扫描版

    《编写高质量代码:改善javascript程序的188个建议》是web前端...书中的每一条建议都可能在你的下一行代码、下一个应用或下一个项目中被用到,建议你将此书放置在手边,随时查阅,一定能使你的学习和开发工作事半功倍。

Global site tag (gtag.js) - Google Analytics