2008-12-08 2 views
1

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

Он отлично работает в 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(); 
    } 
} 

А вот запрос Аякса:

// 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?

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

ответ

1

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

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

+0

Я уже делаю это. –

+0

Жаль, что этого не было в моем псевдокоде, я добавлю его –

+0

как насчет вызова json и 1 ajax :) – redsquare

1

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

Смежные вопросы