今天将前些阵子用在WakiFile上的BlockUI特效移植到了Blog里面,现在登录、登出、修改个人介绍还有后台的管理的Ajax提示全部更改为BockUI的友好界面。
本来打算把留言也Ajax化的,但是考虑了一下,还是有很多困难(曾经实现了,不过有很多局限性,最终又回到了传统的表单提交方式。),于是只好放弃了。后来仔细想了想,表单提交方式…也挺好的
。(
这家伙纯属在犯懒吧)
最近不断地完善WakiFile,总结了一些经验教训,回来写成文章与大家共享。
此外,现在正在努力将WF和WB的开发环境转移到MacOS下面(Textmate确实好用),不过却在Bluehost主机的文件权限方面遇到了一些意外的问题……怎么办呢………
标签: Javascript
通过Javascript检测Firefox浏览器是否启用了Firebug
这几天我调试WakiFile的时候出现了一个很莫名其妙的问题,一旦进行跟BlockUI有关的操作,Firefox就会崩溃。而Safari、IE7、Opera就没有问题。明明FF以前也没什么问题啊,但是从昨天开始突然就开始崩溃了。仔细回想一下,原来是昨天我在FF里面吧Firebug从1.1 b11升级到了1.2 b4,该不会是1.2 b4跟BlockUI有冲突吧。禁用FireBug之后,果然好了。
记得之前访问Gmail的时候,Google就提示我浏览器装了Firebug,警告这会导致浏览器变慢。于是我就想是不是也可以通过Javascript检测一下Firebug的版本呢。搜了一下,在这个网站找到了通过js检测Firebug的方法(具体原理请参照原文):的确是很巧妙的方法。
Boolean(window.console && window.console.firebug)
我对Ajax的一些看法
昨天跟秋实通电话的时候,他突然提起来了Ajax,无奈通话质量实在是糟糕(不知道是澳洲的电话网关糟糕,还是联通的通话质量糟糕),总之就是我听不清他说的话。因为这个话题技术性比较高,我实在是“猜”不出来他在说什么,只好自己瞎应和了几句便换了别的话题。
学Ajax也有一段日子了,也在Waki-Blog上进行了一些小小的应用,作为弥补昨天的“交流不足”,今天就来谈一下我对Ajax的一些看法。
继续阅读我对Ajax的一些看法
解决Javascript跨域访问RSS问题
问题出在我写即时天气插件的时候。
这个天气插件呢,是通过抓取服务商(我选了MSN)提供的即时天气情况的RSS连接,来显示博主所在地当前天气状况的一个小功能。
我在本地调试插件的时候,先把天气情况的RSS保存到本地,加载本地的XML,一路通常地调通了程序,但是在实际测试的时候出现了问题。
当试图通过XMLHttpRequest对象访问http://weather.msn.com/rss.aspx来获得当前的天气情况的时候IE却提示没有权限,Firefox2.0的Debugger则提示了一堆不知所谓的乱码。把XML改成本地的,问题立即消失。心下估么着,八成是Javascript出于安全性考虑,不允许跨域调用资源造成的。
没辙,只好求助Google,Google了一下“Javascript 跨域 RSS”这个关键字之后,想法得到了证实。接下来却又郁闷于如何解决这个问题。在网上大致找到了几种方法,一种是在后台做代理,或者是Apache的Rewrite或者是Proxy模块,document.domain等等的。只不过一来我等小虾没有自己的服务器,改http.conf用速度最快的Rewrite方法是与我无缘了,我和MSN的域名相差甚远,眼看document.domain也没戏。这下只好用PHP做一个代理了。
在网上找到了下面代码(出处,注释我翻译了一下):PHP Code:
<?
// 指定域名
define('HOSTNAME', 'http://api.local.yahoo.com/');
// 从AJAX进程中获得后面的请求地址
$path = $_GET['path'];
// 将域名和地址组合
$url = HOSTNAME.$path;
// 打开Curl进程
$session = curl_init($url);
// 不返回HTTP头,只返回服务器应答内容。
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// 发起请求
$xml = curl_exec($session);
// WEB服务器发送XML头
header("Content-Type: text/xml");
echo $xml;
curl_close($session);
?>连看都没看,简单改了一下地址,直接放到程序里面,服务器提示Fatal error: Call to undefined function curl_init()。继续郁闷……
看来只好用苯方法了,但是却比较管用:PHP Code:之后保存为weather.php,前台的Ajax向这个weather.php提交请求之后,这个后台代理从别人那里抓了XML内容再输出出来给Ajax看,Javascript一看是本地资源自然高兴,于是按照我的意思就显示了天气出来。这么做虽然增加了服务器负担,但是因为不能动用Rewrite模块,这也是不得已而为之。
<?
$url = "http://weather.msn.com/rss.aspx?wealocations=wc:CHXX0046&weadegreetype=C";
header("Content-Type: text/xml");
$content = file_get_contents($url);
echo $content;
?>
ASP、.NET的代理,网上也都能找到现成的代码,既然是玩PHP的,这里就不现眼了。
当然,以上是比较基础的方法,如果你的Blog流量特别巨大,急切希望减小带宽和请求次数开销,可以在服务器段做缓存,N小时更新一次,如果连服务器缓存都支撑不了……-0- 可以尝试用Javascript在客户端的cookie里面放一些东西也不是不可以……只要你的客户们愿意就可以……如果还是不满意的话,可以默认客户端不显示博主当前天气状况,如果用户想看了,就点击相应的链接,触发Ajax,之后就是照常提交请求、接收回应等等。
(别问我为什么MSN提供的天气资料是英文的,我这显示出来的却是中文的…因为我在weather.php里面动了点手脚,把相应的词语都已换成中文了 囧)
Ajax+PHP实现安全登录
*原创作品,欢迎转载,转载请保留作者和出处。
放暑假之前,在网上闲逛,不知怎么的就逛到了CoolCode.CN,看到了andot老师的文章《安全登录系统的设计与实现方案》,深受启发,决定将其进行实际应用。但是文章中仅仅指出了大致的流程,并没有描述具体操作方法。经过一下午+一晚上的摸索,终于将其实现。本文就将介绍我在实践过程中的一些感想和经验。 继续阅读Ajax+PHP实现安全登录
Javascript的小把戏
今天听秋实说,他写好Blog之后没有备份,提交失败后文字全部浮云。于是我立即想起了以前数次类似的“惨痛教训”。于是就在Blog程序的编辑器中加入了自动将内容备份到剪贴板的功能。这样,除非系统崩溃剪贴板中的内容消失,否则浏览器崩溃(尤其是Maxthon)、网络断流等等的问题都可以轻松应付。
其实将值复制到剪贴板非常简单,只需要一句Javascript即可。代码如下:setData方法的第一个参数是数据类型,可以是URL或者Text,使用Text会将内容存储为文本格式。第二个参数是要复制到剪贴板里的内容,这里指定为document.input.message.value的意思是name为“input”的表单中的name为“messgae”的文本框中的内容(value)。
window.clipboardData.setData('Text', document.input.message.value);
只要将这段代码加在表单的onSubmit属性中即可,这样就能做到表单提交的时候自动执行这段代码,将文本框的内容复制到剪贴板,免得出现辛苦写的东西全部浮云的“囧”境。
其实这段代码只要稍加变通,即可实现更加丰富的功能。
将上面的代码放进函数,方便调用:之后再在页面中加入:
function backup_msg2clip() {
window.clipboardData.setData('Text', document.input.message.value);
}通过setInterval方法设定每10(把10000改成600000就是60秒了)秒钟执行一次backup_msg2clip(),这样就相当于每10秒钟备份一次。但是这样也有缺点,那就是在编写文章的时候,剪贴板被文章内容独占,如果此时想从别的文章中copy一些内容过来,那可真要做到“眼疾手快”,要在10秒钟内ctrl+c,回到编辑器再ctrl+v,可真够紧张的。
window.setInterval("backup_msg2clip()",10000);
既然这样,我们就同样将上面代码放进函数,只在需要的时候执行。之后再创建一个链接:
function start_backup() {
window.setInterval("backup_msg2clip()",10000);
}只有点击这个链接后,自动备份功能才会启动。
<A href="javascript:start_backup()">(每10秒钟自动将内容备份至剪贴板)</a>
如果觉得这样还不保险,可以通过#default#savehistory防止后退清空文本框。
在表单的HTML标签中加入style属性,值为“behavior:url(#default#savehistory);”,这样提交表单之后再后退,文本框就不会被清空,依然保持着提交之前的样子。
怎么样,如此一来,无论是在CMS还是Blog中写东西,安全感都大多了吧。
题外话:
今天更新了Waki-Blog,除了前面提到的后台编辑器更新以外,还修改了bbcode解析部分。解析code代码的时候,自动将代码中引号前面的斜杠去掉,并将特殊字符转换为html标号,以防止引用的代码中的html语句被浏览器执行。