Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Необходимость alert перед функцией (https://javascript.ru/forum/jquery/52003-neobkhodimost-alert-pered-funkciejj.html)

kyt 29.11.2014 18:58

Необходимость alert перед функцией
 
Добрый вечер!
Хочу разобраться. У меня есть такая конструкция:
$(document).ready(function() {
.....
.....
alert ('Красим ячейки!');
	   	$('#my_table td:nth-child(28)').each(function() {
			if(this.innerHTML=='1'){
			$(this).closest("tr").addClass("activ");
			}
			
			
		});
.....

Так работает, а если закомментировать alert
//alert ('Красим ячейки!');

то не работает.
Можете, пожалуйста, пояснить в чем тут дело?

bes 29.11.2014 22:39

где тестовый пример

рони 29.11.2014 23:15

kyt,
или
$(window).load
или
$('#my_table tr').each(function() {var text = $('td', this).eq(28).text();
if(text == '1') $(this).addClass("activ");

kyt 30.11.2014 00:29

Спасибо за интерес bes.
Он (пример) 946 строк. Я могу выложить. Но сначала:
1. Просто сюда как код положить?
2. Вы правда готовы все это просмотреть и откомментировать? Если да, то я с удовольствием это сделаю.

рони 30.11.2014 00:33

Цитата:

Сообщение от kyt
Просто сюда как код положить?

Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

kyt 30.11.2014 00:34

рони, не вполне понял Ваш ответ. Особенно его первую часть.
Щас погуглю, может пойму)
Спасибо Вам за ответ.

bes 30.11.2014 00:34

Цитата:

Сообщение от kyt
Он (пример) 946 строк. Я могу выложить. Но сначала:
1. Просто сюда как код положить?
2. Вы правда готовы все это просмотреть и откомментировать? Если да, то я с удовольствием это сделаю.

нет, просто надо добавить табличку с 28 ячейками, сложить с твоим кодом и добавить возможность запуска [html run]
http://javascript.ru/formatting

потому как оснований для описанной тобой неработоспособности нет, а экстрасены в отпуске :)

рони 30.11.2014 00:36

Цитата:

Сообщение от kyt
946 строк

то есть локализовать проблему вы не можите ... если в вашем коде нет ajax ... то смотрите пост 3

рони 30.11.2014 00:37

kyt,
вместо $(document).ready напишите $(window).load

bes 30.11.2014 00:40

работает же :)
<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>

kyt 30.11.2014 00:46

bes Так с алертом и у меня работает:)
рони $(window).load - картины не меняет.
С алертом работает.
Без алерта ячейки не красятся. Сейчас проверю Вашу функцию.

bes 30.11.2014 00:47

Цитата:

Сообщение от kyt
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() {
	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>

MallSerg 30.11.2014 00:53

Как это в отпуске???
Все дело в том что ячейки добавляются с помощью JavaScript но уже после того как выполняется код который раскрашивает ячейки.

алерт просто приостанавливает выполнение скрипта и ячейки успевают появится в документе.

kyt 30.11.2014 00:55

bes, Вы правы у Вас работает и у меня Ваш пример работает. И с алертом и без. А мой не работает. Попробую его локализовать.

bes 30.11.2014 00:56

Цитата:

Сообщение от MallSerg
Как это в отпуске???
Все дело в том что ячейки добавляются с помощью JavaScript но уже после того как выполняется код который раскрашивает ячейки.

алерт просто приостанавливает выполнение скрипта и ячейки успевают появится в документе.

а $(document).ready тогда к чему, если предположить, что он таблицу нарисовал позже скрипта и не при помощи js

bes 30.11.2014 01:02

так, естественно, не работает, но и ячейки раньше времени не появляются
<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>

bes 30.11.2014 01:02

Цитата:

Сообщение от kyt
bes, Вы правы у Вас работает и у меня Ваш пример работает. И с алертом и без. А мой не работает. Попробую его локализовать.

в консоли ошибок нет?

kyt 30.11.2014 01:02

Я думаю заменить alert на setTimeout. Я о том думаю?

kyt 30.11.2014 01:03

bes ошибок в консоли нет

bes 30.11.2014 01:04

выложи на http://jsfiddle.net/ или http://learn.javascript.ru/play

kyt 30.11.2014 01:07

Замена alert на setTimeout(function() { }, 500) проблемы не решает.
Ошибок нет, ячейки не крашеные

bes 30.11.2014 01:09

MallSerg, я понял твою мысль, убирает alert, ячейки есть, но не красятся
Цитата:

Сообщение от kyt
Замена alert на setTimeout(function() { }, 500) проблемы не решает.
Ошибок нет, ячейки не крашеные

скриптом таблицу создаёшь?

kyt 30.11.2014 01:15

Ссылка вот. http://learn.javascript.ru/play/QuAc8b Аякс и css не прилетели. Пилено из http://www.datatables.net/.
Представляю немного моего js-прона)

kyt 30.11.2014 01:17

Ну да, Аяксом из базы тяну.

kyt 30.11.2014 01:28

Еще наблюдение:
setTimeout(function() {alert('trtrt'); }, 500);

вместо alert ячейки не красит.

bes 30.11.2014 01:30

Цитата:

Сообщение от kyt
Ну да, Аяксом из базы тяну.

раскраску в success делаешь?
не нахожу пока там в документации события готовности таблицы к работе, то есть когда данные уже подтянуты и помещены в ячейки

bes 30.11.2014 01:34

вот так наверное делать нужно, помещая код раскраски в callback-функцию
http://datatables.net/reference/option/ajax
Цитата:

function ajax( data, callback, settings )
Description:
As a function, making the Ajax call is left up to yourself allowing complete control of the Ajax request. Indeed, if desired, a method other than Ajax could be used to obtain the required data, such as Web storage or an AIR database.

When the data has been obtained from the data source, the second parameter (callback here) should be called with a single parameter passed in - the data to use to draw the table.

Simple example:

?
1
2
3
4
5
6
7
$('#example').dataTable( {
"ajax": function (data, callback, settings) {
callback(
JSON.parse( localStorage.getItem('dataTablesData') )
);
}
} );

kyt 30.11.2014 01:44

Не вполне Вас понял. Сначала мне придется сообразить что есть "...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.

bes 30.11.2014 01:48

Цитата:

Сообщение от kyt
е вполне Вас понял. Сначала мне придется сообразить что есть "...callback-функцию" и " ...в success делаешь?".

тут надо прерваться и почитать как работает ajax и осознать слово "асинхронность"
alert тебе тормозит выполнение кода, за это время данные уже подтягиваются и твоё сравнение в if срабатывает, а пока не подтянулись, сравнивать не с чем

kyt 30.11.2014 01:53

Вы правы. Читать уже начал. Большое Вам спасибо!
Последний вопрос. А в чем тогда проблема setTimeout? Почему он не работает?

MallSerg 30.11.2014 01:57

по тому что setTimeout это функция
т.е. то что ты пишешь в скобках это параметры этой функции они вычисляются в момент вызова данной функции
вызов функции ни как не тормозит выполнения кода просто когда то в далеком будущем наступит событие timeout
и будет выполнен первый параметр функции setTimeout

bes 30.11.2014 09:25

Цитата:

Сообщение от MallSerg
по тому что setTimeout это функция
т.е. то что ты пишешь в скобках это параметры этой функции они вычисляются в момент вызова данной функции
вызов функции ни как не тормозит выполнения кода просто когда то в далеком будущем наступит событие timeout
и будет выполнен первый параметр функции setTimeout

я правильно понял, что ты утверждаешь, что первый параметр setTimeout, то есть func или code из цитаты ниже будет вычислен в момент вызова setTimeout?

но всё это рушится по описанию ниже
https://developer.mozilla.org/en-US/...ers.setTimeout
Цитата:

Calls a function or executes a code snippet after a specified delay.

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); var timeoutID = window.setTimeout(code, delay);
и при простейшей проверке с регулировкой delay


Цитата:

Сообщение от kyt
А в чем тогда проблема setTimeout?

Цитата:

Сообщение от kyt
Замена alert на setTimeout(function() { }, 500) проблемы не решает.
Ошибок нет, ячейки не крашеные

должно решать, если ты сделаешь хотя бы так
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
и надеюсь теперь ты понимаешь, насколько ущербен твой исходный пост :)

MallSerg 30.11.2014 11:05

Цитата:

Сообщение от bes
я правильно понял, что ты утверждаешь, что первый параметр setTimeout, то есть func или code из цитаты ниже будет вычислен в момент вызова setTimeout?

Попытаюсь объяснить совсем на пальцах
небольшой пример «setTimeout ( a + b , 100 )»
это вызов функции в котором первым параметром идет JS выражение и оно будет вычислено еще до вызова функции
В случае «setTimeout ( function () {} , 100 )» первым параметром тоже идет выражение и оно так же будет вычислено (интерпретировано) до вызова setTimeout результатом вычисления данного выражения будет функция
т.е. по пунктам:
1. вычисляется выражение JS (выражение возвращает безыменную функцию)
2. происходит вызов setTimeout
3. наступает событие timeout в котором происходит вызов безымянной функции

kyt 30.11.2014 12:30

Загадка разрешилась именно так как сказал bes.
Там долго тянулись данные из Ajax, потом перестраивалась таблица...
Была найдена функция
fnCreatedRow http://legacy.datatables.net/usage/callbacks и все заработало без alert.
Остается вопрос про setTimeout.
Мне не удалось адекватно запустить http://datatables.net/reference/option/ajax Если кто-то возьмется мне это пояснить за разумную мзду. Пожалуйста, напишите мне.

kyt 30.11.2014 12:32

Оп, не обновил

kyt 30.11.2014 12:43

Цитата:

Сообщение от bes (Сообщение 343537)
а в целом, это элементарные действия по тестированию нерабочего кода (убрать лишнее, наалертить/наконсольлогить), поэтому прочти и это http://javascript.ru/forum/site/4917...u-zapuska.html
и надеюсь теперь ты понимаешь, насколько ущербен твой исходный пост :)

Ну да, понимаю. И раскаиваюсь:)
Если бы я сразу сообразил как эту штуку локализовать и выложить, так бы и сделал.
Буду учить мат. часть и писать неущербные посты.

bes 30.11.2014 12:54

Цитата:

Сообщение от kyt
Мне не удалось адекватно запустить http://datatables.net/reference/option/ajax Если кто-то возьмется мне это пояснить за разумную мзду. Пожалуйста, напишите мне.

сейчас, только дочитаю :D

http://datatables.net/reference/option/ajax
Цитата:

function ajax( data, callback, settings )
Description:
As a function, making the Ajax call is left up to yourself allowing complete control of the Ajax request. Indeed, if desired, a method other than Ajax could be used to obtain the required data, such as Web storage or an AIR database.

When the data has been obtained from the data source, the second parameter (callback here) should be called with a single parameter passed in - the data to use to draw the table.
в этом случае, как и написано, ты полностью берёшь контроль по отправке запроса за данными и обработки их при получении, всё остальное дело практики


Цитата:

Сообщение от kyt
Остается вопрос про setTimeout.

в чём он?

kyt 30.11.2014 12:57

Цитата:

Сообщение от bes (Сообщение 343558)
в чём он?

Нет уже этого вопроса, не обновил страницу, когда писал ответ.

bes 30.11.2014 12:58

Цитата:

Сообщение от kyt
Была найдена функция
fnCreatedRow http://legacy.datatables.net/usage/callbacks и все заработало без alert.

ах вот где они :)
на мой взляд, представление документации на их сайте страдает, хотя бы потому что на usage не выйдешь из меню на главной странице http://datatables.net/
а надо ещё каким-то образом добраться до http://legacy.datatables.net/

bes 30.11.2014 13:01

вообще ж-па :)

http://datatables.net/manual/index
маленькими буквами
Цитата:

Version information:
The documentation here is for DataTables 1.10 and newer. Documentation for earlier versions of DataTables is available on the legacy site, although it is recommended you upgrade where possible.


Часовой пояс GMT +3, время: 16:44.