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

Can3170

Пользователь
Регистрация
14.02.13
Сообщения
17
Реакции
2
Баллы
3
Я использую 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-код:
Гиперссылку невозможно щелкнуть во время работы сценария jQuery.
$(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: Что делать?
 

Kirill3

Пользователь
Регистрация
09.07.14
Сообщения
4
Реакции
0
Баллы
1
Я бы попытался сделать это как один AJAX-запрос, а затем зациклить результат, чтобы подключить его там, где это необходимо... снова в этот момент, используя DOM, а не методологию стиля InnerHTML.

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

На самом деле все будет зависеть от того, насколько вы контролируете то, что выводит сервер, с которого вы извлекаете данные. О CSS есть старая поговорка, согласно которой таблица стилей хороша настолько, насколько хорош HTML, к которому она применена. Точно так же и вызов AJAX хорош настолько, насколько хорош то, что ему передает сервер. Чем меньше у вас контроля над выводом сервера и чем больше вывод сервера без причины (например, создание результата в формате HTML), тем менее эффективным будет ваш код на стороне клиента.

Отстой, да?

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

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

andr_b_a

Пользователь
Регистрация
20.12.10
Сообщения
2
Реакции
0
Баллы
1
Спасибо, отличная информация! Я только изучаю jQuery и всегда по возможности избегал использования JavaScript, но теперь мне действительно приходится его использовать. Я еще раз прочитаю все ваши ответы, подумаю над вашими словами и снова попробую программировать. Еще раз спасибо!

Всего наилучшего,
xms
 

loogle

Пользователь
Регистрация
03.12.14
Сообщения
2
Реакции
0
Баллы
1
Если отбросить тот факт, что вы полагаетесь на раздутый медленный поезд некомпетентности разработчика, которым является 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.
 

romangorohov

Пользователь
Регистрация
02.04.14
Сообщения
3
Реакции
0
Баллы
1
Либо переместите ссылки за пределы обновляемого контейнера-div, либо переосмыслите, как вы выполняете обновление/обновление, потому что в нынешнем виде этих ссылок даже не должно быть там, если они не являются частью данных, которые вы обновляете. повторная выборка - если да, то вам чертовски не повезло, потому что это требует времени, а перезапись DOM не выполняется до тех пор, пока не будет обновлен весь код. Если ссылки постоянные, просто переместите их за пределы контейнера или создайте другой внутренний контейнер для обновленного HTML.
 
Сверху Снизу