Необходимость alert перед функцией
Добрый вечер!
Хочу разобраться. У меня есть такая конструкция: $(document).ready(function() { ..... ..... alert ('Красим ячейки!'); $('#my_table td:nth-child(28)').each(function() { if(this.innerHTML=='1'){ $(this).closest("tr").addClass("activ"); } }); ..... Так работает, а если закомментировать alert //alert ('Красим ячейки!'); то не работает. Можете, пожалуйста, пояснить в чем тут дело? |
где тестовый пример
|
kyt,
или $(window).loadили $('#my_table tr').each(function() {var text = $('td', this).eq(28).text(); if(text == '1') $(this).addClass("activ"); |
Спасибо за интерес bes.
Он (пример) 946 строк. Я могу выложить. Но сначала: 1. Просто сюда как код положить? 2. Вы правда готовы все это просмотреть и откомментировать? Если да, то я с удовольствием это сделаю. |
Цитата:
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
рони, не вполне понял Ваш ответ. Особенно его первую часть.
Щас погуглю, может пойму) Спасибо Вам за ответ. |
Цитата:
http://javascript.ru/formatting потому как оснований для описанной тобой неработоспособности нет, а экстрасены в отпуске :) |
Цитата:
|
kyt,
вместо $(document).ready напишите $(window).load |
работает же :)
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <style> td { border: solid 1px; } .active { background: green } </style> <div class="table"></div> <script> $(document).ready(function() { var str = "<table id='my_table'><tr>"; for (var i = 1; i < 28; i++) { str += "<td>" + i + "</td>"; } str += "<td>1</td></tr></table>"; document.querySelector(".table").innerHTML = str; alert ('Красим ячейки!'); $('#my_table td:nth-child(28)').each(function () { if(this.innerHTML == '1') { $(this).closest("tr").addClass("active"); } }); }); </script> |
bes Так с алертом и у меня работает:)
рони $(window).load - картины не меняет. С алертом работает. Без алерта ячейки не красятся. Сейчас проверю Вашу функцию. |
Цитата:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <style> td { border: solid 1px; } .active { background: green; } </style> <div class="table"></div> <script> $(document).ready(function() { var str = "<table id='my_table'><tr>"; for (var i = 1; i < 28; i++) { str += "<td>" + i + "</td>"; } str += "<td>1</td></tr></table>"; document.querySelector(".table").innerHTML = str; //alert ('Красим ячейки!'); $('#my_table td:nth-child(28)').each(function () { if(this.innerHTML == '1') { $(this).closest("tr").addClass("active"); } }); }); </script> |
Как это в отпуске???
Все дело в том что ячейки добавляются с помощью JavaScript но уже после того как выполняется код который раскрашивает ячейки. алерт просто приостанавливает выполнение скрипта и ячейки успевают появится в документе. |
bes, Вы правы у Вас работает и у меня Ваш пример работает. И с алертом и без. А мой не работает. Попробую его локализовать.
|
Цитата:
|
так, естественно, не работает, но и ячейки раньше времени не появляются
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <style> td { border: solid 1px; } .active { background: green; } </style> <div class="table"></div> <script> $(document).ready(function() { alert ('Красим ячейки!'); $('#my_table td:nth-child(28)').each(function () { if(this.innerHTML == '1') { $(this).closest("tr").addClass("active"); } }); var str = "<table id='my_table'><tr>"; for (var i = 1; i < 28; i++) { str += "<td>" + i + "</td>"; } str += "<td>1</td></tr></table>"; document.querySelector(".table").innerHTML = str; }); </script> |
Цитата:
|
Я думаю заменить alert на setTimeout. Я о том думаю?
|
bes ошибок в консоли нет
|
выложи на http://jsfiddle.net/ или http://learn.javascript.ru/play
|
Замена alert на setTimeout(function() { }, 500) проблемы не решает.
Ошибок нет, ячейки не крашеные |
MallSerg, я понял твою мысль, убирает alert, ячейки есть, но не красятся
Цитата:
|
Ссылка вот. http://learn.javascript.ru/play/QuAc8b Аякс и css не прилетели. Пилено из http://www.datatables.net/.
Представляю немного моего js-прона) |
Ну да, Аяксом из базы тяну.
|
Еще наблюдение:
setTimeout(function() {alert('trtrt'); }, 500); вместо alert ячейки не красит. |
Цитата:
не нахожу пока там в документации события готовности таблицы к работе, то есть когда данные уже подтянуты и помещены в ячейки |
вот так наверное делать нужно, помещая код раскраски в callback-функцию
http://datatables.net/reference/option/ajax Цитата:
|
Не вполне Вас понял. Сначала мне придется сообразить что есть "...callback-функцию" и " ...в success делаешь?".
Я пока ковырялся с функцией рони. Заработала такая конструкция $('#my_table tr').each(function() {var text = $('td', this).eq(28).text(); if(text == '0'){ $(this).addClass("activ"); alert ('if'); } else { $(this).addClass("activ"); alert ('else'); } }); Причем только else и c alert. |
Цитата:
alert тебе тормозит выполнение кода, за это время данные уже подтягиваются и твоё сравнение в if срабатывает, а пока не подтянулись, сравнивать не с чем |
Вы правы. Читать уже начал. Большое Вам спасибо!
Последний вопрос. А в чем тогда проблема setTimeout? Почему он не работает? |
по тому что setTimeout это функция
т.е. то что ты пишешь в скобках это параметры этой функции они вычисляются в момент вызова данной функции вызов функции ни как не тормозит выполнения кода просто когда то в далеком будущем наступит событие timeout и будет выполнен первый параметр функции setTimeout |
Цитата:
но всё это рушится по описанию ниже https://developer.mozilla.org/en-US/...ers.setTimeout Цитата:
Цитата:
Цитата:
setTimeout(function () { $('#my_table td:nth-child(28)').each(function () { if(this.innerHTML == '1') { $(this).closest("tr").addClass("active"); } }); },*!*5000*/!*); но сам понимаешь, какое качество кода получится: любая случайная задержка в ответе более N выставленных секунд и твой код перестанет работать чтобы окончательно убедиться можешь добавить console.log и посмотреть перед сравнением какое значение в ячейке $('#my_table td:nth-child(28)').each(function() { console.log(this.innerHTML); if(this.innerHTML=='1'){ а в целом, это элементарные действия по тестированию нерабочего кода (убрать лишнее, наалертить/наконсольлогить), поэтому прочти и это http://javascript.ru/forum/site/4917...u-zapuska.html и надеюсь теперь ты понимаешь, насколько ущербен твой исходный пост :) |
Цитата:
небольшой пример «setTimeout ( a + b , 100 )» это вызов функции в котором первым параметром идет JS выражение и оно будет вычислено еще до вызова функции В случае «setTimeout ( function () {} , 100 )» первым параметром тоже идет выражение и оно так же будет вычислено (интерпретировано) до вызова setTimeout результатом вычисления данного выражения будет функция т.е. по пунктам: 1. вычисляется выражение JS (выражение возвращает безыменную функцию) 2. происходит вызов setTimeout 3. наступает событие timeout в котором происходит вызов безымянной функции |
Загадка разрешилась именно так как сказал bes.
Там долго тянулись данные из Ajax, потом перестраивалась таблица... Была найдена функция fnCreatedRow http://legacy.datatables.net/usage/callbacks и все заработало без alert. Остается вопрос про setTimeout. Мне не удалось адекватно запустить http://datatables.net/reference/option/ajax Если кто-то возьмется мне это пояснить за разумную мзду. Пожалуйста, напишите мне. |
Оп, не обновил
|
Цитата:
Если бы я сразу сообразил как эту штуку локализовать и выложить, так бы и сделал. Буду учить мат. часть и писать неущербные посты. |
Цитата:
http://datatables.net/reference/option/ajax Цитата:
Цитата:
|
Цитата:
|
Цитата:
на мой взляд, представление документации на их сайте страдает, хотя бы потому что на usage не выйдешь из меню на главной странице http://datatables.net/ а надо ещё каким-то образом добраться до http://legacy.datatables.net/ |
вообще ж-па :)
http://datatables.net/manual/index маленькими буквами Цитата:
|
Часовой пояс GMT +3, время: 16:44. |