2012-08-06 143 views
0

我遇到了一个单独工作的页面有问题,但是当它嵌入到公司网页(我不控制)的iFrame中时,它在IE9(但不是IE8)中扼流圈。调试IFrame内容

该页面使用jQuery创建AJAX调用,并使用KnockoutJS绑定显示的内容。该页面将GET请求中的参数传递给我的服务器,并用AJAX做出响应,并且在从服务器获取数据时它似乎窒息。该数据是正确的,正确的格式,但是,当这个代码执行:

$.ajax({ 
    url: this.serviceURL + parameters, 
    dataType: 'json', 
    success: callback, 
    timeout: 3000, 
    error: function (jqXHR, status, errorThrown) { 
     if (status == "timeout") { 
      error("The connection to the server timed out.\nEither the server is down or the network is slow.\nPlease try again later."); 
     } 
     else { 
      error("An error occurred while trying to communicate with the server.\n " + errorThrown); 
     } 
    } 
}); 

在IE9中,我总是打“发生错误...”分支的“语法错误:无效字符”的errorThrown,这什么都没告诉我。

有人对如何去解决这个问题有什么建议吗?我使用Fiddler来查看服务器发送和返回的内容,并且一切看起来都很好。

更新:睡了一会儿后,我今天开始新鲜。我已经确定的是,由于某种原因,当我的页面的iframe,而不是让JSON响应:

"{"Foo":true,"Bar":true}" 

我真的开始(从错误处理程序迫使一个错误,所以我可以检查在jqXHR.responseText的状态):

" {"Foo":true,"Bar":true}" 

其中如果使用控制台,我尝试喂到JSON.parse,给我一个错误。所以问题是,领先的空间来自何处?如果我在Firefox中运行它,我会看到来自服务器的正确响应(没有空间),如果我在iFrame之外运行,我看不到任何前导空间。所以我不想认为它是即将到来的服务器端。在母版页和我的页面上运行的JS混乱中,它插入了一个前导空间。

更新2:仔细观察发现,jqXHR.responseText.charCodeAt(0)是65279,因此它并不是一个真正的空间(虽然它显示为一个),它是字节顺序标记。但为什么现在(而不是之前)以及它为什么会导致问题呢?

+0

需要更多信息,而不是“有问题”。发布有关您的网址的更多详细信息,显示完整的错误消息errorThrown等。 – 2012-08-06 18:31:05

+0

我无法提供该URL,它位于我们的内部Intranet上。错误消息是“SyntaxError:Invalid character”,正如我在文章中所说的。如果您对如何提取更多信息有任何建议,我想听听。这实际上是问题的一半。 – 2012-08-06 18:45:34

+0

“而且一切看起来都很好” - 显然不是某处 - 或者服务器端出现错误。 'alert(errorThrown);'''alert(parameters);''alert(this.serviceURL);'看看你在哪里。 – 2012-08-06 19:02:09

回答

1

我找不出这个问题的原因,所以我通过向我的ajax调用添加一个自定义转换器来绕过它。所以,我现在有这样的:

 $.ajax({ 
      url: this.serviceURL + parameters, 
      dataType: 'json', 
      success: callback, 
      timeout: 3000, 
      converters: { "text json": HackyJSONConverter }, 
      error: function (jqXHR, status, errorThrown) { 
       if (status == "timeout") { 
        //alert("Timed out"); 
        error("The connection to the server timed out.\nEither the server is down or the network is slow.\nPlease try again later."); 
       } 
       else { 
        error("An error occurred while trying to communicate with the server.\n " + errorThrown); 
       } 
      } 
     }); 

我的哈克转换是这样的:

function HackyJSONConverter(data) { 
     if (data[0] = 65279) { 
      // leading BOM - happens only with an iFrame in OT for some unknown reason 
      data = data.substring(1); 
     } 
     return JSON.parse(data); 
    } 

这是非常愚蠢的,如果任何人有一个更好的办法,我会很高兴!