Archive for the ‘JAcld’ Category

十一月 3rd, 2010

更新了JAcld

No Comments, JAcld, 前端开发, by army.

两点修改:

国产加壳浏览器延迟初始化,防止报异常。这点要感谢阿里的工程师们:http://www.aliued.cn/?p=3169
记录了scrollTop的值,防止要验证的input输入框在聚焦、验证切换焦点过程中发生的滚动条位移。

暂且放在土豆的passport测试系统上交给测试工程师测试,hoho,我在占测试mm的小便宜么~~
function(js, swf, target, tip) {
var isIE = (navigator.appName.indexOf(“Microsoft”) != -1);
var isWebkit = (navigator.userAgent.indexOf(“AppleWebKit”) != -1);
var cssCompat = document.compatMode == “CSS1Compat”;
var…

http://logintest.tudou.com/login.do?noreg=ok
土豆的passport系统使用了jacld来提供密码输入框大写锁定提示功能——一款基于flash的东东。由于存放flash的域名和页面域名不一致,所以导致了跨域问题。
不过很简单,flash也是支持跨域的。jacld代码中也加入了Security.allowDomain(“*”)并且嵌入时allowScriptAccess被设置为了always。在所有主流浏览器下都没问题。
可惜的是,360和tt虽然是基于ie的,但是跨域方面却没有做好。倘若使用debugger版本会报SecurityError: Error #2060: 安全沙箱冲突的异常,普通版本自然会因此失效。
为了防止报错,只能捕获这一异常并防止它干扰用户了。很是可惜。

三月 7th, 2010

JAcld beta1

No Comments, JAcld, 前端开发, by army.

http://code.google.com/p/jacld/
预览地址:http://jacld.googlecode.com/svn/trunk/bin/index.html
JAcld(Javascript & Actionscript CapsLock Detection)是一款基于as和js的大写锁定检测工具,大小只有1k多,作用于web上。
今天终于搞定了针对webkit的特殊修正,所以目前主要浏览器都能使用了。不过还有2点遗憾:

webkit由于flash的聚焦bug,无法通过flash检测,因此使用了js检测。它跟flash相比起来体验方面要稍微差一点。
ie下亦存在聚焦问题,当使用tab键切换focus到输入框上时,有一定几率聚焦失败。

综合而言beta1倒是可以尝试使用的。谁能研究出搞定那2个bug的方法就谢天谢地了……

接上篇,继续做的测试,有了点新发现。解说测试之前,先说明下用flash检测大写锁定键是否开启的原理。
前提要求是:普通的input文本输入框(无论是text还是password),用户输入还是以html的input组件为基础,并非在其上加入透明的flash输入框或者其它技术平台的组件;无干扰性,用户输入没有任何其它干扰的感觉。
以此,唯一的解决办法就是js结合swf来控制。input的各种事件侦听(获得焦点、失去焦点、按键触发)都只能由js来完成,而对当前键盘状态的检测则交给flash来处理。它们之间有个很大的障碍——flash对当前键盘状态的识别必须首先获得焦点,而我们在input中输入内容的时候焦点却在input上,这成为最大的矛盾。
利用js控制页面焦点可以解决这一问题,除了webkit内核的浏览器。我们可以写出如下的伪代码:
oInput.onfocus = function() {
oSwf.focus(); //flash获得焦点
oSwf.detect(); //flash进行检测,并根据检测结果调用某个js函数
setTimeout(function() {
oInput.focus(); //input重新获得焦点,无干扰用户输入
}, 0);
}
你可能困扰为何要用setTimeout来使input重新获得焦点,这是为了让用户输入时感觉不到焦点在input和flash之间走了一圈,就好象什么事都没有发生一样。至于为什么一定要用setTimeout,那是为了模拟线程同步,确保重新获得焦点这一操作发生在最后。
就几行代码看上去很简单,实际上有几个隐蔽的信息藏在其中。在flash获得焦点并进行检测之后,input重新获得焦点,试问:这样会不会再次触发onfocus?答案是肯定的,如果不做任何处理的话,这将是个死循环;另外,input还应该侦听onblur,没道理用户在离开输入框之后还在进行提示(除非你能忍受),那么onblur这个侦听函数也会进行不断重复;更恐怖的在下面,我为每一步标上了序号,以表示它们的执行步骤:
function result() {
//1
//调用的结果函数,用以让提示区域显示或隐藏
}
oInput.onfocus = function() {
//2
oSwf.focus(); //flash获得焦点
oSwf.detect(); //flash进行检测,并根据检测结果调用结果函数
//3
setTimeout(function() {
//4
oInput.focus(); //input重新获得焦点,无干扰用户输入
}, 0);
//5
}
oInput.onblur =…

http://army8735.org/2009/09/15/82.html
曾经考虑过用swf来检测密码输入框大写锁定键是否被打开,并且也进行了一个小实验,基本是成功的。时隔多日,最近想要把它完善一下,突然发现在chrome中根本不起作用!
一步步排查下来,终于发现在webkit内核的浏览器下,以往的使得swf获取焦点的方法根本不起作用。随之google一番,发现老外早已发现这个bug,并且目前webkit仍未解决:
http://stackoverflow.com/questions/594821/object-focus-problem-with-safari-and-chrome-browsers
这样就影响到了部分功能:比如想使用flash的检测按键功能,但它必须要求flash是在获得焦点的情况下才行。使用js可以在ie和gecko内核下轻松办到,webkit只能继续等待了。