`

从一行CSS调试代码中学到的JavaScript知识

阅读更多

http://www.iteye.com/news/30221

http://arqex.com/939/learning-much-javascript-one-line-code?utm_source=ourjs.com

现在到处都是JavaScript,每天都能知道点新东西。一旦你入了门,你总能从这里或是那里领悟到很多知识。 

一旦我发现一些有意思的东西,我喜欢去感觉他们的源代码,看一看它是怎么办到的。 

今天我想分享Addy Osmani的一行代码,这行代码对于你调试你的CSS是很有用的。为了可读性,我把它变成了3行。 

注* Addy Osmani 是Google Chrome开发工程师,他前几天开发的字符串解析模板,马上被兼容最新ES6标准的io.js采纳。 

[].forEach.call($$("*"),function(a){
  a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)
})

 

尝试在你浏览器的Console(F12)中运行一下,你会发现页面被不同的颜色块高亮了,这个方法非常简单,但是你自己写的话可能产生非常多的代码,让我们来研究一下它是怎么实现的。 

选择一个页面上的所有元素 

我们首先需要选择页面上的所有元素。Addy使用了只能在console调试工具中使用的$$函数,你可以在console中输入$$('a')自己试一下。它会返回当前页面的所有anchor(链接)元素。 

$$与document.querySelectorAll是等价的。所以$$('*')与 document.querySelectorAll('*')是等价的,有兴趣的话可以看看$$和$选择器的历史。 

对于我来说,$$的使用已经让我学到了很多。但是选择页面上的所有元素的知识还有很多。Mathias Bynens就在评论中指出document.all 其实也能选取选用元素,而且兼容所有主流浏览器。 
遍历所有的元素 

现在我们有了一个所有元素的节点列表(NodeList),现在我们想遍历它们,并给他们加上有颜色的边框。我们先看看能从这行代码里发现什么: 

Js代码 
  1. [].forEach.call( $$('*'), function( element ) { /* And the modification code here */ });  


NodeList看起来像一个Array(数组),你可以使用中括号来访问他们的节点,而且你还可以通过length属性知道它有多少元素。但是它并没有实现Array的所有接口,因此使用 $$('*').forEach 会返回错误,在JavaScript的世界里,有一堆看起来像Array但其实不是的对象。如function中的arguments对象。因此在他们身上通过call和apply来应用数组的方法是非常有用的。我之前写过一篇文章来解析它们的用法,下面是一个例子: 

Js代码 
  1. function say(name) {  
  2.  console.log( this + ' ' + name );  
  3. }  
  4.    
  5. say.call( 'hola', 'Mike' );  
  6. // 打印输出 'hola Mike'  


之前的一行代码使用 [].forEach.call 代替 Array.prototype.forEach.call 减少了代码的编写量 ( 另外一个很有意思的地方 );如果$$('*')返回是个数组的话,它与$$('*').forEach是等价的。 

如果你看看评论,还有人使用for(i=0;A=$$('*');)让代码变得更短,但是它在全局对象中注入了变量。 

你可以带上var声明,如 

Js代码 
  1. for(var i=0,B=document.querySelectorAll('*');A=B[i++];){ /* your code here */ }  


其中i和B将只声明在console的上下文中。 

改变元素的颜色 

让元素有一个漂亮的边框,这行代码使用了CSS的outline属性。有一点你可能不知道,在CSS渲染的盒子模型(Box Model)中,outline并不会改变元素及其布局的位置。因此这比使用border属性要好得多,所以这一部分其实并不难理解 

Js代码 
  1. a.style.outline="1px solid #" + color  


怎样定义颜色值其实是比较有意思的 

Js代码 
  1. ~~(Math.random()*(1<<24))).toString(16)  


我不是特别懂位运算,因此我最喜欢这一段。 

我们想构造的其实是一个16进制的颜色值,像白色FFFFFF,蓝色0000FF等等。 

首先我们学到了可以使用数字类型的toString方法进行十进制到16进制的转换。 

其实你可以用它进行任意进制的转换 

Js代码 
  1. (30).toString();   // "30"  
  2. (30).toString(10); // "30"  
  3. (30).toString(16); // "1e" 16进制  
  4. (30).toString(2); // "11110" 二进制  
  5. (30).toString(36); // "u" 36 是最大允许的进制  


因此16进制中的ffffff其实是 parseInt("ffffff", 16) == 16777215,16777215是2^24 - 1的值 

因此左位移操作乖以一个随机数 Math.random()*(1<<24) 可以得到一个0 到 16777216之间的值 

但是还不够,Math.random返回的是一个浮点数字,我们只需要整数部,这里使用了“~”操作符(按位取反操作)。 

这行代码并不关心正负值。因此通过两次取返就可以得到纯整数部,我们还可以将~~视为parseInt的简写: 

Js代码 
  1. var a = 12.34, // ~~a = 12  
  2.     b = -1231.8754, // ~~b = -1231  
  3.     c = 3213.000001 // ~~c = 3213  
  4. ;  
  5.    
  6. ~~a == parseInt(a, 10); // true  
  7. ~~b == parseInt(b, 10); // true  
  8. ~~c == parseInt(c, 10); // true  


如果你仔细看评论你会知道使用 按位或 "|"操作符也可以得到相同的结果。 

Js代码 
  1. ~~a == 0|a == parseInt(a, 10)  
  2. ~~b == 0|b == parseInt(b, 10)  
  3. ~~c == 0|c == parseInt(c, 10)  


我们最终得到了一个 0 到 16777216之间的随机数,然后使用toString(16)转换成16进制,它就是这样工作的。

分享到:
评论

相关推荐

    疯狂html5+css3+javascript完整版第二部分

    疯狂html5+css3+javascript完整版是第一部分 亲们漏掉了这部分不好意思 下载这2个解压出来就行了 本书中的程序在以下环境中调试通过: 1 本书很多HTML 5 CSS 3代码必须在高版本的浏览器中才能看到效果 建议读者...

    JavaScript王者归来part.1 总数2

     13.6.5 小技巧--将代码添加到样式表   13.7 总结   第14章 级联样式表  14.1 什么是级联样式表   14.1.1 CSS样式和样式表   14.1.2 CSS的标准化   14.1.3 浏览器支持的CSS   14.2 JavaScript与CSS  ...

    编写高质量代码-Web前端开发修炼之道.azw3

    2.2 欲精一行,必先通十行 2.3 增加代码可读性——注释 2.4 提高重用性——公共组件和私有组件的维护 2.5 冗余和精简的矛盾——选择集中还是选择分散 2.6 磨刀不误砍柴工——前期的构思很重要 2.7 制订规范 ...

    JavaScript经典实例

     第14章使用JavaScript、CSS和ARIA创建交互和可访问性效果  第15章创建富媒体和交互应用程序  第16章JavaScript对象  第17章JavaScript库  第18章通信  第19章使用结构化数据  第20章持久化  第21章...

    asp图书出售图书发行系统(源代码+论文)_new.rar

    - 源代码:提供Java与ASP整合的Web系统的完备代码,从前端界面代码(HTML、CSS、JavaScript)到后端的Java与ASP代码,再到数据库相关脚本。学生可以参考、修改或基于此代码进一步拓展。 - 辅助信息:包括其他与项目...

    ASP.NET某店POS积分管理系统-销售情况,会员卡再发行数据生成(源代码+论文)_new.rar

    - 源代码:提供Java与ASP整合的Web系统的完备代码,从前端界面代码(HTML、CSS、JavaScript)到后端的Java与ASP代码,再到数据库相关脚本。学生可以参考、修改或基于此代码进一步拓展。 - 辅助信息:包括其他与项目...

    基于MVC的JavaScript Web富应用开发

    《JavaScript Web 富应用开发》Developing JavaScript... 讲解主流的库和框架,包括jQuery、JavaScriptMVC以及Backbone, 编写测试用例,并使用控制台工具来调试你的应用, 部署应用的最佳实践,比如缓存机制和代码压缩等

    JavaScript实战

    第一部分 JavaScript入门 1 第1章 编写第一个JavaScript程序 1 1.1 编程简介 1 什么是计算机程序 2 1.2 如何把JavaScript添加到页面 3 外部JavaScript文件 5 1.3 第一个JavaScript程序 7 1.4 把文本写到Web页面上 9 ...

    极品JavaScript编辑器破解插件

    所以很大程度上对于代码编写/调试就有些摸不着头绪...现在推荐一个东西给大家用,是一个ide(集成开发环境),意思就是他可以可视化管理你的wordpress或者其他项目(明白的人,就不需要多说了),这个ide也是目前我...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    11.3.htm 删除表格的第一行和第一列 11.4.htm 实现单元格行顺序的改变 dynamicTable 完整的Ajax调用DOM的实例 第12章(/C12/) 12.1.htm 一个在元素内定义CSS的范例 12.2.htm ...

    HTML5与CSS3基础教程(第8版)高清文字

    9.6 选择元素的第一个字母或者第一行 161 9.7 按状态选择链接元素 163 9.8 按属性选择元素 164 9.9 指定元素组 168 9.10 组合使用选择器 169 第10章 为文本添加样式 171 10.1 本章之前与本章之后...

    JavaScript笔记

    除了日期从1开始到31结束外,其余都从0开始到-1结束 |--Date对象的常用方法 |--1.获取日期数据 getDate()、getDay()、getFullYear()等 |--2.修改日期数据 setDate()、setDay()、setFullYear()等 |--3.获取日期...

    javascript入门笔记

    Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS解释器 JS的发展史: 1、1992年 Nombas 开发...

    精通JS脚本之ExtJS框架.part2.rar

    9.3.2 添加一行数据 9.3.3 保存修改结果 9.3.4 验证EditGrid中的数据 9.3.5 限制输入数据的类型 9.4 PropertyGrid属性表格控件 9.4.1 PropertyGrid简介 9.4.2 只读的PropertyGrid 9.4.3 对name列强制排序并...

    精通JS脚本之ExtJS框架.part1.rar

    9.3.2 添加一行数据 9.3.3 保存修改结果 9.3.4 验证EditGrid中的数据 9.3.5 限制输入数据的类型 9.4 PropertyGrid属性表格控件 9.4.1 PropertyGrid简介 9.4.2 只读的PropertyGrid 9.4.3 对name列强制排序并...

    openBSE:高性能 JavaScript 弹幕引擎。同屏弹幕1000+ A high-performance JavaScript bullet-screen (danmaku) engine

    openBSE | | |高性能 JavaScript 弹幕引擎。同屏弹幕1000+简介一个高性能 JavaScript 弹幕引擎,...压缩版:[removed][removed]调试版:[removed][removed]添加一个 id 为 BulletScreensDiv 的固定大小的 div 标签用于

    Ajax基础教程(扫描版)

    7.2 调试javascript 188 7.2.1 使用firefox javascript console 189 7.2.2 使用microsoft script debugger 190 7.2.3 使用venkman 192 7.3 小结 207 第8章 万事俱备 209 8.1 模式介绍 209 8.1.1 实现褪色技术...

    mout:模块化JavaScript实用工具

    不要将JavaScript转换为另一种语言! 与其他框架兼容; 模块化对所有模块进行单元测试; 在多种环境下工作(IE7 +,现代浏览器,node.js);什么不应该在这里UI组件; CSS选择器引擎; 事件系统-发布/订阅; 模板...

Global site tag (gtag.js) - Google Analytics