【问题标题】:JSON structure not working in IE7 (JavaScript)JSON 结构在 IE7 (JavaScript) 中不起作用
【发布时间】:2010-10-09 23:01:54
【问题描述】:

好的,我是 JSON 新手,所以如果我的问题有点无知,请原谅我 - 我的头撞墙太多,需要一些专家建议。

我正在尝试获得一个简单的示例,其中 HTML 页面使用 jQuery 的 JSON/AJAX 函数来调用示例 PHP 页面,该页面传回一个简单的 JSON 数据结构,然后页面使用 jQuery 编写一个从数据结构到页面的元素。在FF工作。在 IE7 中不起作用 arrrggghhhh!

HTML 代码(相关部分):

<script language="javascript" type="text/javascript" src="jquery.js"></script>
<script language="javascript" type="text/javascript">
function testAJAX() {
  $.getJSON("test-ajax.php", function(json){
      $("#div1").html(json.var1[1]);
  });
}
</script>
</head>
<body>
<input type="button" value="test ajax" onclick="testAJAX();" />
<div id="div1"> </div>
</body>

PHP 代码(test-ajax.php):

<?php
include_once('./json.php'); 
$output = array('var1' => array('value1a', 'value1b', 'value1c'), 
                'var2' => array('value2a', 'value2b', 'value2c')); 

header("Content-type: text/plain");
echo json_encode($output);
?>

json.php 有我正在使用的 json_encode() 函数 - 我从 http://us2.php.net/manual/en/function.json-encode.php 得到它。我使用它是因为我没有 PHP5,而且我的系统管理员不会安装任何对它的支持。直接在浏览器中查看 test-ajax.php 会打印出这样的序列化 JSON 结构:

{"var1":["value1a","value1b","value1c"],"var2":["value2a","value2b","value2c"]}

这似乎是一个有效的 JSON 结构。在我的 JavaScript 中,我试图通过这样做来引用 'value1b'json.var1[1]。 FF 处理得很好。 IE7 表示未定义。

我做错了什么?如何像这样传输二维数组

array('var1' => array('value1a', 'value1b', 'value1c'), 
      'var2' => array('value2a', 'value2b', 'value2c'));

通过 JSON/AJAX?或者这不可能?

【问题讨论】:

  • 绝对可以。我刚刚在 IE7 中测试了那个 JSON 字符串,它运行良好,我能够成功找到 json.var1[1] 的值。问题肯定出在其他地方,能不能把你的getJSON函数贴出来?
  • getJSON 来自 jQuery 库。
  • 是的 - 我的错 - 是缓存问题 - 请参阅我的答案。谢谢!

标签: php javascript json internet-explorer-7


【解决方案1】:

尝试将以下行添加到 test-ajax.php 文件的末尾:

echo ';';

【讨论】:

  • 试过了,还是不行。我改变了 echo json_encode($output);回显 json_encode($output) 。 ';';它在 FF 和 IE 中打破了它:)
【解决方案2】:

我没有立即发现任何问题,但这里有一些事情可以尝试

  1. 获取Charles。查看来自 getJSON() 调用的请求/响应。内容是否按预期返回?响应的状态码是200,还是别的什么?
  2. 确定 IE 是否知道 json 变量。修改您的代码以尝试这样的事情

(可能希望一次只运行这些警报 1 个)

$.getJSON("test-ajax.php", function(json){
  alert( typeof json );
  alert( typeof json.var1 );
  alert( typeof json.var1[1] );
});

【讨论】:

    【解决方案3】:

    如果您尝试访问这样的值,您会得到相同的结果吗?

    json["var1"][1]
    

    ... 而不是这个:

    json.var1[1]
    

    【讨论】:

      【解决方案4】:

      好的,想通了。根本不是 JSON/JavaScript 问题,而是 缓存问题。当我开发这个时,我必须在 test-ajax.php 不工作或生成不同的 JSON 结构时最初测试 IE7,然后我将 test-ajax.php 更改为我上面发布的内容,我更新了我的 JavaScript 但 IE7 是使用它最初从 test-ajax.php 收到的缓存版本。我对此进行了测试 - 如果我清除 IE7 中的缓存,它会起作用,然后如果我更改 JSON 结构中的值(但不是结构本身),IE7 将继续使用缓存的 JSON 结构。

      解决方案:

      我加了

      header("Cache-Control: no-cache, must-revalidate");
      header("Expires: 0"); 
      

      在我的 test-ajax.php 页面中,现在 IE7 在进行 AJAX 调用时会正确检查服务器是否有更新版本的 test-ajax.php。

      谢谢大家!

      【讨论】:

      • 啊,Internet Explorer AJAX 缓存。我猜几乎每个 Web 开发人员都会遇到这种情况。我希望会有一个 StackOverflow 问题和答案,并有无数人对此表示赞同,但我没有找到。
      【解决方案5】:

      在对对象文字属性使用保留字时遇到了问题。它在 Firefox 和 Safari 中运行良好,但在 IE 中运行良好。这是我经常绊倒的一个:

      {
          class : 'my-css-class'
      }
      

      这是我首先要检查的。 YMMV。

      【讨论】:

        【解决方案6】:

        IE 和 ajax 的两个常见问题如下:

        • 缓存(可以在上面找到解决方案)
        • 空白!! (如果您的返回在 json 输出之前/之后有任何空格,这将在 IE 7 中失败)

        【讨论】:

          【解决方案7】:

          我在 IE 8 上遇到了同样的问题。解决方案是简单地使用 ajaxSetup 关闭缓存

          $.ajaxSetup({
          cache : false});
          

          非常烦人,因为这在 FF 和 Chrome 中运行良好。

          【讨论】:

            【解决方案8】:

            在 IE 中,您必须包含 json2.js 库,因为 IE 没有原生 JSON 解析。但 Firefox 和 Chrome 有。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-22
              • 2012-02-09
              • 2012-07-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多