我愧对js工程师这个职位,竟然不知道firefox已经支持javascript 1.7了~
可能是受python的影响,偶然在firebug里输入类似下面代码
"abcdef"[1]
然后结果输出了”b”,当时没有在意,但是后来一想js好像没有这个特性,偶就觉得firefox的js引擎有点小牛了..
但是今天看的这个javascript 1.7新鲜事里好像没有提到这个特性,有点不解~
我愧对js工程师这个职位,竟然不知道firefox已经支持javascript 1.7了~
可能是受python的影响,偶然在firebug里输入类似下面代码
"abcdef"[1]
然后结果输出了”b”,当时没有在意,但是后来一想js好像没有这个特性,偶就觉得firefox的js引擎有点小牛了..
但是今天看的这个javascript 1.7新鲜事里好像没有提到这个特性,有点不解~
第n次火星了,可是依然没去过火星.
这个是最近用到才知道,需求是替换onclick属性中的关键字,但是俺单纯的以为geAttribute都会返回一个字符串给我,没想到ie又一次显示了它独到的见解~
<html> <p id="test" onclick="alert('click');">click me~</p> <script> document.write('<pre' + '>'); var el = document.getElementById('test'); var at = el.getAttribute('onclick'); document.writeln(at); document.writeln(typeof at); document.write('</' + 'pre>'); </script> </html>
ff下输出
alert('click');
string
ie6和ie7下输出:
function anonymous()
{
alert('click');
}
function
ie8下输出:
function onclick()
{
alert('click');
}
function
其他事件属性肯定也会有同样表现,ie8十分搞笑,换了一个函数名…
最后对于ie我只有这样了:
<html> <p id="test" onclick="alert('click');">click me~</p> <script> var el = document.getElementById('test'); var at = el.getAttribute('onclick'); //函数换成字符串 at = at.toString().replace(/^function (anonymous|onclick)\(\)\n\{\n(.*)\n\}$/m, '$2'); //替换关键词 at = at.replace('click', 'wahaha'); //再变成函数放回去 el.setAttribute('onclick', new Function(at)); </script> </html>
最近需要把整站js中的域名替成变量,awk查资料写了大半天也没整出个啥,话说我的正则还是太初级,话说我买的正则书也不知跑到哪去了,话说好书还是要放到家里
…
于是还是用python,没有用正则,但是好像跑起来真的比awk快~
脚本下载:replace_keyword.zip
效果:
//替换之前 var s = '<a href="http://blog.abc.com/show">'; //替换之后 var s = '<a href="http://blog.' + siteDomain + '/show">';
使用方法:
首要要修改脚本里要替换的关键词
config['keyword'] = 'abc.com' config['vname'] = 'siteDomain'
然后
python replace_keyword.py ./myscript.js > /tmp/ooxx mv /tmp/ooxx ./myscript.js
批量替换的话就需要写个简单的shell:replace_keyword.sh
#!/bin/sh python replace_keyword.py $1 > /tmp/ooxx mv /tmp/ooxx $1
批量替换整个目录
find ./ -name "*.js" | xargs -i sh replace_keyword.sh {}
最后任务远没有结束,这个脚本还不够强大,它只会替换字符串中的关键字,作为对象属性名称的字符串不会替换,正则中的关键字无法替换,像下面:
var config = { 'blog.abc.com' : 1, 'game.abc.com' : 2 } //需要手工替换为 var config = {}; config['blog' + siteDomain] = 1; config['game' + siteDomain] = 2; if ( /abc\.com/.test(str) ){} //需要手工替换为 if ( new RegExp( siteDomain.replace('.','\.') ).test(str) ){}
所以运行完脚本之后还需要检查未替换的地方,手工完成
find ./ -name "*.js" | xargs grep 'abc\\\?\.com'
更新:
sonic同学发现了bug的起因:
只要a标签的innerHTML是以http[s]://开头或者包含”@xx”类似email的字符串就会出现这种情况。。
———————————————-
今天qa发现的巨灵异的bug
———————————————-
由于网站域名切换,有些老的数据无法短时间切换,所以打算用js替换。具体实现:当鼠标移到link上时判断是否是老域名,如果是则替换~
代码类似下面
http://bluehua.org/demo/href+@.html
这段代码在除了ie6的浏览器都是正常的,鼠标移上时两个link的href都变成http://oo.test,但是ie6下第一个link出问题了:鼠标上去,链接文字没了。
“@¥”这两个字正好是qa组leader的id后缀,真牛x~
恩,有个产品要速度改版,改用ajax实现分页,可是页面中有很多内联脚本,求技术改比较慢,于是采用了最速都的方法:返回内容之后,把html塞到对应的层里,然后手动eval一下脚本。
这里有点小困难的就是脚本里面有document.write…。不过李宁叔叔说过…
demo:
支持返回代码中的内联或者外联的脚本
http://bluehua.org/demo/eval_inner_html/
原理是这样滴:
执行这些代码之前先把document.write改成自己的函数,用来收集输出的字符串
var _write = document.write; document.write = function( str ) { _inner_js.push( str ); }
执行返回html中的脚本之后将document.write输出的代码添加到script标签的位置
var tmp = document.createDocumentFragment(); appendHTML( tmp, _inner_js.join( '' ) ); s.parentNode.insertBefore( tmp, s );