Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.11.2018, 16:16
Новичок на форуме
Отправить личное сообщение для Пупел Посмотреть профиль Найти все сообщения от Пупел
 
Регистрация: 13.11.2018
Сообщений: 3

Получить координаты ячейки из <table>
Имеется таблица на чистом php
Хочу получить координаты ячейки по нажатию на нее в окне браузера.
Получается решить этот вопрос только двумя функциями, каждая из которых отдельно получает координаты строки и столбца.
Необходимо реализовать получение координат с помощью одной функции.
Когда пытаюсь объединить функции в одну, не получаю значение второй координаты
Я только начинаю делать первые шаги, но есть догадки, что при onclick функция не получает второй параметр
Пример кода:
<table border="1">
  <tr onclick="myPositionY(this)">
    <td width="20" height="20" onclick="myPositionX(this)"></td>
    <td width="20" height="20" onclick="myPositionX(this)"></td>
  </tr>

function myPositionX(x) {
	alert("Координаты X: " + x.cellIndex);
}
function myPositionY(y) {
	alert("Координаты Y: " + y.rowIndex);
}


Помогите доступным языком разобраться чайнику
Ответить с цитированием
  #2 (permalink)  
Старый 13.11.2018, 16:30
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

<table border="1">
  <tr id="row">
    <td width="20" height="20"></td>
    <td width="20" height="20"></td>
  </tr>
</table>
<script>
function myPosition() {
	alert("Координаты X: " + this.cellIndex);
	alert("Координаты Y: " + this.parentNode.rowIndex);
}

[].forEach.call(row.querySelectorAll('td'),node=>node.onclick=myPosition);
</script>
Ответить с цитированием
  #3 (permalink)  
Старый 13.11.2018, 18:49
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

О странной приставке, которая кочует из одного ответа в другой...
Сообщение от Nexus
[].forEach.call(row.querySelectorAll('td'),node=>node.onclick=myPosition);
Для каждого элемента из пустого массива в контексте... Я не понимаю, зачем такое сложное для понимания перечисление нужно продвигать во многих ответах на этом форуме. Вот это странное [].forEach.call можно спокойно заменить на Array.from.
Array.from(row.querySelectorAll('td')).forEach(node=>node.onclick=myPosition);


Перечисление ещё можно(и даже грамотней с точки зрения JavaScript) организовать вот так...
for(const node of row.querySelectorAll('td')) {
    node.onclick=myPosition;
}
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2018, 19:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Malleys
Array.from
если не нужен ie < 12
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2018, 19:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109


или так
[...row.querySelectorAll('td')].forEach()
Ответить с цитированием
  #6 (permalink)  
Старый 13.11.2018, 19:57
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

На вкус все фломастеры разные =). ИМХО любой работающий вариант достоин права на жизнь.
Но вещать обработчик на каждую ячейку это уже слишком. Думаю разумнее воспользоватся всплытием событий и повесить один обработчик на таблицу.
Ответить с цитированием
  #7 (permalink)  
Старый 13.11.2018, 21:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

MallSerg,
а есть у вас какой-то минимально достаточный вариант делегирования?
(в учебнике есть, хотелось бы ваш вариант или какой другой, если можно)
Ответить с цитированием
  #8 (permalink)  
Старый 13.11.2018, 21:33
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Malleys
О странной приставке, которая кочует из одного ответа в другой...
[].forEach.call(row.querySelectorAll('td'),node=>node.onclick=myPosition);

Для каждого элемента из пустого массива в контексте... Я не понимаю, зачем такое сложное для понимания перечисление нужно продвигать во многих ответах на этом форуме. Вот это странное [].forEach.call можно спокойно заменить на Array.from.
Array.from(row.querySelectorAll('td')).forEach(node=>node.onclick=myPosition);
странная приставка позволяет не создавать лишний временный объект (массив), что хорошо, ибо чем больше объектов, тем чаще придется собирать мусор

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

так что палка действительно о двух концах.

старый добрый цикл всё равно быстрее и экономичнее )

а сам forEach давно есть в прототипе NodeList (который создается методом querySelectorAll)
Ответить с цитированием
  #9 (permalink)  
Старый 13.11.2018, 21:48
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Сообщение от рони Посмотреть сообщение
MallSerg,
а есть у вас какой-то минимально достаточный вариант делегирования?
(в учебнике есть, хотелось бы ваш вариант или какой другой, если можно)
Нет конечно. просто у меня есть свое мнение =)
Ответить с цитированием
  #10 (permalink)  
Старый 14.11.2018, 16:47
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Alexandroppolus
а сам forEach давно есть в прототипе NodeList
Вы конечно можете расширять прототипы как угодно, но сам интерфейс w3.org/TR/dom/#interface-nodelist не содержит такого определения (содержит только итератор, что достаточно для перечисления, добавление же методов от массива несколько излишне, поскольку некоторые методы не могут быть применены надлежащим образом. Например, метод sort от массива на самом деле не смог бы отсортировать ноды в представлении на экране, нужен именно особенный метод, который бы произвёл подобную сортировку. В большинстве случаев вам не нужна такая привязка, так что подойдёт любой способ перевода в массив (Array.from, или простое перечисление цикл for-of, for с переменной).)

Последний раз редактировалось Malleys, 14.11.2018 в 16:53.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение ячейки таблицы внутри блока div, в итерации .each() Sanu0074 jQuery 1 21.01.2014 19:32
Получить координаты курсора в текстовом поле в пикселях prike Events/DOM/Window 4 23.05.2013 04:35
Как получить координаты Dim@ Общие вопросы Javascript 3 30.05.2012 17:54
Как получить содержимое ячейки таблицы Enxiro jQuery 5 29.05.2011 16:36
Получить координаты мыши alekciy Events/DOM/Window 2 28.12.2008 00:07