Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти все элементы документа по id 
:(
    Опции темы
SDEVIL
Дата 30.7.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



Необходимо следующее: 
Есть html документ сформированный php скриптом, в документе есть элементы с id sub_*, где *-любое число любых символов,  имена всех необходимых элементов начинаются с sub_  как можно найти эти элементы и записать их в массив(полное id элементов для последующей работы с ними)
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
Mymik
Дата 30.7.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 11
Всего: 78



если ты хотя бы знаешь тэги этих элементов то можно с помощью document.getElementsByTagName() и потом перебирать все эти элементы. В цикле брать element.id.indexOf("sub_") == 0 тогда записывать. А если нет, то пропускать.
Но если ты не знаешь даже тэгов в которых эти элементы будут встречаться... что ж... тогда вообще полностью перебор всех элементов и брать их child'ы... Единственный вариант это рекурсия. Но если html очень сложный... хм... тогда я б посоветовал тебе на стороне сервера еще формировать этот массив и не насиловать пользовательский комп такой ресурсозатратной  дискурсией.


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
AKS
Дата 31.7.2007, 07:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(SDEVIL @  30.7.2007,  19:24 Найти цитируемый пост)
как можно найти эти элементы и записать их в массив(полное id элементов для последующей работы с ними)

Наверняка мог бы подойти вариант, наподобие такого:
Код

onload = function () {
    var html = document.body.innerHTML;
    var re = /(?:id=(?:\u0022|\u0027){0,1})(sub_[^\s\u0022\u0027\u003E]+)/gi;
    var ids = [];
    var match = re.exec(html);
    while (match) {
        ids.push(match[1]);
        match = re.exec(html);
    };
};

В массиве ids будут id, начанающиеся с sub_.
PM MAIL   Вверх
SDEVIL
Дата 31.7.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



Цитата(AKS @ 31.7.2007,  07:37)
Наверняка мог бы подойти вариант, наподобие такого:

А этот скрипт не очень будет грузить комп пользователя?
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
dXdYdZ
Дата 1.8.2007, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 16.4.2007

Репутация: 3
Всего: 4



Быстрее будет всё же рекурсией:

//Массив с будущими элементами:
var ia=[];
 
parse=function(Fragment)
{
if(!Fragment.childNodes) return;
for(var n=Fragment.childNodes.length-1;n>-1;n--)
    {
    var id=Fragment[n].getAttribute("id");
        if(id) if(id.indexOf("sub_")==0) ia.push(Fragment[n]);
        parse(Fragment[n]);
    }
}

parse(document.body);

Я не тестировал этот скрипт, так что возможны ошибки. 
Но в целом это будет работать довольно быстро(писал подобные вещи не один раз).
PM MAIL   Вверх
AKS
Дата 1.8.2007, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SDEVIL, по-поводу:
Код

..этот скрипт не очень будет грузить комп пользователя?

можно сказать, что это будет зависеть от размера страницы. Я взял для теста страничку, в которой document.body.innerHTML.length ~ 300000 символов. Так вот "пробежка" 5 раз (т.е. 5 вызовов функции и замер времени перед первой и после последней) заняла самое меньшее у Opera/FF ~ 0.5 сек, а у IE примерно 1 секунду. Т.е. триста тысяч символов умноженные на пять были просмотрены примерно за 0.5 - 1 секунду. Зависеть это, конечно же, должно еще и от компьютера пользователя, ну и еще от чего-нибудь - я уж не знаю...

Цитата(dXdYdZ @  1.8.2007,  01:05 Найти цитируемый пост)
Быстрее будет всё же рекурсией

Неплохо было бы сравнить.

Цитата(dXdYdZ @  1.8.2007,  01:05 Найти цитируемый пост)
Я не тестировал этот скрипт, так что возможны ошибки. 

Да уж, без них не обошлось smile:
Код

var id=Fragment[n].getAttribute("id"); // Fragment[n] - это что такое?



Цитата(dXdYdZ @  1.8.2007,  01:05 Найти цитируемый пост)
...писал подобные вещи не один раз...

С подобными же ошибками? smile


PM MAIL   Вверх
Zeroglif
Дата 1.8.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Как вариант, если не беспокоят погрешности, то можно собрать "все" элементы через:

Код

элемент.getElementsByTagName('*')


для IE ниже 6-ого - all. Могут быть, конечно, кроссбраузерные несостыковки, но решаемо.
PM MAIL WWW   Вверх
dXdYdZ
Дата 1.8.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 16.4.2007

Репутация: 3
Всего: 4



Вот исправленный скрипт. Протестирован в IE 6.0.2900, Mozilla 1.7.12, 
Opera 9.01, FireFox 2.0:
Код

//Массив с будущими элементами:
var ia=[];
 
parse=function(Fragment)
{
if(!Fragment.childNodes) return;
for(var n in Fragment.childNodes)
    {
    if(Fragment.childNodes[n].nodeType!==1) continue;
    var id=Fragment.childNodes[n].getAttribute("id");
        if(id) if(id.indexOf("sub_")==0) ia.push(Fragment.childNodes[n]);
        parse(Fragment.childNodes[n]);
    }
}

parse(document.body);

На счёт ошибок - когда пишу для себя, то многократно тестирую в Mozilla FireFox, Microsoft IE, Opera и Mozilla. А цель предыдущего ответа - не дать 100% рабочий код, а показать сам путь решения проблемы. Для меня задача состоит в том, чтобы человек понял принцип действия и мог потом написать любой похожий скрипт, а не в том, чтобы он его тупо скопировал, вставил и забыл. В данном случае ошибки даже полезны. Поєтому в предідущем варианте их даже не проверял. Думал, что и так понятно.
PM MAIL   Вверх
AKS
Дата 1.8.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dXdYdZ @  1.8.2007,  17:54 Найти цитируемый пост)
...цель предыдущего ответа - не дать 100% рабочий код

Так вот Вы какой... smile))))))))))))))))

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.