【问题标题】:Javascript Internet Explorer 8/7 Not Posting in Ajax CallJavascript Internet Explorer 8/7 未在 Ajax 调用中发布
【发布时间】:2010-02-22 16:55:30
【问题描述】:

大家好,这个网站的新手,但我是忠实粉丝。 对的问题。我们注意到,有时在 Internet Explorer 上 post 变量无法通过。 这是我们的基本ajax函数

function GetXmlHttpObject(handler){ 
 var objXmlHttp=null

 if (navigator.userAgent.indexOf("Opera")>=0){
  xmlHttp=new XMLHttpRequest();
  xmlHttp.onload=handler
  xmlHttp.onerror=handler
  return xmlHttp;
 }
 if (navigator.userAgent.indexOf("MSIE")>=0){ 
  var strName="Msxml2.XMLHTTP"
  if (navigator.appVersion.indexOf("MSIE 5.5")>=0){
   strName="Microsoft.XMLHTTP"
  } try { 
   objXmlHttp=new ActiveXObject(strName)
   if(handler == null) {
    handler = function() {}
   }
   objXmlHttp.onreadystatechange=handler 
   return objXmlHttp
  } catch(e) { 
   return 
  } 
 } 
 if (navigator.userAgent.indexOf("Mozilla")>=0){
  objXmlHttp=new XMLHttpRequest()
  objXmlHttp.onload=handler
  objXmlHttp.onerror=handler 
  return objXmlHttp
 }
}

这是使用它的调用

 params = "object_type="+object_type+"&object_id="+object_id;
 xmlHttp_comment_notifyreset = GetXmlHttpObject(notification_reset_helper);//fails on safari 1
 xmlHttp_comment_notifyreset.open("POST", url , true);


 xmlHttp_comment_notifyreset.setRequestHeader("Content-Type", "application/x-www-form-URLencoded");
 xmlHttp_comment_notifyreset.setRequestHeader("Content-Length", params.length);
 xmlHttp_comment_notifyreset.setRequestHeader("Connection", "close");
 xmlHttp_comment_notifyreset.send(params);

基本上 object_type,object_id 没有被发送,尽管在那里。 就像我说的那样,它看起来只是一个有时会发生的 IE7/8 问题。

我认为这可能是缓存问题。但是我们所做的是我们有一个 function.js 文件,但是每当我们进行更改时,我们都会更改最后更改的时间戳并使用 htaccess 来获取似乎可以工作的新文件。由于 IE 等将文件视为缓存中的新文件。

P.S 我们不能使用 JQuery 或任何其他框架,因为它们太大而无法为我们的会员下载。

感谢您的帮助。 理查德

【问题讨论】:

  • 天啊。停止。把那个代码扔掉。为此使用用户代理检测绝对是疯狂的。要么使用对象检测(如jibbering.com/2002/4/httprequest.html,但不使用全局变量),要么使用诸如developer.yahoo.com/yui/connectionapi.jquery.com/category/ajax 之类的库——至于“对于您的成员来说太大”的库——您的站点是否使用任何图形?如果是这样,就为一个像样的图书馆牺牲一个。
  • “对于我们的会员来说下载太大”是一个废话。为正确的工作使用正确的工具,或者根本不这样做。
  • 你可以在单行中拥有一个完美的跨浏览器getXMLHttpRequest;不需要一个完整的框架。但是,是的,这里的浏览器嗅探是一场灾难。
  • 公平竞争的家伙。是的,我在这里找到了一个很好的光滑的
  • 函数 GetXmlHttpObject(handler){ var objxml = null; var ProgID = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];尝试 { objxml = new XMLHttpRequest(); } catch(e) { for (var i = 0; i

标签: php javascript ajax internet-explorer


【解决方案1】:

我认为问题在于识别 IE - 您将 IE6+ 放在一个包中,这是不对的。据我记得,它在 ie6 和 7+ 之间发生了变化。您不能依赖浏览器名称。

说真的。这是有史以来最糟糕的 XMLHttpRequest 创建代码。对象创建是在可靠的开发网站和 AJAX 书籍中的一些很好的示例中完成的。你是从哪里得到这个的?

但请使用框架。一个全新的单行 ajax 调用世界等着你!!

我敢打赌,使用 jquery 重写你的代码并缩小它(你现在可能不会这样做)会使 js 的总重量比现在少。尤其是整个 POST 的使用需要 5 行代码。

【讨论】:

    【解决方案2】:

    大家好,我还是有问题。我正在使用

    function GetXmlHttpObject(handler){ 
         var objxml = null;  
       var ProgID = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];              
    
         try {  
             objxml = new XMLHttpRequest();  
         }  
         catch(e) {  
             for (var i = 0; i < ProgID.length; i++){  
                 try {  
                     objxml = new ActiveXObject(ProgID[i]);  
                 }  
                 catch(e) {  
                     continue;  
                }  
             }  
         } 
             objxml.onreadystatechange=handler;
    
    
    
    
    
         return objxml;  
    
    }
    

    作为我的 XML 对象和

    这种调用页面的风格

    var d = new Date();
        var time = d.getTime();
        var url= SITEURL + "/libs/ajax/ajax_site_mood.php?timestamp="+time;
    
        params = "mood_value="+value;
        xmlHttp_site_mood = GetXmlHttpObject(null);//fails on safari 1
        xmlHttp_site_mood.open("POST", url , true);
    
        xmlHttp_site_mood.setRequestHeader("Cache-Control", "no-cache");
        xmlHttp_site_mood.setRequestHeader("Cache-Control", "no-store");
        xmlHttp_site_mood.setRequestHeader("Cache-Control", "must-revalidate");
        xmlHttp_site_mood.setRequestHeader("Cache-Control", "post-check=0");
        xmlHttp_site_mood.setRequestHeader("Cache-Control", "pre-check=0");
        xmlHttp_site_mood.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");    
    
    
        xmlHttp_site_mood.setRequestHeader("Content-Type", "application/x-www-form-URLencoded");
        xmlHttp_site_mood.setRequestHeader("Content-Length", params.length);
        xmlHttp_site_mood.setRequestHeader("Connection", "close");
        xmlHttp_site_mood.send(params);
    

    每次根据上次更新时间更改库时,我都会更改对库的请求。 但似乎不想总是工作。 任何线索。 我也很好奇它在调用帖子并使用它的缓存时发送的 jquery 标头:false 谢谢你的帮助。 理查德

    【讨论】:

      【解决方案3】:

      如果他们不能下载核心 jQuery 缩小或打包版本,那么我认为你有问题。它不是那么大,而且浏览器现在允许 8 个连接的事实......

      也可以通过 Google 的 CDN 获得,请参阅 http://code.google.com/apis/ajaxlibs/documentation/

      【讨论】:

      • 问题是你的代码已经被几个客户端框架完成了,而且可能做得更好。正如我所说,您通常可以从它们各自的网站获取这些框架的核心功能,或者使用 CDN 引用 en.wikipedia.org/wiki/Content_delivery_network 来访问这些框架。汽车已经造好了,只要学会驾驶它。
      【解决方案4】:

      找到了答案。 好吧,上面的东西都很好,得到一个好的 XMLHTTP 对象,上面那个看起来不错。 额外设置的请求标头也不错。 但真正的问题在这个页面上 http://qfox.nl/notes/1

      【讨论】:

        猜你喜欢
        • 2014-02-18
        • 2018-05-05
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        相关资源
        最近更新 更多