Гиперссылку невозможно щелкнуть во время работы сценария jQuery.

  • Автор темы Can3170
  • 62
  • Обновлено
  • 13, May 2024
  • #1
Я использую Internet Explorer 11 и Mozilla Firefox 51.0.1. Почему я не могу щелкнуть гиперссылку во время работы сценария jQuery? Я запускаю код каждые 5 секунд.

Код заменит HTML-код элемента div.

В HTML-коде сотни строк, и все это занимает несколько секунд.

Ссылку можно щелкнуть до и после, но не во время выполнения скрипта.
 <div id="bio">

<a href="go.html">Link 1</a>, <a href="yo.html">link 2</a>,

and other HTML code, hundreds of rows...
</div>
Код (JavaScript): А вот HTML-код:

 $(document).ready(function() { get_bio_data = function() { var bio = 106; jQuery.post("get_bio.php", { bio: bio }).done(function(data) { $('#bio').html(data); }); }; setInterval(get_bio_data, 5000); });
HTML: Что делать?

Can3170


Рег
14 Feb, 2013

Тем
2

Постов
14

Баллов
34
  • 31, May 2024
  • #2
Я бы попытался сделать это как один AJAX-запрос, а затем зациклить результат, чтобы подключить его там, где это необходимо.

снова в этот момент, используя DOM, а не методологию стиля InnerHTML. Однако вы можете запускать несколько запросов AJAX одновременно с разными обработчиками результатов для каждого, но это неоправданно увеличивает нагрузку на ваш сервер из-за большего количества подключений.

Это также может привести к увеличению количества экземпляров синтаксического анализа и увеличению количества рендеров, вызывающих повышенную загрузку ЦП без уважительной причины.

На самом деле все будет зависеть от того, насколько вы контролируете то, что выводит сервер, с которого вы извлекаете данные.

О CSS есть старая поговорка, согласно которой таблица стилей хороша настолько, насколько хорош HTML, к которому она применена.

Точно так же и вызов AJAX хорош настолько, насколько хорош то, что ему передает сервер.

Чем меньше у вас контроля над выводом сервера и чем больше вывод сервера без причины (например, создание результата в формате HTML), тем менее эффективным будет ваш код на стороне клиента.

Отстой, да?

Бывают случаи, когда это немного похоже на ассемблер — где часто «развертывание цикла» и использование большего количества кода на самом деле происходит быстрее.



Таким образом, создание DOM вручную и подключение значений может потребовать НАМНОГО больше JavaScript для написания (хотя создание вспомогательных функций для конкретных заданий может уменьшить это), но это может означать меньше данных, которые передает вызов AJAX, что означает меньшую общую пропускную способность и более простой сервер кода.



-сторона. ... и одна из причин использования AJAX — разгрузка работы на стороне клиента.
 

Kirill3


Рег
09 Jul, 2014

Тем
1

Постов
5

Баллов
15
  • 04, Jun 2024
  • #3
Спасибо, отличная информация! Я только изучаю jQuery и всегда по возможности избегал использования JavaScript, но теперь мне действительно приходится его использовать.

Я еще раз прочитаю все ваши ответы, подумаю над вашими словами и снова попробую программировать.

Еще раз спасибо! Всего наилучшего, xms
 

andr_b_a


Рег
20 Dec, 2010

Тем
1

Постов
2

Баллов
12
  • 04, Jun 2024
  • #4
Если отбросить тот факт, что вы полагаетесь на раздутый медленный поезд некомпетентности разработчика, которым является jQuery, оставшаяся часть вашей проблемы состоит в том, что вы передаете HTML с сервера вместо просто ДАННЫХ, а затем используете внутренний HTML посредством jQuery.

идиотская, тупая, невежественная чушь, обертка "$.HTML".



Каждый раз, когда вы используете InnerHTML или, что еще хуже, бессмысленную тупую обертку мусора jQuery, браузер должен передать ВСЮ DOM в обратный анализатор только для того, чтобы перестроить ВЕСЬ документ, чтобы можно было вставить разметку, сохраняя при этом любые другие изменения, внесенные JavaScript, а также для анализа любых новых открытий/закрытий, которые могут быть добавлены, а затем повторного анализа этого нового HTML в новый DOM, который затем необходимо отобразить.



Это полдюжины или более шагов, которые браузер должен предпринять, что, по сути, отправляет его в «никогда-никогда».

Вот почему в тот момент, когда вы видите что-то вроде этого:

document.getElementById('bio').innerHTML = x.responseText;

или его бессмысленно избыточный эквивалент jQuery.

$('#био').html(данные);

Вы можете гарантировать, что 1) оно будет работать медленно и препятствовать навигации по всей странице во время обновления.

2) человек, написавший это, вероятно, недостаточно знает HTML, CSS или JavaScript, чтобы писать JavaScript, и 3 ) серверный код также не является победителем, поскольку он удаляет разметку вместо того, чтобы просто отправлять данные в более разумном формате, таком как CSV, JSON или даже XML.

Что, вероятно, СЛЕДУЕТ сделать, так это создать новую разметку с использованием DOM, вообще минуя этап синтаксического анализа, но это означает, что нужно переписать все, что выпадает из серверного кода.

Я не уверен, что jQuery справится с этим, но если вы работали с ванильным JavaScript, вы МОЖЕТЕ избежать НЕКОТОРЫХ проблем, создав новый DIV, добавив в него данные через внутренний HTML, а затем выполнив родительскийNode.replace для полностью замените DIV.

Это позволяет парсеру работать с DIV вне живого DOM, а это значит, что весь документ не нужно анализировать повторно, и документ остается активным до окончательной замены.

Это не ПРАВИЛЬНОЕ исправление, но этого может быть достаточно. Предполагая, что существует НАДЛЕЖАЩИЙ XMLHttpRequest или эквивалент ActiveX с нормализованным параметром обратного вызова, vanilla.js для этого будет выглядеть примерно так:
 

_.eventAdd(window, 'load', function() {

var oldBio = _d.getElementById(bioDiv);

function getBioData() {

_.ajax({

status : {

'200' : function(x) {

var newBio = _.make('#bio', { innerHTML : x.ResponseText });

oldBio.parentNode.replaceChild(newBio, oldBio);

oldBio = newBio;

setTimeout(getBioData, 5000);

}

},

request : { 'post', 'get_bio.php', 'bio=106' }

});

}

});

Код (разметка): Выполнив внутреннийHTML до мы помещаем его в действующий DOM, полностью заменяя исходный DIV, мы не заставляем браузер анализировать весь DOM. Существует также проблема, заключающаяся в том, что вы устанавливаете интервал для регулярного вызова, а это означает, что вы МОЖЕТЕ получить стек событий.



НИКОГДА не устанавливайте интервал AJAX-запроса, устанавливайте новый тайм-аут только тогда, когда вы ЗНАЕТЕ, что существующий завершился! Это занимает больше пяти секунд, теперь у вас есть несколько запросов в канале, накладывающих друг на друга, чтобы запускаться «когда это возможно», пока вы по сути не подвергнетесь DDOS-атаке!

Если бы вы использовали мою библиотеку elementals.js, полное переписывание того, что вы делаете, выглядело бы примерно так:

  function xBio400(x) { var oldBio = document.getElementById('bio'), newBio = document.createElement('div'); newBio.id = 'bio'; newBio.innerHTML = x.responseText; oldBio.parentNode.replaceChild(newBio, oldBio); } 
Код (разметка): Хотя это дает мне представление о новом типе атрибута размещения.

«заменить». Тем не менее, то, как вы передаете данные (в виде готового HTML) и как вы используете постоянный интервал, — это то, что здесь действительно является ошибкой.

Вам действительно следует передавать ТОЛЬКО данные, а не разметку, а затем использовать DOM, используя document.createElement и document.createTextNode.
 

loogle


Рег
03 Dec, 2014

Тем
1

Постов
2

Баллов
12
  • 06, Jun 2024
  • #5
Либо переместите ссылки за пределы обновляемого контейнера-div, либо переосмыслите, как вы выполняете обновление/обновление, потому что в нынешнем виде этих ссылок даже не должно быть там, если они не являются частью данных, которые вы обновляете.

повторная выборка - если да, то вам чертовски не повезло, потому что это требует времени, а перезапись DOM не выполняется до тех пор, пока не будет обновлен весь код.

Если ссылки постоянные, просто переместите их за пределы контейнера или создайте другой внутренний контейнер для обновленного HTML.
 

romangorohov


Рег
02 Apr, 2014

Тем
1

Постов
3

Баллов
13
  • 13, Jun 2024
  • #6
Я бы вырвал JavaScript за яйца и выполнил загрузку страницы.

Такое количество div и такое количество запросов не имеют никакого отношения к ВЕБ-САЙТУ.

В противном случае я бы отправил данные в виде одного запроса с правильным форматированием на стороне сервера (разделитель ASCII, CSV, JSON, XML) и построил их с использованием DOM вместо внутреннего HTML.

Таким образом, вы отправляете только данные, а не разметку.

В этом отношении XML был бы плохим выбором, если бы не тот факт, что AJAX уже анализирует его в XMLDom, по которому вы можете перемещаться и работать с ним.

МОЖЕТ также быть полезно вместо этого переключиться на веб-сокеты и вместо постоянного опроса заставить сервер выполнять push-уведомление, чтобы на стороне клиента отправлялись только МОДИФИЦИРОВАННЫЕ данные.

Это гораздо сложнее, но, учитывая объем данных, который звучит так, как будто вы говорите (то есть слишком много для одной страницы), это уменьшит потребляемую полосу пропускания и объем работы, которую придется обрабатывать серверу. ХОТЯ.

это я размышляю и говорю со своими инстинктами.

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

Если бы я мог увидеть образец того, что отправляется с сервера для одного из них - как в РЕАЛЬНОМ образце РЕАЛЬНЫХ данных - я, вероятно, мог бы дать лучший ответ.

для тебя.
 

серега13


Рег
16 Oct, 2012

Тем
0

Постов
3

Баллов
3
Тем
49554
Комментарии
57426
Опыт
552966

Интересно