Jun 09, 2008
原来在firefox2以下版本中写XMLHttpRequest读取时,同步和异步请求都是onreadystatechange来设置回调函数,可是到firefox3中,同步请求通过设置onreadystatechange来判断数据是否读取貌似完成没有作用,换回下面方法就没问题了。
在 firefox2 以下版本中,xmlhttp同步/异步读取数据,可以使用下面方法来监测数据是否读取完毕:
- transport.onreadystatechange = function () {
- if (transport.readyState == 4) {
- if (transport.status == 200) {
-
- } else {
-
- }
- }
- }
在 firefox3 中测试时,xmlhttp
同步读取数据,设置onreadystatechange不会产生回调。
需要在send方法后这样读取:
- transport.send(null);
-
- if (transport.status == 200) {
-
- } else {
-
- }
Apr 11, 2008
Component returned failure code: 0x804b00a[nsIDOMHTMLFormElement.submit]
在Firefox下动态创建form并提交到其它页面时,有时会产生这个异常。
在IE下则没有这个问题。
比如这个:
http://www.webdeveloper.com/forum/showthread.php?t=92006在写这个博客后台的HTML编辑器时,也碰到了这个问题。
0x804b000a is NS_ERROR_MALFORMED_URI. Check whether using an absolute URI for action makes a difference.
解决方法:看看form的action地址用的是不是相对路径,如果是相对路径,改为http://youdomain.com/action.php形式的完整URL试试。
PS:IMG标签在特定情况下也会出现这种问题。
Apr 09, 2008
在修改这个日志编辑器时碰到的问题,IE中innerHTML插入html代码如果混杂有css样式表,当css样式插入在元素最前面时,IE会忽略这个样式。
演示(下面代码在IE中字体将是黑色,而firefox中会正确的显示为红色):
- <HTML>
-
- <DIV id=test></DIV>
- <SCRIPT>
- document.getElementById("test").innerHTML += "<style>b{color:red}</style><b>hello!World!!!</b>";
- </SCRIPT>
-
- <HTML>
其它参考:PJHome的使用innerHTML插入样式。不过感觉这篇文章中说的不是很正确。
文中提到“IE对这里的顺序要严格要求。必须先插入html内容然后再插入<style>样式才生效。这样test这个div 里就会出现一个红色的 hello!World! 但是如果把<style>放到<b>前头,就被IE无视了。”
感觉上说的是CSS样式表需要放在使用这个样式表的元素前面。而实际上,插入内容时,只要有任意一个其它html元素就行了,比如br,pre,div等。:)
Mar 28, 2008
刚测试程序,原本好好的注册用户时验证码功能报错,取$_SESSION中服务端生成的验证码值一直为空。
debug来debug去还是没发现问题,重启服务器,连日志首页都打不开了,MYSQL抛了个“Got error 28 from storage engine”的错误。
原来发现这两个问题都是磁盘没空间引起的(昨晚BT了一个10G的文件) -_-!!
PHP创建session时,会在本地磁盘写文件。MYSQL做复杂一点的查询,估计也会往临时表里写数据。
ERROR 1030 (HY000): Got error 28 from storage engine
出现此问题的原因:临时空间不够,无法执行此SQL语句
解决办法:清空/tmp目录,或者修改my.cnf中的tmpdir参数,指向具有足够空间目录
Mar 24, 2008
做文章系统首页时经常需要截断文章,只显示文章一部分摘要内容,这样将不会导致文章过多时使首页看起来过于臃肿。
截断含html标签的文章内容时会碰到一些问题,比如截取的地方正好是img标签,这样就会使整个页面变形。
在网上找到一种解决方法http://www.hua2r.com/blog/20c3dfecb972ccb0421cd0402bfa1106.xml
本BLOG系统首页就是用这种思路来截取字符串的。
具体思路为:
- 用正则将html标签和文章内容分开
- html标签不参加字符串长度计算(如果碰到html标签,直接拼加,是真正内容时,才计算长度)
- 根据html标签进/出栈(Stack,先进后出)
- 循环第2步,3步
- 超过长度,跳出循环,如果栈中有html标记,将html标记补到内容后面
上面网址列出的代码片段有几个小问题,没有考虑到font标签的处理情况。下面贴出俺修改后的
- function htmlSubString($content, $maxLength=300) {
- $content = preg_split('/(<[^>]+?>)/i', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
- $outString = '';
- $curLength = 0;
- $tagStack = array();
- foreach($content as $value) {
- if(trim($value) == '') continue;
- $outString .= $value;
- if (preg_match('/^([^<>]+)$/i', $value)) {
- $curLength += strlen($value);
- if($maxLength < $curLength) break;
- } else if(preg_match('/<IMG([^>]+)?>/i', $value) || preg_match('/<PARAM([^>]+)?>/i', $value) || preg_match('/<!([^>]+)?>/i', $value) || preg_match('/<HR([^>]+)?>/i', $value) || preg_match('/<BR([^>]+)?>/i', $value)) {
- continue;
- } else if(preg_match('/<\/([^>]+?)>/i', $value, $matches)) {
- array_pop($tagStack);
- } else if(preg_match('/<(\w*)\s*.*/i', $value, $matches)) {
- array_push($tagStack, $matches[1]);
- } else {
- break;
- }
- }
-
- $patchStack = array_reverse($tagStack);
- foreach($patchStack as $tagName) {
- $outString .= "</$TAGNAME>";
- }
- return $outString;
- }
Jan 05, 2008
随着ajax的流行,页面中的JS代码越来越多。一般我们用JS处理页面时,都是使用window.onload等到页面加载完毕后再来处理,否则有时会出现文档未加载完毕而报的错误了。
但window.onload有一个不好的地方,它会等到整个页面(包括图片,flash等)全部加载完毕后,才会执行。一个页面中如果有很多图片,中间会有较长的延迟才会去执行我们的代码。
具体效果:http://www.ajaxeye.com/labs/domready.htm(注意页面中的两个小方块颜色,一开始默认都是红色,注意颜色的改变)
上面页面中,会在DOM树加载完毕后和window.onload时分别改变两个小方块的颜色为绿色。
解决方法可以参见英文原文:
http://dean.edwards.name/weblog/2005/09/busted/
http://dean.edwards.name/weblog/2006/06/again/
解决方法就是想办法监听DOM树加载完毕的事件,等DOM树载完毕后执行我们的代码
- Firefox、Opera9下,可以监听DOMContentLoaded事件来处理
- IE下,可以给script标签加defer来处理
偶这个是从mootools,prototype中抠出来的IE,Firefox下测试通过 
- Event.addDOMReadyEvent = function($callback) {
- var timer, fired = false;
-
- function fireDOMReadyEvent() {
- if (fired) {
- return;
- }
- if (timer) {
- window.clearInterval(timer);
- }
- fired = true;
- $callback();
- }
-
-
- if (document.addEventListener) {
- if (window.webkit) {
- timer = window.setInterval(function() {
- if (/loaded|complete/.test(document.readyState)) {
- fireDOMReadyEvent();
- }
- }, 10);
-
- Event.addEvent(window, 'load', fireDOMReadyEvent);
- } else {
-
- document.addEventListener("DOMContentLoaded", fireDOMReadyEvent, false);
- }
- } else {
-
- var src = (window.location.protocol == 'https') ? '://0' : 'javascript:void(0)';
- document.write('<SCRIPT id=__tbOnDOMReady src="' + src + '" defer><\/script>');
- $('__tbOnDOMReady').onreadystatechange = function() {
- if (this.readyState == 'complete') {
- this.onreadystatechange = null;
- fireDOMReadyEvent();
- }
- };
- }
- }