我看过的书:
-
近期文章
近期评论
文章归档
友链
链接表
分类目录
功能
分类目录归档:javascript
localStorage in HTML5(2)
上一篇博客简单的介绍了下 localStorage,并且对各个浏览器的存储空间大小做了简单的测试。在上篇博客到这篇博客期间,世界也发生了很多变化,IE9 和 firefox4 正式版都发布了。于是我也对这两个新的浏览器进行了测试,关于 localStorage 的, IE9 和 IE8 表现一致,FF4 和 FF3.6 表现一致,和上篇博客中介绍的一样,FF4 在 Mac 下和 WIN 下表现仍然不一致,参考上篇博客。同时,给出我写的测试存储空间大小的页面,你可以自己来试试:http://lab.allenm.me/html5/storage/maxtest.html 除了最基本的和使用 cookie 一样使用 localStorage,我们还能用它来做什么呢? 如果你看过 localStorage 的文档,你应该注意到了我们在改变 localStorage 中存储的数据的时候,会触发一个 storage 事件: interface StorageEvent : Event { readonly attribute DOMString key; readonly … 继续阅读
localStorage in HTML5(1)
HTML5 中的 localStorage 我相信 web developer 们,都听说过了吧。目前 chrome,firefox,opera,safari, IE8 都支持此属性,注意 IE8 也支持,那就是说,如果你的网站用户不是太低端,起码有一半以上的用户的浏览器是支持 localStorage 特性的。各个浏览器分配给每个“源(region)”的 localStorage 空间至少为 5M(具体数值请看稍后讨论),对于想开始使用 HTML5 的人们来说,这个是个不错的开始。 localStorage 使用方式也非常简单,有 setItem, getItem, removeItem,key, clear 5个方法,和 length 一个属性。定义如下: interface Storage { readonly attribute unsigned long length; DOMString key(in unsigned long … 继续阅读
chrome.tabs.create 的 callback 不执行?
在写 chrome 插件的过程中,不知道你有没有遇到使用 chrome.tabs.create 创建一个新的 tab,但是这个方法的 callback 却不执行,具体说来,在调试的时候是可以执行的,关掉 chrome 的 DEBUG 工具后,就不可以了。 前几天我也遇到了这个麻烦,可能出现这种问题的情况为:在点击浏览器上插件的图标后,打开一个 popup 的页面,在这个页面里点击某按钮后执行 chrome.tabs.create 方法新建一个新的 tab 页,关掉 DEBUG 工具后,此方法的 callback 函数就无法执行。 我们先来观察这种 popup 的页面的行为,随便找一个会 popup 页面的扩展,点击,让页面弹出,然后你切换下浏览器上已经打开的 tab 页,看看发生了什么?是不是这个 popup 出来的页面会关闭掉?然后在那个扩展上右键,选择“审查弹出内容”,再切换下 tab,发现了什么?是不是这个弹出的页面依然打开? 这就是问题所在了,默认情况下,chrome.tabs.create 创建新的 tab 后,会自动切换到那个新建的 tab,在不打开 DEBUG 工具的情况下,原先弹出的页面会关闭,也就是被 … 继续阅读
chrome extension的content script 无法读取页面中的iframe内容的解决方法
chrome插件中的 content script 是运行在一个被称为isolated world 的运行环境里,和页面上的脚本互不干扰,因为不在一个运行环境里,所以也无法调用页面上脚本定义的方法了,当然google也给出了解决方法:http://code.google.com/chrome/extensions/content_scripts.html 除了这些以外,在最近写插件的过程中,发现content scirpt 也不能读取到页面中的 iframe 内的内容(同域),这个被人报告为BUG,也许会在以后的版本中解决。当然,你可以通过设置manifest 中的 all_frames = true,来让脚本在 iframe里也运行。不过更简单的方法是,载入外部脚本到页面。 chrome插件有权限更改页面的DOM(如果这都没权限,这个插件系统也就没什么用处了),所以我们只要往页面中插入script节点,引入自己写的脚本,这个脚本的运行环境就和页面中的脚本是同一个环境了,于是页面中脚本有权限做的事情,我们自己写的脚本也有权限做,当然这样做一定要把自己的脚本放在一个大的闭包中,以防和页面上的脚本冲突。这样插件中的脚本就相当于一个加载器,只用做在页面中加载自己写的脚本就可以了。 这样做还有一个好处是,我们可以轻松移植这样的插件到 firefox 下的 greasemonkey 的 user script 中,也可以轻松制作成 Bookmarklets,也就是可以很方便移植到各种浏览器下。
SyntaxHighlighter 3.0.8 重复加载 brush 的解决方法
我使用 syntaxhighlighter 来做我的博客代码高亮,使用 autoloader 来自动加载需要的 brush。但是使用后,发现,如果页面中存在两个地方使用相同的 brush,这个 brush 文件会被加载两次。如果电脑中有缓存只会加载一次,但是第一次访问的用户,是会加载两次的。这个应该算是BUG吧,等会儿我尝试反馈给作者试试看。 于是我稍微修改了下 autoloader.js 的源码,现在不会加载两次了。源码放在 http://api.allenm.me/syntaxhighlighter/src/shAutoloader.js ,需要的来拿。注意,处了这个文件在 src 下面放着,其他文件有使用 scripts 文件夹下的,要不然会报错。 中秋节的3天假期马上就过去了,我算是一直在玩,一直在放松。第一天去看了山楂树之恋,打了电玩,吃了火锅。第二天约了朋友来我这里做饭吃。第三天就在家宅着,蛮不错的,明天上班应该精神十足,然后再等待十一假期。目前还没有十一假期的安排。
发表在 javascript
一条评论
零碎知识记录–计算字符串宽度–随机打乱数组
一、计算字符串宽度 最近的一个项目中有一个部分,需要计算一个字符串在浏览器中显示所占的宽度,因为可能的字符串不仅仅只是汉字,还有可能是字母,另外还是用来微软雅黑字体,在没有雅黑的机器上,会降级用黑体显示或者其他字体,而且要测宽度的字符串中还有三个字号,所以,用工具先量一个字会占多宽,是不靠谱的,只能通过程序来计算在用户的浏览器上显示的时候占多宽。 其实思路很简单,记得我以前看到过类似的例子,所以很快就知道要怎么来做这个东西了。我们可以把这个字符串放到页面中,让它具有真正显示的区域同样的 style ,也就是相当于复制一份这个字符串包括样式一起,到相同页面的另外一个位置去,但是这个地方,要让用户看不见才行。我们可以用一个绝对定位,z-index设置为一个负数,然后用visibility:hidden 把这个隐藏掉。总之让用户既看见,也点不着,也不影响页面的长度就行了。注意这个隐藏这个元素的方法一定要用 visibility 这个属性来隐藏,而不能用 display:none。因为如果用 display:none 的话,这个元素才尺寸就是0了。用 visibility的话,元素还是具有原来的尺寸,只是不显示出来而已。这个接着用 js 获取这个元素的 offsetWidth 属性就可以了。 二、随机打乱一个数组 今天还需要打乱一个数组中元素的顺序,但是在 js 手册里没找到相关的直接方法,但是想到了一个简单的方法,效果不一定特别好,但是够我用了。看代码: function randomSort(a,b){ return 0.5-Math.random(); } function randomArr(arr){ return arr.sort(randomSort); } var a = ['我','是','前','端','开','发','工','程','师']; var b = randomArr(a); console.dir(b); 大家可以复制代码到 … 继续阅读
发表在 javascript
2 条评论
Android WEB app 跨域 AJAX
前段时间做毕设的时候,使用 PhoneGap打包web app的方式做开发,我使用的 PhoneGap版本比较老,没找到和服务器端通信的直接方法,因为html是在本地,所以使用标准的XHR是跨域的,当然也就不能用了,于是自己写了一可以跨域加载的小东东,使用动态 script 节点的方式,不是常见的jsonp的方式,因为写后台的老师比较土,AJAX都不知道,更不晓得让他每次我传递个函数名字过去,他包装数据了。就像YUI的 getScript函数一样,后台可以返回 var foo=2; 这样的数据,然后成功后,就可以利用 foo 这个全局变量了,写的过程中参考了 YUI和 jQuery 的实现方式,没有兼容其他浏览器,只兼容 Android。 代码如下,很简单,可能还有点小BUG,本来是打算接着完善的,但是现在好像没时间来折腾这个了,所以就先发上来,加上这段时间找 phoneGap找到我博客的人蛮多的,或许对大家有点帮助吧。 /** * By Allen.M http://allenm.cn email: i@allenm.me 2010-05-22 * @method getScript * url : string, the script’s url; * options: object (options) … 继续阅读
发表在 android, javascript
2 条评论
移动互联网终端的touch事件和click事件
昨天晚上学习并分享了手持设备浏览器的 touchstart, touchend, touchmove 事件,突然又想到这个事件和 click 事件在应用的过程中是否会有冲突呢? 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢? 带着这些疑问,我测试了我的 Android 1.5,发现系统已经很好的帮我们处理好了,具体说来,当明显的手指在屏幕上滑动,是不会触发 click 事件的,当明显的点击的时候,同时出发 click 事件和 touch类事件。有了这些我们已经很方便的控制程序来做我们想做的事情了,我们可以通过 touchstart事件和 touchend 事件的 pageX,pageY属性来判断用户到底是想做什么操作了,如果偏移值很大,很明显的就是滑动操作了,如果偏移很短,就不做操作,这个时候很有可能是会触发click事件了。 测试例子在:http://lab.allenm.me/touch_click.html,和上一篇文章一样,你可以使用你的移动手持设备去访问,测试。
touchstart, touchend, touchmove 与移动互联网开发
你为移动互联网准备好了吗? 大家都可以感受到iPhone,Android,iPad带来了移动互联网革命,前端程序员们,大家准备好了吗?移动互联网早已不是那个WAP的时代,WAP基本被淘汰了,新一代的智能移动终端,都具有了标准的HTML,CSS,JS的解析能力,但是又和桌面不同,比如这样的终端是没有光标的,也就是我们平时经常用到的 mouseover这些光标相关的东西,在这些终端上是没有作用的。同时,这些终端又具有一些他们自己的特色,比如 touch 事件,因为操作全是 touch ,所以这个事件如果好好利用,在移动互联网开发中会发挥大用处的。 正好现在手里有个 Android 设备,做毕设用的,现在也想为毕设搞点新鲜内容,所以就做了对 Android 浏览器的 touch 事件的测试。说了这么多,是因为这个东西很简单,不说点废话撑下门面,那这个博文就太短了。 touth相关的事件有 touchstart,touchend,touchmove。这三个事件最重要的属性是 pageX和 pageY,表示X,Y坐标。 其中 touchstart 在开始触摸的时间激发, touchend 在触摸结束的时间激发, touchmove 这个事件比较奇怪,按道理在触摸到过程中不断激发这个事件才对,但是在我的 Android 1.5 中,在 touchstart 激发后激发一次,然后剩余的都和 touchend 差不多同时激发。 这三个事件都都有一个 timeStamp 的属性,查看 timeStamp 属性,可以看到顺序是 touchstart -> touchmove … 继续阅读
elementFromPoint() 函数
今天遇到了个好玩的js函数,看题目已经了解的就可以忽略了,或许是我太土了。这个函数我在 权威指南里都没找到,晚上回来后,查了下文档,mozilla的文档和W3C的。 这个函数是干什么的呢?通过这个函数,我们可以通过找到文档中任意一点所对应的 element ,这个是我在看 firebug 源码的时候发现的,写了简单的代码测试了一下,目前我机器上的浏览器都支持,分别是 firefox3.6+, chrome 5+, opera 10+, IE 8.其他浏览是是否支持未知。 用法就是 var el= document.elementFromPoint(offsetX, offsetY); 就可以获得元素了,你可以把我下面的代码加入到任意网页中,看看效果便知,为了在 非firefox浏览器测试方便,加入了 firebug lite 贴代码: <script type=’text/javascript’ src=’http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js’></script> <script type=”text/javascript”> if(document.addEventListener){ document.addEventListener(“mousemove”,logThis,true); }else{ document.attachEvent(“onmousemove”,logThis); } var time=0; function logThis(e){ if(new Date()-time>500){ var el= … 继续阅读
