1 2 3 下一页 (Page 1 of 3)
XMLHttpRequest在firefox3中的区别

原来在firefox2以下版本中写XMLHttpRequest读取时,同步和异步请求都是onreadystatechange来设置回调函数,可是到firefox3中,同步请求通过设置onreadystatechange来判断数据是否读取貌似完成没有作用,换回下面方法就没问题了。

在 firefox2 以下版本中,xmlhttp同步/异步读取数据,可以使用下面方法来监测数据是否读取完毕:

  1. transport.onreadystatechange = function () {   
  2.     if (transport.readyState == 4) {   
  3.         if (transport.status == 200) {   
  4.             // do sth   
  5.         } else {   
  6.             // do sth   
  7.         }   
  8.     }   
  9. }  
在 firefox3 中测试时,xmlhttp同步读取数据,设置onreadystatechange不会产生回调。
需要在send方法后这样读取:
  1. transport.send(null);   
  2.        
  3. if (transport.status == 200) {   
  4.     // do sth   
  5. else {   
  6.     // do sth   
  7. }  
Firefox下动态创建form提交时的0x804b00a异常
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标签在特定情况下也会出现这种问题。


innerHTML插入CSS样式表

在修改这个日志编辑器时碰到的问题,IE中innerHTML插入html代码如果混杂有css样式表,当css样式插入在元素最前面时,IE会忽略这个样式。

演示(下面代码在IE中字体将是黑色,而firefox中会正确的显示为红色):

  1. <HTML>  
  2.   
  3. <DIV id=test></DIV>  
  4. <SCRIPT>  
  5. document.getElementById("test").innerHTML += "<style>b{color:red}</style><b>hello!World!!!</b>";   
  6. </SCRIPT>  
  7.   
  8. <HTML>  

其它参考:PJHome的使用innerHTML插入样式。不过感觉这篇文章中说的不是很正确。

文中提到“IE对这里的顺序要严格要求。必须先插入html内容然后再插入<style>样式才生效。这样test这个div 里就会出现一个红色的 hello!World! 但是如果把<style>放到<b>前头,就被IE无视了。”

感觉上说的是CSS样式表需要放在使用这个样式表的元素前面。而实际上,插入内容时,只要有任意一个其它html元素就行了,比如br,pre,div等。:)

 

Got error 28 from storage engine

刚测试程序,原本好好的注册用户时验证码功能报错,取$_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参数,指向具有足够空间目录

防止截取摘要时将html标签截断

做文章系统首页时经常需要截断文章,只显示文章一部分摘要内容,这样将不会导致文章过多时使首页看起来过于臃肿。

截断含html标签的文章内容时会碰到一些问题,比如截取的地方正好是img标签,这样就会使整个页面变形。

在网上找到一种解决方法http://www.hua2r.com/blog/20c3dfecb972ccb0421cd0402bfa1106.xml

本BLOG系统首页就是用这种思路来截取字符串的。

具体思路为:

  1. 用正则将html标签和文章内容分开
  2. html标签不参加字符串长度计算(如果碰到html标签,直接拼加,是真正内容时,才计算长度)
  3. 根据html标签进/出栈(Stack,先进后出)
  4. 循环第2步,3步
  5. 超过长度,跳出循环,如果栈中有html标记,将html标记补到内容后面

上面网址列出的代码片段有几个小问题,没有考虑到font标签的处理情况。下面贴出俺修改后的

  1. function htmlSubString($content$maxLength=300) {   
  2.     $content = preg_split('/(<[^>]+?>)/i'$content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);   
  3.     $outString = '';   
  4.     $curLength = 0;   
  5.     $tagStack = array();   
  6.     foreach($content as $value) {   
  7.         if(trim($value) == ''continue;   
  8.         $outString .= $value;   
  9.         if (preg_match('/^([^<>]+)$/i'$value)) {   
  10.             $curLength += strlen($value);   
  11.             if($maxLength < $curLengthbreak;   
  12.         } 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)) {   
  13.             continue;   
  14.         } else if(preg_match('/<\/([^>]+?)>/i'$value$matches)) {   
  15.             array_pop($tagStack);   
  16.         } else if(preg_match('/<(\w*)\s*.*/i'$value$matches)) {   
  17.             array_push($tagStack$matches[1]);   
  18.         } else {   
  19.             break;   
  20.         }   
  21.     }   
  22.   
  23.     $patchStack = array_reverse($tagStack);   
  24.     foreach($patchStack as $tagName) {   
  25.         $outString .= "</$TAGNAME>";   
  26.     }   
  27.     return $outString;   
  28. }  
window.onload 的问题

随着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下测试通过

  1. Event.addDOMReadyEvent = function($callback) {   
  2.     var timer, fired = false;   
  3.        
  4.     function fireDOMReadyEvent() {   
  5.         if (fired) {   
  6.             return;   
  7.         }   
  8.         if (timer) {   
  9.             window.clearInterval(timer);   
  10.         }   
  11.         fired = true;   
  12.         $callback();   
  13.     }   
  14.        
  15.     // firefox, opera, safari ...    
  16.     if (document.addEventListener) {   
  17.         if (window.webkit) {   
  18.             timer = window.setInterval(function() {   
  19.                 if (/loaded|complete/.test(document.readyState)) {   
  20.                     fireDOMReadyEvent();   
  21.                 }   
  22.             }, 10);   
  23.                
  24.             Event.addEvent(window, 'load', fireDOMReadyEvent);   
  25.         } else {   
  26.             // firefox, opera9 使用 DOMContentLoaded   
  27.             document.addEventListener("DOMContentLoaded", fireDOMReadyEvent, false);   
  28.         }   
  29.     } else {   
  30.         // Internet Explorer中使用 defer 属性   
  31.         var src = (window.location.protocol == 'https') ? '://0' : 'javascript:void(0)';   
  32.         document.write('<SCRIPT id=__tbOnDOMReady src="' + src + '" defer><\/script>');   
  33.         $('__tbOnDOMReady').onreadystatechange = function() {   
  34.             if (this.readyState == 'complete') {   
  35.                 this.onreadystatechange = null;   
  36.                 fireDOMReadyEvent();   
  37.             }   
  38.         };   
  39.     }   
  40. }  
1 2 3 下一页 (Page 1 of 3)