By satan ( 十月 29, 2011 at 11:44 上午) · Filed under js, js
看代码说话吧
<script type="text/javascript">
window.abc = 'i am abc';
</script>
<script>
var abc = abc || 'abc from another world';
console.log(abc);
</script>
看这个简单的代码, 看 abc 的结果, 大家都会说打印出来就是 ‘i am abc’, 没错,在chrome,firefox下是这样的,
正如标题所说的一样, 在ie 下就不是这个了,就是 来自另外一个世界的abc了。
开始的时候还以为是变量申明提升(hoisting)的原因,js中是这样的:
用var 申明变量, js 引擎会把变量申明放到当前作用域最开始的地方。
如 var abc = ‘abc’; 就会变成
var abc;
abc = ‘abc’;
把代码改成:
<script type="text/javascript">
var abc = 'i am abc'; // 同一级的变量申明不会互相覆盖
</script>
<script>
var abc; // 同一级的变量申明不会互相覆盖
abc = abc || 'abc from another world';
console.log(abc);
</script>
ie 下变成了输出 i am abc
我看了一下不同申明变量的时候,ie 的变量情况:
<script type=”text/javascript”>
window.abc = ‘i am abc’;
</script>

<script type=”text/javascript”>
var abc = ‘i am abc’; // 或者 abc= ‘i am abc’;
</script>

哦, 原来是window对象和 js全局对象的区别
window对象是js全局对象的一个对象。js 全局对象包括window,Array等对象。
在window 下或者js 全局对象下的申明一个属性, 两个对象下都可以获得 如 window.abc = ‘ddd’; 可以用window.abc 或者 abc 访问到这个变量。
在全局对象下申明一个属性, 在全局对象下申明一个属性, 在window 下就有了,就是这里讨论的情况了。
用申明赋值 var abc = ‘i am abc’; 全局和window都有abc了。
在这个问题中, 用window.abc 申明变量, 在第二个script中 var abc; 是window.abc 和 abc 都变成 undefined 了。
在执行abc = abc || ‘abc from another world’, 就出来了我们不希望看到的结果了。
在chrome 下看赋值语句window.abc = ‘i am abc’ , global 和 window 下都有 abc 和值了, 再次var abc 的时候,这个语句就被忽略了。
这里在一个html 中容易看出问题, 实际开发经常是这样的情况, html 中包含两个js , js 中分别的申明方式不一样:
<script src=”s1.js”></script>
<script src=”s2.js”></script>
//s1.js
(function() {
window.jquery = 'jquery1';
})();
//s2.js
var jquery = jquery || 'jquery2';
在s2.js 就报错了。
Permalink
By satan ( 九月 8, 2011 at 1:30 上午) · Filed under js
不用xhr, 就要动态创建iframe 和 form 表单, 不做特殊处理form.submit() 在 ie6 会遇到 “htmlfile 无法打开”
1. iframe 的domain 要跟当前页面的domain 相同, 可以用脚本给iframe 添加domain
iframe.src = ‘javascript:document.open();document.domain=\”+config.domain+’\';document.close();’;
2. 某些ie6版本的submit 还是有问题 setTimeout(function(){ form.submit();} , 0 ); 可以解决
3. iframe create Element 的时候不太name 创建是设置不了name 的, 记得ie 用 document.createElement(‘‘);
4. 设置 ie 的enctype form.encoding = ‘multipart/form-data’;
5. 用新创建的file node 替代原来file input 的位置, 将原来的file 用于提交表单
var file_new = file.cloneNode(true);
file.parentNode.insertBefore(file_new, file);
file.id = ”; // 清除这个id, 避免用id取不到file_new
file.style.display = ‘none’;
form.appendChild(file);
简单交代一下, 都是跟damon 同学学来的, 坐等damon 的详细分享。
Permalink
By satan ( 九月 7, 2011 at 6:16 上午) · Filed under php, vim
做为一个ide , 代码的检查功能是必不可少的,可以在编辑的时候可以自动提醒代码是否有语法错误,给出一些语言运行相关的建议。
satan 用vim 写代码有段时间了, 要到把代码发布到服务器上运行了才发现语法错误,好是麻烦, 借用Joe Stelmach同学写的js lint 的vim扩展文件和 zend 的语法检查用具,弄了个vim 的php语法检查工具, 方便开发。
下载 : phplint
安装: 把zca.exe 放到window 下的可执行目录, 把phplint.vim 放vim 扩展目录就可以拉。
使用: 保存的时候会自动进行检查,有语法错误的时候自动弹出小窗口,点窗口的提示会跳转到相应的有问题的代码处。
Permalink
By satan ( 八月 21, 2011 at 11:05 上午) · Filed under 未分类
我等凡夫俗子总有很多的欲望,在满足它们的时候我们长大历经然后慢慢的变老。
小的时候追求与人不同,酷是一种风格,很多人在这个时候学会了吸烟喝酒。看到酷煊的东西就会被吸引,游戏机就是最好的例子,当游戏机进入到我们小城的时候,多少孩子天天泡在那里,学也不去上了,钱可以从父母那里骗来,可以卖书卖废铁,可以偷摸,当然了抢弱者的也不少。
稍微长大点就逃离不了淫欲了。作为典型的亚洲国家,明显的一个特征是缺少孩子的性教育。在成长过程中,身体的变化,周围孩子慢慢的变化,社会环境的影响,想要对异性的了解的欲望就越来越强烈,就会萌发出各种的念头和想法。各种“青春‘’书籍是个不错的选择,班上有人带来,很快就会传阅开来了。我中小学的时候正流行录像机,cd,dvd机,有“带子”的时候,小伙子聚在一起津津有味的在那里点评着。
在脱离父母的视线范围的孩子们,尽情的享受着自由的好处。首先的是性的自由,看A片在中国的大学校园是如此的常见,以至于谁说没有看过,都像见着火星人似的。苍老师武滕兰各位老师的爱情小电影很容易的可以得到,见过一个移动硬盘都是的,见过刻了大摞的dvd的。究竟各为了什么,应该每个看的人心中都有自己的答案。一个显而易见的答案可以从中关村大妈的街边叫喊中可以看到:不带马的哦。
各种的爱情剧,都市剧是很好的时间杀手。小的时候特别的迷恋武侠剧,每天放了学回到家就等着看,大人不让看就在窗户背后偷看。大学的时候特喜欢看韩剧,那时候喜欢剧中人物的时尚和率真。很多的电视剧几天就看完了,不带快进的。曾经也追着美剧看。现在基本上不看了,我知道,看了就放不下了,知道了开始,就想知道后来怎么样了,再后来呢,后来的后来呢。
当然花费时间的东西还有很多很多,出席酒席,看电影,下象棋围棋,等等。
我们做事情的时候,很多的念头想法都会掠过我们的大脑,经常是这样的,这个事情应该是像我想的这样这样发展的,大脑越想越兴奋,迫不及待的撇开手头的事情去做那件事情去了,大片的时间可能就这样被花掉了。
干活干累得时候想要休息一下,又想干些别的事情休息一下大脑, 最好做些比较容易放得下的小事, 看看新闻,四处走动走动都可以。
不管时间是被花在哪个上面,看电影电视也好,学习也好,出去旅游也好,醉生梦死也好,只要自己活得有价值就好,人也活得精彩。当你情不自禁的做某件事的时候想想是否有更有意义的事情做,是否当前的事情往下想做更有意思呢,那也不妨把你想到有趣的权且记下来。精虫上脑的同学就得自己找个有益身心健康的法子了。
Permalink
By satan ( 七月 27, 2011 at 4:47 下午) · Filed under js, js
fiddler 是 微软的 Eric Lawrence 开发web开发工具, 下载地址是 fiddler
做为web 开发工具, fiddler 提供了不错的特性: http 抓包, http 时间线, http 请求断点, http 内容修改, 还有实用的编码小工具
1. fiddler 首先是做为web 抓包工具存在

这个是fiddle 的一个界面截图, 可以看到网站中发起了哪些http 请求, http 请求包, http 回包是怎么样的。
fiddler 的抓包有个过滤的,可惜的是真的过滤了,不符合条件的都没有存起来的, 改过滤条件也看不到了。
2. fiddler 受前台开发同学的欢迎, 主要是它提供的方便的调试功能
autoResponder 可以把任何的http 请求变成用户期望的内容,包括http 头和内容。
用http断点可以方便的手工修改http 请求头和返回头
要是手工修改http觉得不够爽, 在工具栏中有Rules -> Customics Rule 可以在自动的修改请求和回包的内容。
如在函数 OnBeforeResponse中加入下面这两句,http请求就不会被浏览器给缓存了。
oSession.oResponse.headers.Remove(“Expires”);
oSession.oResponse["Cache-Control"] = “no-cache”;
还有http 请求构造器可以构造开发需要的http请求,方便后台同学开发调试。
3. 还有一些实用的编码小工具, 方便开发的时候使用。
功能挺多的,说了一下主要的用途,更多的功能就要读者去挖掘了。fiddle 还支持插件开发,懂.net 的同学可以发挥一下了。
Permalink
By satan ( 七月 9, 2011 at 3:50 上午) · Filed under js, js
在ie中用脚本创建的iframe, 给iframe 添加onload 事件, 它不会执行的. 就是说在ie 中这样的代码会让人得到沮丧的结果。
var iframe = document.createElement("iframe");
iframe.src = 'test.html';
document.body.appendChild(iframe);
function onload() {
alert("Local iframe is now loaded.");
}
iframe.onload = function() {
onload();
}
好在ie的iframe 支持onreadystatechange, 在iframe complete 的时候执行以下我们的回调就可以了。
var iframe = document.createElement("iframe");
iframe.src = 'test.html';
document.body.appendChild(iframe);
function onload() {
alert("Local iframe is now loaded.");
}
iframe.onload = function() {
onload();
}
iframe.onreadystatechange = function() {
if(iframe.readyState == 'complete') {
onload();
}
}
ie 总是会有一些比较奇怪的行为,当attachEvent 到iframe的时候, 它是会执行, 于是有了下面这么一段代码。
var iframe = document.createElement("iframe");
iframe.src = 'test.html';
document.body.appendChild(iframe);
function onload() {
alert("Local iframe is now loaded.");
}
if (iframe.attachEvent){
iframe.attachEvent("onload", function(){
onload();
});
} else {
iframe.onload = function(){
onload();
};
}
Permalink
By satan ( 六月 12, 2011 at 4:51 下午) · Filed under js, js
根据对iframe和script的理解,写了个iframe拉取数据的demo
function suc(o) { console.log(o); }
function error () { console.log('on error'); }
function getdata(uri, cbname, succ, error) {
var doc=document;
cbname = cbname || 'callback';
// 判断域名,如果页面写了domain,子页面也要设置domain,才能获得相应的对象
var _dm = (document.domain == location.host)?'':'document.domain="' + document.domain + '";';
var html = '<!DOCTYPE HTML><html><head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title></title></head><body><script>' + _dm + cbname + '=frameElement.bc; frameElement.get(document);<\/script> </body> </html>';
var ifr = doc.createElement('iframe');
doc.body.appendChild(ifr);
ifr['get'] = function(doc) {
var sender = doc.createElement("script");
sender.onreadystatechange = function() {
if (sender && sender.readyState == "loaded") try {
ifr.ecb();
} catch(ignore) {}
};
sender.src = uri;
doc.body.appendChild(sender);
};
ifr['bc'] = function() {
succ.apply(null, arguments);
// 正常逻辑处理完,把异常错误处理函数清理掉,就不会被调用了
ifr.ecb = null;
};
ifr['ecb'] = function() {
error();
};
// 发起请求
ifr.src= 'javascript:void((function(){var doc=document;doc.open(\'text/html\', \'replace\'); doc.write(\''+html+'\');doc.close()})())';
}
var url = '/test.php';
getdata(url, '_bc' , suc, error);
来看这句:
ifr.src= ‘javascript:void((function(){var doc=document;doc.open(\’text/html\’, \’replace\’); doc.write(\”+html+’\');doc.close()})())’;
本来想的做法是直接获取iframe的docuement, 但是当当前页面设置了domain 的时候,这个iframe的document在ie下就获取不到了(别的浏览器可以的), 被禁止访问了。 上面的这个做法的好处是即使设置了domain, 也是可以获取document对象的, 不过记得在子页面也要设置一下domain, 不然父子页面间也是无法访问的。
代码中的:
<script>’ + _dm
可以获得iframe 的document 对象了, 就可以用script 拉取数据了
doc.open(\’text/html\’, \’replace\’); doc.write(\”+html+’\');doc.close();
用这句话在创建的空iframe里注入我们的拉取脚本
如何获取数据的:
iframe 中: frameElement.get(document);
父页面 : ifr['get'] = function(doc)
这两句应该很明白了,在父页面中执行脚本, 但是用子页面的document对象。
然后就是用script去获取数据了
var sender = doc.createElement(“script”);
sender.onreadystatechange = function() {
…
};
sender.src = uri;
doc.body.appendChild(sender);
有一点值得一提是脚本的错误处理了ecb了。
另一篇拉取数据的可参考:
http://www.sdvil.com/js/459
关于script可参考:
http://www.sdvil.com/js/378
Permalink
By satan ( 五月 18, 2011 at 10:46 上午) · Filed under js, js
昨天做需求的时候,遇到一个郁闷的问题,ie8,ie7 iframe 的边框无法去除,试过用脚本和样式添加frameBorder,
border 等属性都无法去除,还是meters 同学说的是不是创建的时候有问题。
试了一下,确实, 问题修复.
iframe append到页面之前设置是有效的, append 之后就没有方法修改了。
<iframe id="b"></iframe>
<!--<iframe id="b" frameBorder="0"></iframe>-->
<script type="text/javascript">
var ifr = document.createElement('iframe');
ifr.setAttribute('frameBorder', 0); // 用我没有border
document.body.appendChild(ifr);
//ifr.setAttribute('frameBorder', 0); //用我有border
ifr.style.cssText = 'border: 0 none;';
</script>
<script type="text/javascript">
var div = document.createElement('div');
document.body.appendChild(div);
div.innerHTML = '<iframe id="a"></iframe>'; //用我有border
//div.innerHTML = '<iframe id="a" frameBorder="0"></iframe>'; // 用我没有border
var ifr = document.getElementById('a');
ifr.setAttribute('frameBorder', 0);
ifr.style.cssText = 'border: 0 none;';
</script>
<script type="text/javascript">
var ifr = document.getElementById('b');
ifr.setAttribute('frameBorder', 0);
ifr.style.cssText = 'border: 0 none;';
</script>
Permalink
By satan ( 五月 17, 2011 at 5:27 上午) · Filed under vim, vim
周末闲来无事, 去试了一下damon说的vimpress,不试不知道,还真是方便,安装完顺手写了篇日志。
先去下载vimpress:
http://www.vim.org/scripts/script.php?script_id=1953
我根据前辈们的代码做了一些修改:
blog.vim
把文件放到vimfiles 下, 在blog.vim 中配置对于的用户名,密码以及xmlrpc地址
好了, 去你的网站上运行xmlrpc吧。可以开始使用vimpress.
有几个命令:
:BlogList
Lists all articles in the blog
:BlogNew
Opens page to write new article
:BlogOpen
Opens the article for edition
:BlogPub
Saves the article to the blog for publish
:BlogDraft
Saves the article to the blog as a draft
:BlogCat
get category list
:BlogUpload file_path
upload the file in the path
试试吧:
:BlogNew
"修改对于的Meta信息
"Title : 写blog之 vimpress
"Cats : vim
"Tags : vim
" 保存为草稿
:BlogDraft
" 发布
:BlogPub
由于公司的网络中要代理才能上网, 我加了代理,不需要的同学可以考虑把代理部分去掉。
关于文件上传,在写这边文章的时候, 我上传了blog.vim, python报错了,后来还是改成了blog.txt 来上传.
看来部分文件后缀是无法上传的。
参考资料:
http://docs.python.org/tutorial/errors.html
http://www.xmlrpc.com/
http://docs.python.org/library/xmlrpclib.html
Permalink
By satan ( 五月 15, 2011 at 3:15 下午) · Filed under js, js
xhr(XMLHttpRequest) 的出现,使js可以很容易的获得服务器的数据,但是由于安全的原因,xhr只能取得本域的数据(先
不谈html5 中的跨域xhr),用script元素又失去了xhr的方便易用,让开发者比较头疼。
浏览器有个安全特性, 两个页面的document.domain 相同的时候,两个页面的js 可以互相操作。
利用这个特性, 可以在a域下的页面, 获取在b域下创建的xhr 对象,就可以用这个xhr来请求数据b域下服务器的数据。
原理说了, 看例子吧:
a.sdvil.com 下的test.html 页面, 如例子要请求b.sdvil.com 下的test.php 的数据
// 设置domain, 使脚本可以跟iframe页面通信
try{document.domain = window.location.hostname.split('.').reverse().slice(0,2).reverse().join('.');}catch(e){}
// 取得可以取b.sdvil.com 数据的xhr 对象
function getXHR(cb) {
var xmlHttp = null;
var ifr = document.createElement('iframe');
ifr.style.display = 'none';
ifr.src = 'http://b.sdvil.com/ajaxproxy.html';
var getTransport = function() {
xmlHttp = ifr.contentWindow.getTransport();
cb(xmlHttp);
//找个地方回收iframe,这里还不行,要等ajax 请求完成后才能干掉, 不然xhr对象就没有容器了
//在chrome下会报错
//ifr.parentNode.removeChild(ifr);
}
// 非ie下 proxy 页面 onload
ifr.onload = function() {
getTransport();
}
ifr.onreadystatechange = function() {
// ie下 proxy 页面 onload
if(ifr.readyState == 'complete') {
getTransport();
}
}
document.body.appendChild(ifr);
}
function xhr(url, callback, ecb) {
var send = function(xmlHttp) {
// 哈哈, 用我就可以取得跨域的数据拉
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
callback(xmlHttp);
} else {
ecb();
}
delete xmlHttp;
}
};
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}
getXHR(send);
}
function cb(xmlHttp){
var data=xmlHttp.responseText;
console.log(data);
xmlHttp=null;
}
function ecb(){
}
xhr("http://b.sdvil.com/test.php", cb,ecb);
b.sdvil.com ajaxproxy.html
// 设置domain, 使脚本可以跟iframe页面通信
try{document.domain = window.location.hostname.split('.').reverse().slice(0,2).reverse().join('.');}catch(e){}
// 我获得b.sdvil.com 下的xhr对象
getTransport = function( ) {
var xmlHttp = null;
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
};
当然这个方法适用在两个域有相同的父域,如果不是的话, 那还是用jsonp 的方式吧
http://api.jquery.com/jQuery.getJSON/
Permalink