+ -
当前位置:首页 → 问答吧 → 最近写的jquery代码,在IE中显示正常,在火狐、Opera等浏

最近写的jquery代码,在IE中显示正常,在火狐、Opera等浏

时间:2009-10-16

来源:互联网

最近写的jquery代码,在IE中显示正常,在火狐、Opera等浏览器中却不能正常显示,真是哭都哭不出来。
碍,这写这些jquqyer代码本身已经消耗了我大量的精力了啊!我力图把代码写得兼容于任何浏览器,没想到居然这么难。
我写的那些代码,在IE6\IE7\IE8中都是显示正常的,但是在火狐、Opera等浏览器中却毫无响应。而且火狐的错误控制台中也找不到关于出错的任何信息。
真是欲哭无泪。
先是贴一个问题:版面列表载入功能。先看这个功能在火狐和IE 7(IE6、IE8效果与IE7一样)的不同显示:


代码写法:
复制代码
  1. $(document).ready(function(){
  2. var $position=$("#position");
  3. var $menu=$("<div></div>").addClass("boardlist").prependTo($position);
  4. $position.hover(function(){$menu.slideDown(200);if($menu.text()==''){$menu.html('<img src=\"images/wait.gif\" /> Loading ...');$.get("json/boardlist.xml",function(data){$menu.html(data.xml)},"xml");}},function(){$menu.slideUp(200);})
  5. });

那个json/boardlist.xml是一个表示论坛版块分区的xml文件。功能意图很简单,就是网页加载完之后,生成一个内容为空的下拉列表容器。鼠标挪到那个<div id="position">**</div>上去的时候,就自动展开下拉菜单。如果下拉菜单中没有内容,就自动从服务器端加载论坛版块列表的xml文件。这样的话,如果浏览者始终没有去点那个<div id="position">**</div>的话,就不会从服务器加载版块列表,如果点了多次的话,只会加载一次。
但是我发现在火狐中楞是加载不了啊。而且错误控制台中也没有任何报错。
我头痛死了,碍,只好到这里来求助。
[ 此帖被fanxiaojie在2009-10-16 00:25重新编辑 ]

作者: fanxiaojie   发布时间: 2009-10-16

另外还有不少其它的令我头大的事。比如这说个:


这个登录框,我是用msgbox改了一下皮肤做出来的。
代码是:
复制代码
  1. $("#Showloginbox").click(function(){$.msgbox({'title':'\u4F1A\u5458\u767B\u5F55','height':174,'width':280,'content':'json/login.asp?s='+Math.random(),'type':'url',"afterAjaxEvent":checklogin});return false;})

结果是:在IE中,可以正常载入那个json/login.asp,而在火狐中,什么内容都没有载入进来,只有一片空白。

碍,问题很多,我深感学技术不容易。

作者: fanxiaojie   发布时间: 2009-10-16

另外再想问一个问题:写jquery代码,怎样换行和缩进写能够让人容易看懂一些?
这个真是一个大问题,jquery中嵌套的函数太多了,如果不换行得清楚些,最终别说别人看不懂,连自己都忘了自己原来为什么要这样写的了.

作者: fanxiaojie   发布时间: 2009-10-16

检查你的ajax函数,应该是解析失败了。IE对ajax的权限要求很低,所以可以通过。

至于代码,你注意下缩进。不懂的话看看别人的代码,一般将function和大括号另起一行

作者: keakon   发布时间: 2009-10-16

引用
引用第3楼keakon于2009-10-16 01:08发表的  :
检查你的ajax函数,应该是解析失败了。IE对ajax的权限要求很低,所以可以通过。

至于代码,你注意下缩进。不懂的话看看别人的代码,一般将function和大括号另起一行

啊,非常感谢。
其实第二个问题,就是登录框为空白的问题,我琢磨了一夜之后,发现了一个奇怪的现象:用firefox  load内容,凡是form里面的内容全消失了。这种怪事真是难以解释。不过解决它倒很好解决。我把form改成div就好了,然后,把 ****.submit(function(){......}); 改成 $("button[type=submit]",****).click(function(){......})。问题解决。

而第一个问题,我刚才又琢磨了一下,发现只要改成这样子就搞定了:
var $position=$("#position");
var $menu=$("<div></div>").addClass("boardlist").prependTo($position);
$position.hover(function(){$menu.slideDown(200);if($menu.text()==''){$menu.html('<img src=\"images/1000516.gif\" /> Loading ...');
$menu.load("json/boardlist.xml")}},function(){$menu.slideUp(200);})

哈哈,这么麻烦的问题,居然搞定它如同戳破一层纸。真是踏破铁鞋啊!

作者: fanxiaojie   发布时间: 2009-10-16

真是一波刚平,一波又起!
刚才我发现那个登录框在IE和火狐和safari中都能正常使用了。但是在chrome和oprea中依然有问题:点那个“登录”按钮无反应。
我那代码是这样写的:
复制代码
  1. $("#Showloginbox").click(function(){$.msgbox({'title':'\u4F1A\u5458\u767B\u5F55','height':174,'width':280,'content':'json/login.asp?s='+Math.random(),'type':'url',"afterAjaxEvent":function(){$.getScript("script/checklogin.js",function(){$('.slideUp').click(function(){var $pre=$(this).parent();var $next=$pre.next();$pre.slideUp('slow');$next.slideDown('slow');});});}});return false;});

\u4F1A\u5458\u767B\u5F55是“会员登录”四个字的转义。至所以用转义,原因是我发现不转义的话,在一些浏览器中中文会显示乱码。
那个json/login.asp的内容是:
复制代码
  1. <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
  2. <%Option Explicit
  3. response.charset = "gb2312"
  4. %>
  5. <div id="regfrm">
  6. <table>
  7. <tr><th scope="row" width="40"><label for="username">用户名</label></th><td><input type="text" name="username" id="username" size="20" maxlength="20" autocomplete="off" /></td></tr>
  8. <tr><th scope="row" width="40"><label for="password">密码</label></th><td><input type="password" name="password" id="password" size="20" maxlength="16" /></td></tr>
  9. <tr><th scope="row" width="40"> </th><td>  <button type="submit" class="submit"> 登录 </button>  <button type="reset"> 重置 </button></td></tr>
  10. </table>
  11. </div>

有人说用jquery的load方法,如果载入页是gb2312编码的话,会出乱码的。但是我发现其实只要在页面的头上写上这个
<%
response.charset = "gb2312"
%>
乱码就不会出来作乱了。
script/checklogin.js的内容是:
复制代码
  1. var $regfrm=$("#regfrm");
  2. $("button[type=submit]",$regfrm).click(function(){
  3.     var $username=$("#username").val();
  4.     var $password=$("#password").val();
  5.     if($username.length<3 || $password.length<6)return false;
  6.     var re=/^[\w\u4e00-\u9fa5]{3,}$/
  7.     if(re.test($username)==false) return false;
  8.     var re=/^[\w]{6,}$/;
  9.     if(re.test($password)==false) return false;
  10.     var $box=$(".msg_main");
  11.     var $layover=$(document.createElement("div")).addClass("wait").css({"width":$box.width(),"height":$box.height(),"position":"absolute"}).prependTo($box);
  12.     $.post("json/checklogin.asp",{"username":escape($username),"password":$password},function(data){$layover.remove();if(data=='error'){$("<font color=red>\u7528\u6237\u540D\u6216\u5BC6\u7801\u6709\u8BEF</font>").appendTo($box);}else{$("<font color=blue>\u767B\u5F55\u6210\u529F\uFF01</font>").appendTo($box);window.location.reload();}},"text");
  13.     return false;
  14.     },"json")

我发现在chrome和opera中,那个登录框能够正常显示,但是那个用getScript方法载入的script/checklogin.js好像没有响应。

作者: fanxiaojie   发布时间: 2009-10-16

又是踏破铁鞋无处觅,来得全不费功夫。那个Chrome和Oprea里遇到的问题,我发现只要在script/checklogin.js的头和尾分别加上“(function(jQuery){”和“})(jQuery);”就搞定了!
丫丫!

作者: fanxiaojie   发布时间: 2009-10-16