Работаете в FF, Chrome, но не в IE?В чем дело? - PullRequest
0 голосов
/ 12 мая 2011

Мой партнер создал сценарий, но сейчас он не в сети, поэтому я пытаюсь это исправить самостоятельно.

Вот код, который у нас сейчас есть:

function progressStatus(Progress) {

    // Get our progress status
    $.get('http://www.site.com/progress/'+Progress, { }, function (response) {

        // Eval our response
        eval(response);
    });
}

и затем на нашей странице мы имеем:

// Start our status checking
var Progress = $('#Progress').val();
ProgressStatus = setInterval('progressStatus("'+Progress+'")', 1000);

Он отлично работает в Firefox, Chrome, все, что я могу предположить, это зацикливание и получение нового статуса в Firefox, Chrome, но в IE он только пингует ход выполнения, а затем ничего не делает.

Что не так с этим? Я не уверен, нужен ли еще какой-либо код, если это так, я отредактирую свой вопрос с помощью большего количества кода.

Спасибо.

Ответы [ 6 ]

2 голосов
/ 12 мая 2011

Трудно сказать без значения response и без дополнительного контекста.Что говорит консоль?Есть ли ошибки?

Кроме того, почему вы не получаете данные с сервера, а затем анализируете данные и соответственно реагируете, что, помимо прочих преимуществ (таких как хранение клиентского кода в одном месте и принудительная структура),делает случаи отладки как это намного проще?Гораздо лучше, чем eval, и просто полагать, что все, что вернется, знает, как обрабатывать себя.

Также хорошей практикой является сохранение вашего javascript в javascript, а не строк, которые будут оцениваться.Так что вместо setInterval есть анонимная функция:

ProgressStatus = setInterval(function(){
  progressStatus( $('#Progress').val() );
}, 1000);
1 голос
/ 12 мая 2011

Я думаю, проблема в кеше в IE.По большей части IE будет кешироваться по умолчанию в настройках.

Вы должны добавить одно случайное число в конце, надеюсь, оно полностью будет работать.

function progressStatus(Progress) {

// Get our progress status
$.get('http://www.site.com/progress/'+Progress + "/rnd/" + Math.random(), { }, function (response) {

    // Eval our response
    eval(response);
});

}

Вам нужносправиться с любой проблемой перезаписи URL.

1 голос
/ 12 мая 2011

Поскольку для setInterval нет стандарта, результат подачи строки в качестве первого параметра может отличаться в разных браузерах.Как MDC говорит :

code в альтернативном синтаксисе, это строка кода, которую вы хотите выполнять повторно.

Этоповедение Firefox и Chrome демонстрирует.

С другой стороны, IE, вероятно, анализирует строку один раз и выполняет ее несколько раз.Это немного оптимизирует, но ваша функция будет вызываться с одним и тем же параметром каждый раз.

Более того, чтобы снова заключить MDC в кавычки

(Использование этого синтаксиса не рекомендуется дляте же причины, что и при использовании eval () )

Решение состоит в том, чтобы прочитать состояние Progress в функции, которая вызывается повторно:

function progressStatus() {

    var Progress = $('#Progress').val();

    // Get our progress status
    $.get('http://www.site.com/progress/'+Progress, { }, function (response) {
                                     //   ↑ don't!
        // Eval our response
        eval(response);  // don't!
    });
}

Таким образом, вы можете просто позвонить

setInterval(progressStatus, 1000);

Но опять же, используя изменяемое пользователем поле ввода в URL (Progress) и eval для анализа (?) Ответа без какой-либо проверки: очень небезопасно .Вам, вероятно, следует использовать переменную внутри замыкания для maintian Progress (кроме показа ее пользователю).

1 голос
/ 12 мая 2011

не работает значит ни о чем. В будущем, пожалуйста, дайте более подробную информацию о том, что не работает означает. Я собираюсь предположить, что это означает, что он никогда не обновляет новый статус в запросе get и продолжает захватывать старый.

Нужно прекратить кеширование

$.ajax({
  url: "http://www.site.com/progress/"+Progress,
  cache: false,
  success: function (response) {
        // Evil Eval our response
        eval(response);
    }
});
0 голосов
/ 12 мая 2011

Есть ли конкретная причина для "" прогресса в вашем setInterval? Javascript не заботится о типах ..

Попробуйте

ProgressStatus = setInterval(function(){ progressStatus(Progress); }, 1000);

IMO, это красивее и более читабельно, но не знаю, решит ли это вашу проблему:)

0 голосов
/ 12 мая 2011

Я думаю, вам нужно отредактировать второй код следующим образом:

$(document).ready(function(){

var Progress = $('#Progress').val();
ProgressStatus = setInterval('progressStatus("'+Progress+'")', 1000);

}

Так может быть. Попробуйте это, если полезно. Я не очень осведомлен о jQuery, но это было бы решением, если я не ошибаюсь.

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