Проблема с событиями на странице AJAX-Heavy - PullRequest
1 голос
/ 09 декабря 2008

У меня есть страница asp, которая использует jQuery ajax для загрузки количества участников в группу div s после загрузки страницы.

Он отлично работает в FireFox и с клиентами с небольшим количеством групп.

Для небольшого числа клиентов, которые имеют много групп (500+), я получаю сообщение об ошибке в IE. Кажется, что вызовы ajax выполняются синхронно, поскольку события click не будут регистрироваться, пока не будет возвращен каждый вызов ajax.

Для большинства клиентов серия ajax-запросов - это всего лишь 1 запрос. Он разбит только на несколько запросов для клиентов с ОЧЕНЬ большим количеством групп.

Теперь я видел ошибку, в которой функции $("a").click не связаны, если ссылки добавляются после загрузки DOM. Не работающие ссылки не загружаются AJAX, они не попадают в эту категорию.

Вот псевдокод:

ready()
{
    // count the number of groups that this user has, adding the ids to a list
    if( count < 50 )
    {
        runAjax();
    }
    else
    {
        // this calls the ajax request on groups of 50 ids
        // it pauses briefly after each request by using setTimeout to call the next
        runAjaxRecursively();
    }
}

А вот запрос ajax:

// run the HTTPRequest
$.ajax({
    async: true,
    type: "POST",
    url: "emailcatcount.asp?idList="+idList,
    data: "idList="+idList,
    dataType: "html",
    success: function(html) { // blah blah blah }
});

В любом случае, код работает нормально, поэтому, пожалуйста, рассматривайте любые ошибки как опечатки. Единственная проблема заключается в том, что в IE события click не будут срабатывать, пока не будет возвращен каждый вызов ajax.

Кто-нибудь знает, почему это произошло? Обратите внимание, что я устанавливаю async в true.

Это как-то связано с обработкой события готовности jQuery в IE?

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

Ответы [ 2 ]

1 голос
/ 10 декабря 2008

Функция успеха обновляет содержимое таблицы? IE рендеринг больших таблиц довольно ужасен.

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

Ваша проблема в том, что вы не предоставляете браузеру время, попробуйте добавить в setcimeout небольшой рекурсивный цикл, чтобы дать браузеру время для обработки других событий, помните, что у вас есть только один поток для игры. Лучше всего сделать один вызов и использовать jtemplates вместе с json для обработки данных и рендеринга разметки, а не для возврата тяжелого html.

Также ошибка, на которую вы ссылаетесь, не является ошибкой, jQuery связывает обработчики только для элементов, которые существуют в то время. Если у вас есть динамический контент, вам лучше использовать делегирование событий для обработки событий щелчка динамических элементов. Таким образом, вы не привязываете явно каждый элемент, а привязываете событие click к статическому контейнеру. Затем вы можете запросить event.target, чтобы узнать, был ли это один из ваших желаемых элементов, вызвавших событие, и, если это так, обработать желаемое поведение. Преимущество заключается в том, что вы не обременяете дом несколькими связанными событиями и динамическим контентом.

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