Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как узнать положение элемента (https://javascript.ru/forum/dom-window/24174-kak-uznat-polozhenie-ehlementa.html)

-=1100=- 20.12.2011 13:02

Как узнать положение элемента
 
Есть список:
<ul id='ul'>
 <li>select 1</li>
 <li>select 2</li>
 <li>select 3</li>
 <li>select 4</li>
 <li>select 5</li>

</ul>


При нажатии на один из элементов, мне нужно узнать какой он по счету.

ksa 20.12.2011 13:47

Цитата:

Сообщение от -=1100=-
мне нужно узнать какой он по счету

И какие действия ты уже использовал для решения?

-=1100=- 20.12.2011 14:05

Да мне вот как раз то вообще ничего особо в голову не лезет.
У меня вот такая функция есть

var ul=document.getElementById('ul');

var li=ul.getElementsByTagName('li');

   for(xx=0; xx<=li.length-1; xx++){
      ul.getElementsByTagName('li')[xx].onclick=function (){
          rad(this)
          
          };
    
    };

 function rad(thiss){
 
 thiss.????
 // Можно ли как нибудь так это реализовать


}

ksa 20.12.2011 14:20

Цитата:

Сообщение от -=1100=-
Да мне вот как раз то вообще ничего особо в голову не лезет.

Тогда давай поиграем в "кубики"...
Я расставляю перед тобой в ряд N кубиков... Потом тучу пальцем в некий кубик и спрашиваю:
- Какой он посчёту?

Что тебе нужно сделать дабы ответить на мой вопрос? :)

-=1100=- 20.12.2011 14:30

Любишь играть.... ))

Буду считать с начала ряда.
....
for(xx=0; xx<=li.length-1; xx++){
     // Как узнать где остановиться? (в какой ты кубик пальцем ткнул)
    if(ul.getElementsByTagName('li')[xx]=='?') {}           

};

nerv_ 20.12.2011 14:37

\вариант
<html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">
            body { margin:0px; }
        </style>
        <script type="text/javascript">
			function l(event) {
				var el = event.target || event.srcElement;
				alert(el.innerHTML);
            }
        </script>
    </head>
    <body>
		<ul onclick="l(event)">
		 <li>select 1</li>
		 <li>select 2</li>
		 <li>select 3</li>
		 <li>select 4</li>
		 <li>select 5</li>
		</ul>
    </body>
</html>

Magneto 20.12.2011 14:40

... и тут появился nerv.

nerv_ 20.12.2011 14:42

Magneto, :) Я тоже учусь) Поэтому пока мне это интересно)

Magneto 20.12.2011 14:44

Ну можно было решить и выложить уже после того как топикстартер решил свою проблемку.

ksa 20.12.2011 14:48

Цитата:

Сообщение от -=1100=-
Любишь играть....

Алгоритмы так и рождаются... ;)

Цитата:

Сообщение от -=1100=-
Как узнать где остановиться? (в какой ты кубик пальцем ткнул)

Таки сравнивать каждый кубик с "моим". В JS есть this...

-=1100=- 20.12.2011 14:51

как мне узнать позицию элемента li (на какой из 5 элементов я нажал)

ksa 20.12.2011 14:52

nerv_, таки ты так же не решил задачку автора... :) Ты не вывел порядковый номер элемента в списке. ;) Вот смотри, я немного поменял содержимое

<html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">
            body { margin:0px; }
        </style>
        <script type="text/javascript">
			function l(event) {
				var el = event.target || event.srcElement;
				alert(el.innerHTML);
            }
        </script>
    </head>
    <body>
		<ul onclick="l(event)">
		 <li>select *</li>
		 <li>select *</li>
		 <li>select *</li>
		 <li>select *</li>
		 <li>select *</li>
		</ul>
    </body>
</html>

И уже не понятно что ты там нашел... :)

ksa 20.12.2011 14:54

Цитата:

Сообщение от -=1100=-
как мне узнать позицию элемента li (на какой из 5 элементов я нажал)

К тебе в функцию клика приходит ссылка на элемент (this)... Остаётся только сравнить твой это элемент или нет.
Если твой - вывести значение итерационной переменной и закончить таки цыкл. :)

-=1100=- 20.12.2011 14:55

if (ul.getElementsByTagName('li')[xx]==this.???){...}

Я хотя бы в правильную сторону мыслю?

ksa 20.12.2011 14:56

nerv_ молодец уже в том, что делает полные тестовые примеры, ане как -=1100=- какие-то огрызки...

ksa 20.12.2011 14:57

Цитата:

Сообщение от -=1100=-
Я хотя бы в правильную сторону мыслю?

Сторона правильная. :yes:
А вот синтаксис хромает на все четыре копыта... :) И над оптимизацией нужно работать... ;)

nerv_ 20.12.2011 15:01

Цитата:

Сообщение от -=1100=-
Я хотя бы в правильную сторону мыслю?

В какую сторону мыслить, Вам уже давно сказали
Цитата:

Сообщение от -=1100=-
Как узнать где остановиться? (в какой ты кубик пальцем ткнул)

Цитата:

Сообщение от ksa
Таки сравнивать каждый кубик с "моим". В JS есть this...

ksa, да) Тот вариант приемлем только в рамках обозначенного ТС контекста.

nerv_ 20.12.2011 16:00

у меня получилось так
<html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">
            body { margin:0px; }
        </style>
        <script type="text/javascript">
            function l(event) {
                var elLi = event.target || event.srcElement;
                var elUl = elLi.parentNode.childNodes;

                for(var j = 0, i = 0; j < elUl.length; j++) {
                    if(elUl.item(j).nodeName === "LI") {
                        i++;
                        if(elUl.item(j) === elLi) break;
                    }
                }
                alert(i);
            }
        </script>
    </head>
    <body>
        <ul onclick="l(event)">
         <li>select *</li>
         <li>select *</li>
         <li>select *</li>
         <li>select *</li>
         <li>select *</li>
        </ul>
    </body>
</html>

ksa 20.12.2011 16:15

Цитата:

Сообщение от nerv_
у меня получилось так

По-мне так немного замудрёно ты сделал... Как вариант:

<!DOCTYPE html>
<html>
<head>
<!--
<script src="http://code.jquery.com/jquery-latest.js"></script>
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
</style>
<script type="text/javascript">
function l(Obj,event) {
	var elLi = event.target || event.srcElement;
	var o = Obj.getElementsByTagName('li');
	for (var j = 0; j < o.length; j++) {
		if(o[j] === elLi) {
			alert(j+1);
			break;
		}
	}
}
</script>
</head>
<body>
<ul onclick="l(this,event)">
	<li>select *</li>
	<li>select *</li>
	<li>select *</li>
	<li>select *</li>
	<li>select *</li>
</ul>
</body>
</html>

nerv_ 20.12.2011 16:49

ksa, спасибо! Понял, где можно было упростить. Почему-то эта запись
var elUl = elLi.parentNode.childNodes;

в FF помимо Li влючала еще элементы (всего 11 для списка из 5).
Сделал по Вашему примеру.
<html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">
            body { margin:0px; }
        </style>
        <script type="text/javascript">
            function l(event) {
                var x = event.target || event.srcElement;
                var j = x.parentNode.getElementsByTagName('li');
                for(var i = 0; i < j.length; i++) {
                    if(j[i] === x) break;
                }
                alert(++i);
            }
        </script>
    </head>
    <body>
        <ul onclick="l(event)">
         <li>select *</li>
         <li>select *</li>
         <li>select *</li>
         <li>select *</li>
         <li>select *</li>
        </ul>
    </body>
</html>

Aetae 20.12.2011 17:15

Красивее так:
<!DOCTYPE HTML>
<html>
<body>
  <ul>
    <li>select *</li>
    <li>select *</li>
    <li>select *</li>
    <li>select *</li>
    <li>select *</li>
  </ul>
</body>
<script type="text/javascript">
(function(){
  var ul=document.getElementsByTagName('ul')[0],
      li=ul.getElementsByTagName('li');
  ul.onclick=function(e) {
    var t = e.target || event.srcElement,i=li.length;
    while(i--&&li[i]!==t);
    alert(i)
  }
})()
</script>
</html>


...
functon(event){
var el = event.target || event.srcElement;
...

опасно так делать, опасно.

ksa 20.12.2011 20:19

Цитата:

Сообщение от nerv_
Почему-то эта запись
var elUl = elLi.parentNode.childNodes;

в FF помимо Li влючала еще элементы (всего 11 для списка из 5).

Наверное это текстовыеноды...

nerv_ 20.12.2011 20:43

Aetae, в IE8 не работает. Ругается на эту строчку
var t = e.target || event.srcElement;
// 'target' -  есть null или не является объектом

Цитата:

Сообщение от Aetae
опасно так делать, опасно.

Можно узнать почему?


ksa, да, они текстовые Еноты :D

рони 20.12.2011 20:50

Вариант на jQuery ...
Узнать порядковый номер элемента

melky 20.12.2011 21:40

Цитата:

Сообщение от Aetae (Сообщение 144777)
...
functon(event){
var el = event.target || event.srcElement;
...

опасно так делать, опасно.

(function(){
  var ul=document.getElementsByTagName('ul')[0],
      li=ul.getElementsByTagName('li');
  ul.onclick=function(e) {
    var t = *!*e.target*/!* || event.srcElement,i=li.length;
    while(i--&&li[i]!==t);
    alert(i)
  }
})()

так тоже опасно. в ie e будет undefined и обращение к target вызовет ошибку.

Aetae 20.12.2011 22:49

Самдурак, вас поругал, а сам скопипэйстил.))
На самом деле там должно быть:
var t = e?e.target:window.event.srcElement
Всю жисть так делал а тут прошляпил. Наглядный пример вреда копипэйста.)


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