‘WEB开发指引’ 所有文章

遇到一个Firefox,Chrome盒模型解析”自相矛盾”的问题

一月 20th, 2010 由 Rock 发表

今晚郁闷极了,

遇到一个头疼的问题,

在DOM LOAD后,通过
div.style.width = 1px;
div.style.paddingLeft = 1px;
测得 div.offsetWidth = 2px;

也就是盒宽 = style.width + Padding + BorderWidth

按理应该是 Border Box = false.

但在运行过程中,对于某个元素,解析却是

style.width = borderWidth+padding+内容宽

解析完全相反了,该元素是textarea元素,难道在运行也对box model解析也会不同??

firefox, chrome均如此,,

哪位清楚这问题的麻烦说说.

学习前端开发的一些建议

一月 9th, 2010 由 Rock 发表

前端开发越来越流行,即使做嵌入式开发的也可能与B/S沾个边了.

群上有朋友问到,学习JavaScript有路数吗?

我心里立刻浮现出”条条大路通罗马”这句经典,但再仔细想想,这句泛泛而谈,没说服力,就着自己这两年学习JavaScript的经验,花了分许时间,打出了几行字:

1. 看一本权威的书, 推荐《JavaScript权威指南》(非广告-_-!!)

2. 给自己选一个实践的目标,如利用JS做一个UI,或实现某一效果,或做一个小游戏

3. 遇到问题先查查资料书,再g.cn,不行再google.com,最后才是问人

4. 多看看同行的BLOG,里面有不少经验分享

5. 学会调试,推荐Firefox的firebug插件

5. 平时勤于独立思考,试试用不同方式模式实现同一效果

完毕,但总觉得缺点什么,直到在森林群上丸子发来的一个链接,描述“Nicholas C. Zakas如何面试前端工程师”的,才大悟,原来上面我只给出了“如何去做”,但还没说明“要做什么”,看了为之漫笔的这篇译文,从Nicholas C. Zakas的话中引一段过来,丰富了实体,完美了!

如果下面某条还没弄明白,那把好关,把每条都弄个透切先

* DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。

* DOM操作——怎样添加、移除、移动、复制、创建和查找节点。

* 事件——怎样使用事件以及IE和DOM事件模型之间存在哪些主要差别。

* XMLHttpRequest——这是什么、怎样完整地执行一次GET请求、怎样检测错误。

* 严格模式与混杂模式——如何触发这两种模式,区分它们有何意义。

* 盒模型——外边距、内边距和边框之间的关系,IE < 8中的盒模型有什么不同。

* 块级元素与行内元素——怎么用CSS控制它们、它们怎样影响周围的元素以及你觉得应该如何定义它们的样式。

* 浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。

* HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。

* JSON——它是什么、为什么应该使用它、到底该怎么使用它,说出实现细节来。

附:

Nicholas C. Zakas文章为之漫笔的译文:http://www.cn-cuckoo.com/2010/01/08/how-nicholas-c-zakas-interviewing-the-front-end-engineer-1332.html

JavaScript,CSS压缩工具YUI Compressor 界面GUI版

七月 5th, 2009 由 Rock 发表

压缩JavaScript,CSS文件是比较有意义的,浏览器解析这些文件时不需要多余的空格,压缩后可以加快文件下载速度,再加上混淆处理后降低源码可读性,保护源码版权。

目前不少JavaScript压缩工具,有些直接基于HTML的,但大部份的压缩工具都不够理想,一来要求源码JS语法要符合一定的格式,如每句后须有分号,每个块需用{}补全,二来压缩后常常出现奇怪的错误,例如不能很好的处理复杂的正规表达式引发的错误,主要原因就是正则表达式匹配的局限性。

YUI Compressor是一个优秀的JavaScript,CSS压缩工具,它不限制你书写JS的格式,也避免了由于正则表达式匹配时的局限性,因为它是用Mozilla的JavaScript解析器去解析JavaScript代码的,Firefox的JavaScript引擎也是用这个去解析JS源码词法语法,用上了这个,功能就强大了很多,例如可以

  • 测出代码的语法错误,这是其它压缩工具难以做到的;

  • 测出代码的潜在错误,例如警告未使用的局部变量。

但YUI Compressor工具包提供的功能也有限的:

  • 控制台操作,即常说的DOS下操作,这对于被windows宠惯的用户来说比较麻烦;

  • 一次只能压缩一个文件;
  • 无中文版;
  • 调试信息在控制台输出,查找不方便;

为此,最近写了一个GUI版的,常见的功能也齐全了:

  • 可添加多个目录文件,批量压缩JavaScript,CSS文件;
  • 可设置发布目录,将压缩后的文件集中保存到该处;
  • 可将调试信息保存到文件中;
  • 可保置当前压缩文件列表,方便下次重新打开;
  • 在读入文件列表时可设置文件过滤;
  • 可将多个文件压缩后打包到一个文件中;

该GUI是基于Java的,
确保JDK >= 1.6,其它版本未经测试
确保在系统环境变量path中已设置JDK的bin目录
双击run.bat运行
运行后可先打开配置设置.

下载YUI Compressor 界面GUI版

JavaScript代码在线格式化

六月 9th, 2009 由 Bgser 发表



JavaScript在线格式化工具不少,但实用的不多,现在提供一个不错的JavaScript代码格式化工具,出自jsbeautifier.org,已把它集成到网站上,并用BackLight库重写了界面,
可点击这里查看效果,格式化想要的代码.

不可或缺的WEB开发工具Firebug - JS实时调试,HTML,CSS所见所得

六月 1st, 2009 由 Bgser 发表

如果你在WEB开发过程中还没听说过firebug,那么恭喜您,你今天真是走运,将得到一个宝贝了.  好,直入主题.

什么是firebug?
Firebug是网页浏览器Mozilla Firefox的一个扩展,是一个完美的WEB调试工具,它就像一只页面显微镜,用户可以利用它除错、编辑、甚至删改任何网站的 CSS、HTML、DOM、与 JavaScript 代码。Firebug是哈维(Joe Hewitt)与 Rob Campbell撰写的。Joe Hewit是原始 Firefox 创作者之一。

获得firebug
先得有一个Firefox,简称FF(什么,你没有firefox??下载最新版),
打开FF,菜单->工具->附加组件->获取附加组件,输入firebug,回车,同意自动安装,重启Firefox,OK.
如果觉得上面还是麻烦的话,可以直接在这里下载.

firebug - 小家碧玉 - 界面由上到下,由左而右功能学习步步为营:

查看(Inspect)

打开FF,打开令你有偷窥欲的网站后,按F12或点击FF右下角的昆虫firebug标志.
查看(Inspect):
看到网页上哪个效果,哪幅图片是喜欢的,很好,先点击查看(Inspect)按钮,再把鼠标移到网页上,此时页面上各个HTML元素的大小就出来了,这对于观察页面产生的HTML元素是否符合理想是非常好的,当确定要观察的元素后,再点击鼠标,很好,顺利的进入了第二步!

查看DOM元素属性

利用firebug动态查看元素属性是一件很颇有收获的事,因为结点所有属性和值一览无余,慢慢解剖,很多平时看书都不理解的意思,学不到的知识都可在这里找到,相信一番观察后,对浏览器底层处理HTML元素机制更加了解了.

假如在运行了一段JS中,查看某个DOM结点元素的属性值动态的变化,如width, height, offsetHeight, offsetWidth, scrollTop, scrollLeft这些,在事情不明朗的情况下,对于问题的查找与解决起到重要的促进作用.

添加,编辑DOM元素属性

有时在开发时忘记添加元素的某个属生,如class, width, src等,可不用重新编译或刷新网页,直接在firebug上改,直接满意为止,如上图,选中属性后点击右键,选择添加或编辑属性,直接在文本框编辑,可按TAB键切换到下一个编辑位置,firebug会自动更新页面视图,十分方便.如果想改变该结点的HTML内容,添加或减少里面的一些结点,可右击选择编辑HTML,在编辑时firebug也是即时更新页面的,随时可看到效果,改好就点击上面的编辑(Edit)按钮返回.

复制单个元素HTML,innerHTML

对着DOM结点选择复制HTML,innerHTML,这个功能挺有用,可以复制查看元素的HTML下来慢慢研究,并作为HTML模板加以利用.

查看,编辑,禁用CSS属性

点击HTML标签,在右边出现应用到该元素的所有CSS样式,并显示CSS样式的层次和优先级关系,被覆盖的样式会直线划掉,由上到下,看到元素哪个不顺眼的CSS属性就可禁用它,或在上面直接修改,或删除,并即时就能看到效果.充分利用这功能,可以调试,优化页面CSS,直至最佳方案.

查看元素布局

选择右边出现布局标签,可清楚看到元素基于W3C盒模型的边框图,鼠标放到上面,在页面上元素周围就有标尺显示,精确定位.
值得注意的是,IE与W3C对盒模型的解释不一致,具体可查看www.shuihan.com.

JavaScript调试


能在其它IDE上找到的代码调试方法,firebug几乎都有,功能强大而齐全.
查看页面上所有的JavaScrip源代码,包括动态eval执行的
一些网站出于某种原因,不希望给别人看到源代码,使用了屏蔽方法,但这在firebug下并没有用,firebug能把JS代码一点不漏的挖出来,
选择左边的脚本标签,上面就出现了页面的所有JavaScript源文件,选择文件既可查看.
断点调试JavaScript
如果没玩过代码调试的,那就得试试,在firebug下调试代码非常简单,打开JS源代码,在要断点的行号旁点击一下鼠标,再刷新一下页面即可,如果代码有运行到该行的,就会在此行暂停执行,并可查看各个变量值(并可即时更改),方法调用栈信息等等.
JavaScript控制台

如果你还是用alert来调试JavaScript的话,那么就有必要考虑换换方法了,firebug自带了控制台,支持日志,消息,对象的格式化输出.
console.log(object[, object, ...])
在控制台输出一条消息.如果有多个参数,输出时会用空格隔开这些参数.
例如:console.log(”The”, animal, “jumped over”, count, “tall buildings”);
console.log(”I am %s and I have:”, myName, thing1, thing2, thing3);
如果参数是一个Javascript对象,那么在控制台输出的就不是静态文字,而是一个可交互的超链接,点击超链接可以查看该对象的HTML, CSS.
console.debug(object[, object, ...]);
在控制台输出一条消息,和log一样.
console.warn(object[, object, ...]);
在控制台输出一条带有“警告”图标的消息和一个指向代码调用位置的超链接.
console.error(object[, object, ...]);
在控制台输出一条带有“错误”图标的消息和一个指向代码调用位置的超链接.
console.assert(expression[, object, ...]);
测试表达式expression是否为真.如果不是真,会在控制台写一条消息并抛出异常.
onsole.dir(object);
以列表形式输出一个对象的所有属性,有点和你查看DOM窗口相类似.
console.dirxml(node)
输出一个HTML或者XML元素的XML源代码.和你在HTML窗口看到的相似.
console.trace();
输出当前函数调用栈信息.
console.group(object[, object, ...]);
输出一条消息,并打开一个嵌套块,块中的内容都会缩进.调用console.groupEnd()关闭块,该命令可以嵌套使用.
console.groupEnd();
关闭最近一个由console.group打开的块.
console.time(name);
创建一个名字为name的计时器,调用console.timeEnd(name)停止计时器并输出所耗时间(毫秒).
console.timeEnd(name);
停止同名的计时器并输出所耗时间(毫秒).
console.profile([title]);
打开Javascript性能测试开关.可选参数title会在打印性能测试报告时在报告的开头输出.
console.profileEnd();
关闭Javascript性能测试开关并输出报告.
console.count([title]);
输出当前行调用次数.

在非Firefox浏览器下调用控制台
当在非firfox浏览器下,例如IE,没有console这对象时,显然就会出错了,如果删除调试代码又麻烦,这里有个方法,可以保留调试代码并在没有控制台的浏览器上顺利执行,如果不存在否忽略.

if(!window.console){
  window.console = {};
}
//空调用
function fGo(){}
extendIf(window.console, 
      {debug : fGo,
        info : fGo,
        trace : fGo,
        log    : fGo,
        warn  : fGo,
        error  :fGo,
        assert:fGo,
        dir:fGo,
        count:fGo,
        group:fGo,
        groupEnd:fGo,
        time:fGo,
        timeEnd:fGo
       }
);

用了firebug后,是不是觉得JavaScript开发WEB应用并不是想像中的那么麻烦?^-^