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),现在我们想遍历它们,并给他们加上有颜色的边框。我们先看看能从这行代码里发现什么:
- [].forEach.call( $$('*'), function( element ) { /* And the modification code here */ });
NodeList看起来像一个Array(数组),你可以使用中括号来访问他们的节点,而且你还可以通过length属性知道它有多少元素。但是它并没有实现Array的所有接口,因此使用 $$('*').forEach 会返回错误,在JavaScript的世界里,有一堆看起来像Array但其实不是的对象。如function中的arguments对象。因此在他们身上通过call和apply来应用数组的方法是非常有用的。我之前写过一篇文章来解析它们的用法,下面是一个例子:
- function say(name) {
- console.log( this + ' ' + name );
- }
- say.call( 'hola', 'Mike' );
- // 打印输出 'hola Mike'
之前的一行代码使用 [].forEach.call 代替 Array.prototype.forEach.call 减少了代码的编写量 ( 另外一个很有意思的地方 );如果$$('*')返回是个数组的话,它与$$('*').forEach是等价的。
如果你看看评论,还有人使用for(i=0;A=$$('*');)让代码变得更短,但是它在全局对象中注入了变量。
你可以带上var声明,如
- for(var i=0,B=document.querySelectorAll('*');A=B[i++];){ /* your code here */ }
其中i和B将只声明在console的上下文中。
改变元素的颜色
让元素有一个漂亮的边框,这行代码使用了CSS的outline属性。有一点你可能不知道,在CSS渲染的盒子模型(Box Model)中,outline并不会改变元素及其布局的位置。因此这比使用border属性要好得多,所以这一部分其实并不难理解
- a.style.outline="1px solid #" + color
怎样定义颜色值其实是比较有意思的
- ~~(Math.random()*(1<<24))).toString(16)
我不是特别懂位运算,因此我最喜欢这一段。
我们想构造的其实是一个16进制的颜色值,像白色FFFFFF,蓝色0000FF等等。
首先我们学到了可以使用数字类型的toString方法进行十进制到16进制的转换。
其实你可以用它进行任意进制的转换
- (30).toString(); // "30"
- (30).toString(10); // "30"
- (30).toString(16); // "1e" 16进制
- (30).toString(2); // "11110" 二进制
- (30).toString(36); // "u" 36 是最大允许的进制
因此16进制中的ffffff其实是 parseInt("ffffff", 16) == 16777215,16777215是2^24 - 1的值
因此左位移操作乖以一个随机数 Math.random()*(1<<24) 可以得到一个0 到 16777216之间的值
但是还不够,Math.random返回的是一个浮点数字,我们只需要整数部,这里使用了“~”操作符(按位取反操作)。
这行代码并不关心正负值。因此通过两次取返就可以得到纯整数部,我们还可以将~~视为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
如果你仔细看评论你会知道使用 按位或 "|"操作符也可以得到相同的结果。
- ~~a == 0|a == parseInt(a, 10)
- ~~b == 0|b == parseInt(b, 10)
- ~~c == 0|c == parseInt(c, 10)
我们最终得到了一个 0 到 16777216之间的随机数,然后使用toString(16)转换成16进制,它就是这样工作的。
相关推荐
### JavaScript CSS 浏览器调试知识点 #### 一、IE浏览器的调试 ##### 1.1 IE6, IE7浏览器对JS的调试方式 - **准备工作** - **下载install-companionjs-v0.5.3** - 需要下载`install-companionjs-v0.5.3.rar`,...
在描述中提到的“直接替换beautify-css.js文件,重启HB就可以”,这实际上是指HBuilder中内置了一个名为beautify的CSS美化工具,这个工具的实现是通过JavaScript脚本beautify-css.js来完成的。beautify-css.js是一个...
当IE执行到这一行时,将自动打开调试窗口。这种方法需要开发者事先知道哪些代码片段可能存在潜在的问题,因此通常需要结合其他工具(如IEDeveloperToolbar)来定位具体的调试位置。 #### 五、应用示例 假设有一个...
1. **断点**:在可能出错或者需要检查的代码行前设置断点,当执行到这一行时,程序会暂停,让开发者有机会查看当前的变量状态。 2. **步进执行**:通过单步执行(Step Into)、逐过程(Step Over)和跳出(Step Out...
JavaScript调试是开发者日常工作中不可或缺的一部分,它帮助我们找出代码中的错误、性能问题以及逻辑缺陷。在早期,开发者常使用`alert()`函数进行简单的调试,但这种方法往往效率低下且不适用于复杂的场景。随着...
另一方面,CSS压缩也遵循类似的策略,但通常不涉及代码混淆,因为CSS的可读性对维护和调试至关重要。压缩主要涉及删除空格、注释和缩进,以及合并重复的样式规则。这个简单的工具"JS、CSS压缩.exe"可能就是为用户...
Joomla CSS JS代码压缩插件是一款专为Joomla内容管理系统设计的优化工具,适用于Joomla 2.5和Joomla 3X版本。这个插件的主要功能是将网站中的CSS和JavaScript代码进行压缩和合并,以提高网页加载速度,减少HTTP请求...
1. **断点设置**:在Firebug中,可以为JavaScript代码设置断点,以便在特定行暂停执行。只需在源代码面板中点击行号,对应的行就会出现一个红点表示已设断点。当程序运行到该行时,执行会暂停,此时可以检查变量值、...
在脚本面板中,你可以直接点击行号来设置断点,当执行到这一行时,程序会暂停,让你可以检查此时的变量值和调用堆栈。 4. **查看和修改变量**: 当程序暂停在断点处时,可以在“局部变量”和“全局变量”窗口中...
随着技术的发展,现在也有许多高级开发工具,如Visual Studio Code、Sublime Text等,用于编写和调试JavaScript代码,比早期仅使用记事本的方式更为便捷。 总的来说,JavaScript是网页动态效果的核心,理解和掌握其...
在JavaScript中实现这样的功能,描述中提到的“非常的简单不到60行”,可能是指通过一个小型脚本或者库就能完成。这种脚本可能利用正则表达式匹配JavaScript语法的关键字、标识符、字符串、数字等元素,然后使用不同...
JavaScript调试工具是开发过程中不可或缺的一部分,它们帮助开发者追踪代码中的错误,优化性能,以及理解代码的执行流程。本文将深入探讨JavaScript调试工具的使用,并基于提供的文件信息进行讲解。 首先,...
JavaScript分屏代码是一种技术,常用于网页开发中创建多窗口或者多区域的显示效果,比如在监控系统、数据展示或富交互应用中。通过JavaScript,我们可以动态地将一个页面分割成多个部分,每个部分可以独立展示不同的...
1. **断点**:断点允许你在代码的特定行设置标记,当程序执行到这一行时暂停,以便检查此时的变量值和调用堆栈。这对于追踪代码流程非常有用。 2. **单步执行**:在暂停后,你可以逐行执行代码,观察每一步如何改变...
这样的练习旨在让你熟悉整个开发流程,从构思页面结构,到设计美观样式,再到实现动态功能。 总的来说,这个实例教程通过课后习题提供了实践HTML、CSS和JavaScript的宝贵机会。通过解决这些问题,你可以深入理解...
4. 删除行尾的分号,因为CSS允许在最后一行省略分号。 5. 对颜色值进行简化,例如 `#abc` 变为 `#abc1`,`rgb(255, 255, 255)` 变为 `#fff`。 三、优化与注意事项 尽管代码压缩可以提高性能,但也有一些需要注意的...
首先,`debugger`语句是一个内置的JavaScript关键字,当执行到含有此语句的代码行时,如果浏览器的调试工具已经打开,那么代码执行将暂停,允许开发者检查当前的变量值、调用堆栈、执行路径等。这对于在代码中设置...
【JavaScript/CSS压缩工具】是一种高效实用的软件,主要用于优化前端资源,特别是JavaScript和CSS文件。这款工具的主要目的是减小文件大小,提高网页加载速度,从而提升用户体验。它通过删除空格、换行符和不必要的...
在使用中,开发者可以实时查看和修改网页元素、分析网络请求、调试JavaScript代码,并且其强大的脚本控制台支持代码自动补全,使得编写和调试JavaScript代码变得更加便捷。 Firebug的自动补全功能包括了内置的...
JavaScript调试工具是Web开发中不可或缺的一部分,它们帮助开发者找出代码中的错误、性能瓶颈以及优化代码。在本文中,我们将深入探讨JavaScript调试工具的各种特性和使用方法,以提升您的编程效率和代码质量。 ###...