CMS系统中一个Bug的解决过程(about javascript and urlencode ,php)

01月 21, 2007 on 10:19 pm | In 未分类 |

上周编辑反馈我一个奇怪的Bug:很多文章编辑后,就只有一半的内容了!
我很纳闷,怎么会有这样的Bug呢?
等我去看过了问题所在,终于明白了:
程序运行后页面的源码是:

  1. <input name='title' value="我的朋友("***")"/>

原来在标题中也有双引号,所以firefox以为这是一个Html属性的结束,所以input中的内容是:
我的朋友(”,后面的内容都没有了。
这不简单我马上改好了:

  1. <input name='title' value="<?php echo urlencode($title);?>" class ='urlencode'>
  2. <script >
  3. $(document).ready(
  4. function(){
  5. $("input.urlencode").val(decodeURI($("input.urlencode").val()));
  6. </script>

这是jquery的语法。我是在输出数据时先urlencode一下,这样在input的value项中就没有引号了。
然后在客户端加载后完以后,把这个值改成decodeURI计算出来的值,也就是相当于php的一个urldecode操作。
这下以为好了,谁想一测,还不对。有%2C和加号在标题里。
再Google一下,说是javascript中解密urlencode用decodeURIComponent函数要好一些。urldecode无法正常求解包含有英文逗号和加号的串urlencode后的结果。urlencodeURI无法解含有加号的串urlencode后的结果。
现在我只好写了一个先把密文中的加号换成secret串用decodeURIComponent操作,然后再把secret串换回加号。服务器端仍是先urlencode再输出来,客户端这样进行urldecode解码:

  1. <script language="javascript">
  2. String.prototype.Replace=function(a,b)
  3. {
  4. var str=new String(this);
  5. while(str.indexOf(a)>-1)
  6. {
  7. str=str.replace(a,b);
  8. }
  9. return str;
  10. }
  11. function myURIdecode(str)
  12. {
  13. var secret='t834ghdt374hgdu7g2rtehuer';
  14. var tmp=str.Replace("+",secret);
  15. tmp=decodeURIComponent(tmp);
  16. tmp=tmp.Replace(secret," ");
  17. return tmp;
  18. }
  19. </script>

这样,才是正确的对应于php端的urldecode的javascript版的解码函数。
注意,我的php是utf-8的。如果是gb2312,需要更麻烦一些。因为javascript好像一般是utf-8的内码操作。

现在bug好像越来越多,忙不过来了。得上bug系统了。

No Comments yet »

评论 RSS Feed。 TrackBack URI

发表评论

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^