Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Массовая обработка div'ов (https://javascript.ru/forum/jquery/5160-massovaya-obrabotka-div%27ov.html)

Jaska 21.09.2009 21:44

Массовая обработка div'ов
 
Имеется html-код

<div id="GetString21"><div>
<div id="GetString22"><div>
<div id="GetString23"><div>

мне нужно получить значение id в div'e и отправить post'ом в php-скрипт, результат поместить в этот же тэг и перейти к обработке следущего.

непонятно какую функцию цеплять на $("div") чтобы она поочердно проходила по всем элеметам. буду очень признателен если поможете :)

Gvozd 21.09.2009 21:54

.each(function(){})
перебирет все элементы

Jaska 21.09.2009 23:11

получился такой код:

$(document).ready(function(){
 $("div[id]").each(function(){
  var sID = $(this).attr("id");
  $.post('test.php', {'param': $(this).attr("id")}, function(data) {
   $("div#"+sID+" p").text(data)
   });
 });
});

что-то мне не нравится. пришлось в div'ы добавить тэг p и в него заполнять ответ от php скрипта. если заполнять в этот же тэг то выводится только 1-ый тэг почему то

Octane 21.09.2009 23:21

Замыкания

$(function(){
	$("div[id]").each(function(){
		(function(sID) {
			$.post('test.php', {'param': sID}, function(data) {
				$("div#"+sID+" p").text(data);
			});
		})($(this).attr("id"));
	});
});


Почему не послать на сервер сразу все идентификаторы в одном запросе?

Jaska 22.09.2009 00:00

Спасибо большое, немного неясен код но с этим разберусь. А можно ли как нить сделать чтобы вместе $("div#"+sID+" p") было просто $("div#"+sID)? Потому что при таком раскладе показывается только верхняя строчка

Octane 22.09.2009 00:09

хотя нет, поспешил я, тут лишняя обертка не нужна

$(function(){
    $("div[id]").each(function(){


            var sID = $(this).attr("id");
            $.post('test.php', {'param': sID}, function(data) {
                $("#" + sID).text(data);
            });

    });
});


должны все div'ы обработаться, не знаю почему у вас только первая строчка показывается. Выложите на каком-нибудь сервере страничку, чтобы посмотреть.

Jaska 22.09.2009 00:58

Выложить к сожалению на сервер не могу, могу только дать исходники.

index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Web PtokaX</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="test.js"></script> 
</head>
<body>
<div id="GetString21"><div>
<div id="GetBool22"><div>
<div id="GetNumber23"><div>
</body>
</html>


test.js
$(function(){
 $("div[id]").each(function(){
  var sID = $(this).attr("id");
  $.post('test.php', {'param': sID}, function(data) {
   $("#" + sID).text(data);
  });
 });
});


test.php
<?php if (isset($_POST['param'])) echo $_POST['param']; ?>


Результат
GetString21

Octane 22.09.2009 01:16

Цитата:

Сообщение от Jaska
<div id="GetString21"><div>
<div id="GetBool22"><div>
<div id="GetNumber23"><div>

У вас div'ы не закрыты, поэтому они все вложенные и уничтожаются после первого ответа от сервера.

Jaska 22.09.2009 07:21

О господи, вот растяпа. Прошу прощения не заметил) спасибо!

Octane 22.09.2009 08:15

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

Kolyaj 22.09.2009 09:05

Цитата:

Сообщение от Octane
Вот за что я не люблю jQuery, всегда идет работа с коллекцией элементов, даже если в ней один элемент или вообще ничего нет.

Некоторые его за это любят. Позволяет, в принципе, избавиться от лишних проверок.

x-yuri 23.09.2009 02:33

Цитата:

Сообщение от Octane
Вот за что я не люблю jQuery, всегда идет работа с коллекцией элементов, даже если в ней один элемент или вообще ничего нет.

ну тогда уж надо вспомнить людей, которые не любят динамические языки. Не могу сказать, что люблю jQuery, но считаю, что функции не должны строго относиться ко входным данным, но возвращать результат в строгом формате. Т.е. если функция должна возвращать коллекцию элементов в общем случае, то она должна возвращать ее даже если нужно вернуть один элемент или не надо возвращать элементов вообще. Иначе после получения результата нужно делать проверки: это массив, один элемент или ничего.

И при чем тут jQuery непонятно. getElementsByTagName тоже возвращает коллекцию в любом случае

Octane 23.09.2009 08:25

Да динамические языки здесь ни при чем. В случае, когда работа идет с коллекцией элементов, что в jQuery, что просто в JavaScript, мы как бы сразу в голове держим вариант: когда коллекция пуста, тело цикла не выполнится. Но когда точно знаешь, что работаешь с одним элементом, этот вариант вылетает из головы, вспоминается это в последний момент, когда уже больше не знаешь в чем может быть ошибка.
Я несколько раз встречал в кодах коллег вообще не нужные и просто забытые цепочки на jQuery.
Когда писал свой диплом, то постарался хоть как-то избавится от этой проблемы, разделив способы работы с одним элементом и с коллекцией:
$("идентификатор").remove(); // если элемент не существует, будет ошибка.
$.tag("имя_тега").each("remove"); // выполнить метод remove для каждого найденного элемента
А проверять существование элементов не так уж часто и нужно, в большинстве случаев достаточно проверить наличие какого-то корневого элемента, а с дочерними уже можно работать без проверок.

x-yuri 23.09.2009 17:11

я не говорил о проверках на существование. Я говорил, что если функция возвращает то массив, то элемент, то ничего, то нужно после каждого вызова проверять какой из вариантов мы имеем

т.е. ты про то, что неплохо бы иметь функцию, которая возвращает коллекцию и функцию, возвращающую один элемент? С этим согласен, но непонятно "Но когда точно знаешь, что работаешь с одним элементом, этот вариант вылетает из головы, вспоминается это в последний момент, когда уже больше не знаешь в чем может быть ошибка.", слишком абстрактно для меня. Вроде если рассчитываешь всегда получать один элемент в этом месте и даже если функция возвращает коллекцию, то либо работаешь с первым элементом коллекции, либо записываешь первый элемент в отдельную переменную и работаешь с ней.

Octane 23.09.2009 18:02

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

Вот пример из темы:
$("div#" + sID).text(data);
Кажется, какая тут вообще может быть ошибка? Я пока заметил, что автор не закрыл теги, успел посмотреть на все 3 post-запроса в фаербаге, вывел алертом все идентификаторы внутри each, а только потом уже проверил, находит ли эти элементы jQuery.
Цитата:

Сообщение от x-yuri
Я говорил, что если функция возвращает то массив, то элемент, то ничего, то нужно после каждого вызова проверять какой из вариантов мы имеем

Да, это было бы неудобно.
Цитата:

Сообщение от x-yuri
т.е. ты про то, что неплохо бы иметь функцию, которая возвращает коллекцию и функцию, возвращающую один элемент?

Даже больше, синтаксис не должен скрывать от нас то, с чем мы работаем в данный момент, с одним или коллекцией элементов, как в моем примере :)

x-yuri 23.09.2009 18:11

Цитата:

Сообщение от Octane
Да, в случае с jQuery это было бы неудобно.

это в любом случае неудобно

Цитата:

Сообщение от Octane
Но когда точно знаешь, что работаешь с одним элементом, забываешь, что jQuery продолжает работать с коллекцией из одного элемента

Цитата:

Сообщение от Octane
Даже больше, синтаксис не должен скрывать от нас то, с чем мы работаем в данный момент, с одним или коллекцией элементов, как в моем примере

все-таки я считаю, что просто должна быть возможность искать один элемент, что-то типа
$1("div#" + sID).text(data);

т.е. $ всегда возвращает массив, а $1 - или один элемент или null

Octane 23.09.2009 18:33

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


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