Структура JSON не работает в IE7 (JavaScript) - PullRequest
2 голосов
/ 26 февраля 2009

Хорошо, я новичок в JSON, поэтому, пожалуйста, прости меня, если мой вопрос немного неосведомлен - я слишком сильно ударился головой о стену и мне нужен совет специалиста.

Я пытаюсь получить простой пример работы, где HTML-страница использует JSON / AJAX-функции jQuery для вызова примера PHP-страницы, которая передает простую структуру данных JSON, а затем страница использует jQuery для написания одного из элементы из структуры данных на страницу. Работает в ФФ. Не работает в 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]. ФФ справляется с этим просто отлично. IE7 говорит, что не определено.

Что я делаю не так? Как мне передать 2-й массив, как это

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

над JSON / AJAX? Или это невозможно?

Ответы [ 8 ]

7 голосов
/ 26 февраля 2009

ОК, разобрался. Это была не проблема JSON / JavaScript, а проблема кэширования . Когда я разрабатывал это, я должен был сначала протестировать IE7, когда test-ajax.php не работал или создавал другую структуру JSON, а затем я изменил 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 правильно проверяет сервер на наличие новой версии test-ajax.php при вызове AJAX.

Спасибо всем!

1 голос
/ 09 декабря 2011

В IE вы должны включить библиотеку json2.js, поскольку IE не имеет собственного анализа JSON. Но у Firefox & Chrome есть.

1 голос
/ 30 июля 2011

У меня была та же проблема с IE 8. Решением было просто отключить кеширование с помощью ajaxSetup

$.ajaxSetup({
cache : false});

Очень раздражает, потому что это хорошо работает в FF и Chrome.

1 голос
/ 24 сентября 2010

Две общие проблемы с IE и ajax:

  • кэширование (решение можно найти выше)
  • пустое пространство !! (если ваш возврат имеет пробел до / после вывода json, в IE 7 это не получится)
1 голос
/ 26 февраля 2009

Я сразу не вижу ничего плохого, но вот некоторые вещи, которые нужно попробовать

  1. Получить Чарльз . Посмотрите на запрос / ответ от вызова getJSON (). Контент возвращается как ожидается? Код статуса ответа 200 или что-то еще?
  2. Определите, знает ли IE вообще о переменной json. Измените свой код, чтобы попробовать что-то вроде этого

(вероятно, хотите запускать эти оповещения только по одному за раз)

$.getJSON("test-ajax.php", function(json){
  alert( typeof json );
  alert( typeof json.var1 );
  alert( typeof json.var1[1] );
});
1 голос
/ 26 февраля 2009

Попробуйте добавить следующую строку в конец файла test-ajax.php:

echo ';';
0 голосов
/ 04 марта 2009

У меня возникли проблемы при использовании зарезервированных слов для литеральных свойств объекта. Он отлично работает в Firefox и Safari, но бомбы в IE. Вот тот, который обычно сбивает меня с толку:

{
    class : 'my-css-class'
}

Это то, что я бы проверил в первую очередь. YMMV.

0 голосов
/ 26 февраля 2009

Получаете ли вы те же результаты, если пытаетесь получить доступ к такому значению?

json["var1"][1]

... вместо этого:

json.var1[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...