[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не могу получить объект.
ApuktaChehov
Здрасти!

Дело вот в чем. У меня много HTML верстки. И что бы не лазить по дереву объектов, что бы достучаться до нужного, я нужные объекты обрамляю специальными тегами, вот пример:

много кода
<user_name><input type="text" name="user_name"></user_name>
много кода

Теперь я делаю:
document.getElementsByTagName('user_name')[0].childNodes[0]

и получаю нужный объект.

Проблема в том, что все это работает везде кроме IE. Опытными путем выяснил, что это происходит из за того, что тега <user_name> нет в спецификации HTML, грубо говоря это самопридуманный тег.
Жесть в том, что сам объект (document.getElementsByTagName('user_name')) IE
получает, но стучаться к его "детям"(childNode) не может.

Вот не знаю как теперь быть. Может кто подскажет?
Колдовать с заголовками и DOCTYPE пробовал - не вышло.



Спустя 9 минут, 45 секунд (18.11.2010 - 13:16) ApuktaChehov написал(а):
Ах да, хотел сказать, что понимаю, этот метод - метод через "одно место".
Но это самый простой способ. Если не получится разобраться с этим. Придется гулять по дереву, что сложно в последующем редактировании sad.gif

Спустя 4 минуты, 54 секунды (18.11.2010 - 13:20) ApuktaChehov написал(а):
Вообщем решение нашел уже.

В самом начале странице нужно вставить
document.createElement('user_name');

Но, если честно, меня смущает этот дело, учитывая, что такие фокусы с HTML проделывать не хорошо.

Как думаете, стоит идти на такие "жертвы" или сделать "правильно", но сложно и неудобно?

Спустя 17 минут, 53 секунды (18.11.2010 - 13:38) inpost написал(а):
ApuktaChehov
Мне понравилось решение, но не легче уже по id или classу спана? Зачем какие-то новые теги?

Спустя 11 минут, 26 секунд (18.11.2010 - 13:50) ApuktaChehov написал(а):
По id нельзя. У меня динамическая страница, одинаковых элементов может быть сколько угодно. А таскать за собой эти id еще больший гемор.
По классу - это идея. Но IE не поддерживает это дело, придется опять костыли делать sad.gif

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

Тога буду ковырять в сторону классов или же бегать по дереву элементов.

Может кто еще подскажет, как просто получить доступ к объекту в стоге объектов.

Спасибо всем!

Спустя 1 час, 15 минут, 3 секунды (18.11.2010 - 15:05) Basili4 написал(а):
ApuktaChehov
поиск по классу не браузеры не поддерживают. надо писать самому это не трудно вообще или можно использовать QJuery там очень хорошо реализованы селекторы.

Спустя 5 часов, 42 минуты, 43 секунды (18.11.2010 - 20:48) ApuktaChehov написал(а):
а разве поиск по классу это не getElementsByClassName?
А QJuery юзать не хочу. Ради одного дела такой функционал подключать рука не поднимается.

Я люблю все делать сам. Пусть, иногда, косячно получается, зато опыт неоценим.

Спустя 8 минут, 13 секунд (18.11.2010 - 20:56) DySprozin написал(а):
;;а разве поиск по классу это не getElementsByClassName?
не-а (; в том же IE оно не пашет );

;;Я люблю все делать сам. Пусть, иногда, косячно получается, зато опыт неоценим.
+1)

Спустя 3 минуты, 32 секунды (18.11.2010 - 20:59) ApuktaChehov написал(а):
Ну я о том же и говорил выше, что придется костыли ставить.

По видимому других путей нет. Либо скакать по дереву, либо классы.
Ну ладно. Завтра на работе буду решать.

Спасибо всем.

Спустя 1 час, 53 секунды (18.11.2010 - 22:00) sergeiss написал(а):
Цитата (ApuktaChehov @ 18.11.2010 - 14:20)
В самом начале странице нужно вставить
document.createElement('user_name');

Но, если честно, меня смущает этот дело, учитывая, что такие фокусы с HTML проделывать не хорошо.

А почему именно "нехорошо"? Если есть механизм, работающий во всех браузерах, то почему бы его не использовать для своего блага?

Спустя 11 часов, 46 минут, 27 секунд (19.11.2010 - 09:47) ApuktaChehov написал(а):
sergeiss - вот я и говорю что дилема. Конечно можно закрыть глаза и поставить IE на костыли. Но тут тоже свои сложности. Получается что каждый нестандартный тег придется создавать через JS, что тоже сложно, потому что их много.
Не знаю как быть. sad.gif

Спустя 4 минуты, 59 секунд (19.11.2010 - 09:52) linker написал(а):
Самая большая ошибка, это пытаться пихать в HTML-код свои придуманные тэги. IE например очень не любит даже левые атрибуты. Неужели нельзя просто
alert(document.getElementsByTagName('input')[0].value);
или
<input type="text" id="user_name" name="user_name">
alert(document.getElementById('user_name').value);
Нафига самому себе усложнять жизнь.

Спустя 8 минут, 51 секунда (19.11.2010 - 10:00) ApuktaChehov написал(а):
linker - у меня огромный документ, который формируется динамически из десятков элементов. Использовать id это еще хуже нестандартных тегов. А обращаться по номеру к объекту сложно, потому как их много и никогда неизвестно, сколько именно. Фактически именно так я и планировал сделать, пока в голову не пришла идея о нестандартных тегах.

Спустя 7 минут, 54 секунды (19.11.2010 - 10:08) linker написал(а):
Цитата
Использовать id это еще хуже нестандартных тегов. А обращаться по номеру к объекту сложно, потому как их много и никогда неизвестно, сколько именно.

Опа, е-мое, это что-то новое в js-кодинге и html-верстке. Новый тренд - долой id, даешь самопридуманные тэги? Ладно, спишу на то, что ты ляпнул эту ахинею неподумавши. Какие у тебя проблемы с поиском и выборкой элементов методами getElementById, getElementsByTagName?

Спустя 14 минут, 45 секунд (19.11.2010 - 10:23) ApuktaChehov написал(а):
да причем тут id. Я не говорю долой id. Я говорил, что в моем случае хуже, а не вообще.

Хорошо вот пример:
Форма. Кнопка добавить. При нажатии добавляется таблица. В одной из ее ячеек такая же ситуация. Каждый создаваемый элемент можно удалять отдельно.
В этом случае, не вижу смысла применять id так как страница слишком динамична.

Спустя 9 минут, 27 секунд (19.11.2010 - 10:33) linker написал(а):
В том-то и качество id, который позволяет каждый объект идентифицировать. Есть name, тут можно группу объектов идентифицировать. Если таблица добавилась, то тебе должно быть известно о ней все, ну или хотя бы ее id по которому можно получить из этой таблицы все что угодно. Читай про DOM-модель и не занимайся мазохизмом.

Спустя 7 минут, 3 секунды (19.11.2010 - 10:40) ApuktaChehov написал(а):
linker - я в самом начале об этом и говорил, что нужно будет путешествовать по дереву. Получать один объект по id искать другой и т.д. А этим долбанными нестандартными тегами я бы сделал это все в 2 счета и никакого мазохизма.

Спустя 11 минут, 52 секунды (19.11.2010 - 10:51) job-nik написал(а):
ApuktaChehov
слушай, что тебе умный человек говорит и будет тебе добро. от твоей замуты легче не становится, а как раз наоборот.
обьясняю,
вся проблема в логике. вот ты говоришь, если по id, так тебе таскать много "за собой" надо - это и есть твоя ошибка. пускай там хоть миллион в миллиарде таблиц будет до бесконечности, чтобы вытянуть путь к любой записи достаточно знать id вытягиваемой записи ветки, если логика в порядке.

Спустя 8 минут, 42 секунды (19.11.2010 - 11:00) linker написал(а):
ApuktaChehov
Любишь кататься, люби и саночки возить. Долбаные нестандартные тэги, как PHP-код Попова, не уподобляйся. Тем более есть такая вещь, например, jquery. С помощью которой твое блуждание по дереву DOM превратится в приятную прогулку.

Спустя 9 минут, 53 секунды (19.11.2010 - 11:10) Basili4 написал(а):
ApuktaChehov
в таких случаях применяю id на кнопочку с удалить вписываю id элемента который эта кнопочка удаляет. при вставке тоже ничего сложного нет вставляешь однотипный эл. хранишь количество этих элементов. это и буде суфикс к id напрмер кнопка button345

Спустя 10 минут, 15 секунд (19.11.2010 - 11:20) ApuktaChehov написал(а):
Пример1.

<table id="table_1">
<tr>
<td>
<input
id="table_1_input_1"/>
</td>
<td>
<input
id="table_1_input_2"/>
</td>
</tr>
</table>
<table
id="table_2">
<tr>
<td>
<input
id="table_2_input_1"/>
</td>
<td>
<input
id="table_2_input_2"/>
</td>
</tr>
</table>


Тут не вижу привлекательности использовать id. Так как возникает сложность с обработкой этих id. А учитывая, что любую из этих таблиц можно удалить отдельно, то id будут идти, разве что, в порядке возрастания.

Пример2

<table id="table_1">
<tr>
<td>
<input/>
</td>
<td>
<input/>
</td>
</tr>
</table>


Тут все проще, так как для доступа будем юзать чистейших DOM.
table_body = document.getElementById('table_1');
tr_length = table_body.getElementsByTagName('tr').length; // кол-во строк таблицы

//Теперь обходим циклом все тело таблицы.
//Юзаем самый простой и прозрачный способ

for(i = 0; i < tr_length; i++)
{
table_body.getElementsByTagName('tr')[i].childNodes[0].childNodes[0]; //Это наш инпут в первой ячейке
table_body.getElementsByTagName('tr')[i].childNodes[1].childNodes[0]; //Это наш инпут во второй
}


Не самый лучший и простой способ, но позволяет обойтись без id.

Теперь третий пример

<table id="table_1">
<tr>
<td>
<some_input><input/></some_input>
</td>
<td>
<some_input><input/></some_input>
</td>
</tr>
</table>


table_body = document.getElementById('table_1');
some_input_length = table_body.getElementsByTagName('some_input').length;

//Теперь обходим циклом все элементы some_input
for(i = 0; i < some_input_length; i++)
{
table_body.getElementsByTagName('some_input')[i].childNode[0]; //Это наш инпут.
}

Таким образом мы в 2 счета получили все инпуты в таблице не прибегая к id и, практически, обошлись без путешествий по DOM.

Спустя 3 минуты, 19 секунд (19.11.2010 - 11:24) linker написал(а):
Млин, я не понимаю, зачем это
for(i = 0; i < tr_length; i++)
{
table_body.getElementsByTagName('tr')[i].childNodes[0].childNodes[0]; //Это наш инпут в первой ячейке
table_body.getElementsByTagName('tr')[i].childNodes[1].childNodes[0]; //Это наш инпут во второй
}
когда можно
table_body.getElementsByTagName('input');
чего ты извращаешься?

Спустя 5 минут, 20 секунд (19.11.2010 - 11:29) ApuktaChehov написал(а):
linker - так инпут же не один!

Тааааккк.. А если так сделать table_body.getElementsByTagName('input')[i];
где i это порядковый номер.

Попробую сейчас

Спустя 2 минуты, 56 секунд (19.11.2010 - 11:32) linker написал(а):
Да какая хрен разница сколько их там
var inputs = table_body.getElementsByTagName('input');
for(var index in inputs)
{
table_body.removeChild(inputs[index]); // Удаляем инпуты.
}

Спустя 34 секунды (19.11.2010 - 11:32) ApuktaChehov написал(а):
Так вроде можно. Но логика страдает. Непонятно, что за инпут и где он находится.

Эх... А как было бы красиво с нестандартными тегами. Открыл верстку, открыл код и сразу видно, куда обращается код.

Так стоп! Какое удаление?! Я не об удалении говорю. А о простом сборе данных из всех инпутов страницы.

Спустя 1 минута, 43 секунды (19.11.2010 - 11:34) linker написал(а):
Драсьте приехали, сам же пишешь
table_body = document.getElementById('table_1');
значит ты точно знаешь, что они находятся в таблице с id равным "table_1".

Спустя 4 минуты, 14 секунд (19.11.2010 - 11:38) ApuktaChehov написал(а):
немного иначе. Я знаю где находятся таблицы в которых имеются инпуты.

Блин, какой отстой. Мне всего то нужно обойти все инпуты страницы и сформировать на основе полученных данных XML документ.

Спустя 4 минуты, 4 секунды (19.11.2010 - 11:42) linker написал(а):
Ну напиши так
document.getElementsByTagName('input')
получишь все инпуты на странице и делай с ними что хочешь.

Спустя 2 минуты, 35 секунд (19.11.2010 - 11:45) ApuktaChehov написал(а):
Я хочу разъяснить, что все это я тут устроил не из за того, что путаюсь продвинуть свою "гениальную" идею о нестандартных тегах.

Я хочу получить все нужные элементы страницы и сформировать из них XML документ. При том сделать это максимально красиво и прозрачно.

Я делал подобные вещи с помощью id. Страницы очень сложные. Честно говоря, после полного вынимания мозга на протяжении не одного дня, было страшно вносить какие-то ни было изменения в страницу, потому как неизвестно к чему это приведет. А то о чем я говорю приведет лишь к добавлению еще одно элемента на выходе и не повлечет за собой сбой работы всего алгоритма.

Спустя 12 минут, 11 секунд (19.11.2010 - 11:57) linker написал(а):
Если бы твой метод работал, то ты сюда не запостился бы с проблемой. Есть id, есть name, js и объектно-ориентированный язык и процедурный, пользуйся в свое благо. Извини, мне просто кажется что тебе лень и ты пошел по левому пути. Если лень, повторюсь, используй готовые js-фреймворки, они помогут.

Спустя 3 минуты, 25 секунд (19.11.2010 - 12:01) ApuktaChehov написал(а):
Да не лень, в том то и дело. Хочется что бы все было красиво и прозрачно.

Эх... Спасибо всем. Буду делать по старинке.

Спустя 6 минут, 12 секунд (19.11.2010 - 12:07) linker написал(а):
Красиво и прозрачно, это как раз по старинке в данном случае. Напиши функции, которые будут что-то выбирать, фильтровать, добавлять, удалять. Это же так легко, просто, красиво и прозрачно. Напиши концепцию, разработай алгоритмы и реализовывай себе спокойно.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.