Ajax应用程序适用于某些浏览器,而不适用于其

时间:2009-09-26 21:02:55

标签: ajax internet-explorer-8

我的ajax应用程序在Firefox中运行良好,但在IE8中运行不正常。具体来说,ajax功能不起作用。

这是我正在使用的代码:

function createXMLHttpRequest()
{
  if (window.XMLHttpRequest)
  {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    return new XMLHttpRequest();
  }

  if (window.ActiveXObject)
  {
    // code for IE6, IE5
    return new ActiveXObject("Microsoft.XMLHTTP");
  }

  return null;
}

这是错误:

Object doesn't support this property or method
ajax.js
Code:0
Line : 6
Char : 5

它在Firefox中运行良好。

我的代码有什么问题?

9 个答案:

答案 0 :(得分:5)

直接出于jQuery:

return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") :
                              new XMLHttpRequest();

答案 1 :(得分:4)

考虑使用如下函数:

 function createXMLHttpRequest() {
  var xmlhttp = false;
  if (window.XMLHttpRequest) {
   xmlhttp = new XMLHttpRequest();
  } else if(window.ActiveXObject) {
   try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
    try {
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
     xmlhttp = false;
    }
   }
  }
  return xmlhttp;
 };

在ActiveX中测试新的XMLHttp插件,或默认为旧插件。

更新:请改为尝试:

function createXMLHttpRequest()
{
  var xmlhttp, bComplete = false;
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
  catch (e) { xmlhttp = false; }}}
  if (!xmlhttp) return null;
  this.connect = function(sURL, sMethod, sVars, fnDone)
  {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();

    try {
      if (sMethod == "GET")
      {
        xmlhttp.open(sMethod, sURL+"?"+sVars, true);
        sVars = "";
      }
      else
      {
        xmlhttp.open(sMethod, sURL, true);
        xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
        xmlhttp.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded");
      }
      xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && !bComplete)
        {
          bComplete = true;
          fnDone(xmlhttp);
        }};
      xmlhttp.send(sVars);
    }
    catch(z) { return false; }
    return true;
  };
  return this;
}

function getModIndex(val) {
    var divEle = "IndexDiv" + val;
    var request = createXMLHttpRequest();

    if ( !request ) { 
    alert( request )
    return false
    }

    var callback = function( oXML ) {
    document.getElementById( divEle ).innerHTML = oXML.responseText;
    }

    request.connect(
    '../ajax/ajax-GetIndex.php',
    'POST',
    'id=' + val,
    callback
    );
}

答案 2 :(得分:2)

你可以尝试这段代码:

function createXMLHttpRequest() { 
  if (typeof XMLHttpRequest != "undefined") { 
    return new XMLHttpRequest();
  } else if (typeof ActiveXObject != "undefined") { 
    return new ActiveXObject("Microsoft.XMLHTTP"); 
  } else { 
    throw new Error("XMLHttpRequest not supported");
}

答案 3 :(得分:2)

我遇到了同样的问题 - 重新加载页面似乎消除了错误,但是第一次访问页面时我遇到了与luvboy相同的错误。

我认为基本问题与IE 8有关,因为首次加载XMLHttpRequest函数会出现问题。我放弃了寻找真正原因的原因,但似乎其他人也有类似的怪癖:http://www.daniweb.com/forums/thread299941.html

Dan Beam的答案似乎运行得很好,而且代码更少 - 它首先检查ActiveXObject,IE似乎更满意。

答案 4 :(得分:2)

“我不确定我是否确切地知道问题是什么,但我确实找到了一个解决方案。我打算用jQuery重新编码它并注意到我在XMLHttpRequest之前检查ActiveX的代码,所以我只是将我的代码翻转为首先检查ActiveX,现在它适用于IE8和FF。

似乎问题是IE8在重新加载页面后无法创建XMLHttpRequest(我不知道为什么)所以让它创建一个ActiveXObject而不是让它一直工作。“我给出了这个答案{ {3}}

一直有效:D:D !!

答案 5 :(得分:1)

至少在Vista上的IE8中,用户需要关闭“原生XMLHTTP支持”(声音违反直觉)。要做到这一点:

  1. 召唤“Internet选项”,然后单击“高级”选项卡。
  2. 向下滚动到“安全”复选框集(这可能是一段时间),并取消选中“启用本机XMLHTTP支持”。根据{{​​3}}
  3. 的发现,您可能还需要取消选中“启用集成Windows身份验证”(也在“安全性”部分中)并重新启动IE8

    当尝试POST到HTTPS时,您可能会通过查找其“message”属性为“Access is denied”(或类似内容)的JavaScript异常来检测是否需要执行此Web应用程序通过AJAX对象的URL。

    (使用Prototype,您可以将onException键值对添加到与onSuccess和onFailure相同的位置。它看起来像: onException的:函数(irrelevant_object,EXC){警报(exc.message);}

    函数体比显示抛出异常的本质要多得多。)

    如果抛出相关异常,请设置一个方框,告诉用户如何关闭他/她的IE8副本中的XMLHTTP项目。

答案 6 :(得分:1)

一直有类似的问题并已阅读大量解决方案但对我无效

当我终于弄清楚时,我比平常更多地诅咒微软。

以下代码将在Mozilla中起作用,因为它决定是否设置了值,它在选项标签之间使用值发送到SetContactForm,而IE8发送空白值

<select name="contact_type" id="contact_type" onChange="SetContactForm(this.value)">
<option>email</option>
<option>address</option>
</select>

让它工作只需添加一个值

<select name="contact_type" id="contact_type" onChange="SetContactForm(this.value)">
<option value="email">email</option>
<option value="address">address</option>
</select>

我希望这能节省一些头脑。

答案 7 :(得分:0)

您可以尝试为Microsoft.XMLHTTP使用大写小写,即(Microsoft.XMLHttp)IE8是非凡的区分大小写

答案 8 :(得分:0)

这是用于获取文本文件内容的代码(位置清理)...适用于IE 8和Chrome:

var fileName = "http://www.example.com/myfile.txt";

var txtFile;

if (window.ActiveXObject)
{
    try {// code for IE8
        txtFile = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try { // code for IE6, IE5
            txtFile = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            txtFile = false;
        }
    }
}
else if (window.XMLHttpRequest)
{
    // code for IE7, Firefox, Chrome, Opera, Safari
    txtFile = new XMLHttpRequest();
}

txtFile.open("GET",fileName,false);
txtFile.send();
var txtDoc=txtFile.responseText;
// alert(txtDoc); // this will give you the text contents