Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить координаты ячейки из <table> (https://javascript.ru/forum/misc/75871-poluchit-koordinaty-yachejjki-iz-table.html)

Пупел 13.11.2018 16:16

Получить координаты ячейки из <table>
 
Имеется таблица на чистом php
Хочу получить координаты ячейки по нажатию на нее в окне браузера.
Получается решить этот вопрос только двумя функциями, каждая из которых отдельно получает координаты строки и столбца.
Необходимо реализовать получение координат с помощью одной функции.
Когда пытаюсь объединить функции в одну, не получаю значение второй координаты:(
Я только начинаю делать первые шаги, но есть догадки, что при onclick функция не получает второй параметр:help: :help: :help:
Пример кода:
<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);
}


Помогите доступным языком разобраться чайнику :-?

Nexus 13.11.2018 16:30

<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>

Malleys 13.11.2018 18:49

О странной приставке, которая кочует из одного ответа в другой...
Цитата:

Сообщение от 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;
}

рони 13.11.2018 19:04

Цитата:

Сообщение от Malleys
Array.from

если не нужен ie < 12

рони 13.11.2018 19:17

:write:
или так
[...row.querySelectorAll('td')].forEach()

MallSerg 13.11.2018 19:57

На вкус все фломастеры разные =). ИМХО любой работающий вариант достоин права на жизнь.
Но вещать обработчик на каждую ячейку это уже слишком. Думаю разумнее воспользоватся всплытием событий и повесить один обработчик на таблицу.

рони 13.11.2018 21:11

MallSerg,
а есть у вас какой-то минимально достаточный вариант делегирования?
(в учебнике есть, хотелось бы ваш вариант или какой другой, если можно)

Alexandroppolus 13.11.2018 21:33

Цитата:

Сообщение от 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)

MallSerg 13.11.2018 21:48

Цитата:

Сообщение от рони (Сообщение 498483)
MallSerg,
а есть у вас какой-то минимально достаточный вариант делегирования?
(в учебнике есть, хотелось бы ваш вариант или какой другой, если можно)

Нет конечно. просто у меня есть свое мнение =)

Malleys 14.11.2018 16:47

Цитата:

Сообщение от Alexandroppolus
а сам forEach давно есть в прототипе NodeList

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

Alexandroppolus 14.11.2018 17:13

Цитата:

Сообщение от Malleys
Вы конечно можете расширять прототипы как угодно, но сам интерфейс w3.org/TR/dom/#interface-nodelist не содержит такого определения

w3.org - это теория )
на практике вот так - https://developer.mozilla.org/en-US/...deList/forEach

Цитата:

Сообщение от Malleys
некоторые методы не могут быть применены надлежащим образом.

понятно что методы, которые меняют массив, будут там ни к селу ни к городу

Malleys 20.06.2019 16:05

Цитата:

Сообщение от Alexandroppolus
w3.org - это теория )
на практике вот так - https://developer.mozilla.org/en-US/...deList/forEach

Ну так в той статье, на которую вы ссылаетесь в конце как раз так и указано, что forEach является методом, который только в будущем возможно будет стандартизован (на developer.mozilla.org указывает, что это якобы Candidate Recommendation, на самом деле оно ссылается на черновик и при чём тут Web IDL? ) Т. е. оно поддерживается браузерами, но это не даёт никаких гарантии что это не будет удалено из реализации браузеров. (например, как это произошло с HTML imports)

Candidate Recommendation означает, что пришло время для реализаций и тестирования. Спецификация не может перейти на следующую стадию без подготовки полного набора тестов и создания как минимум двух независимых реализаций. Для forEach и iterator в NodeList существует более 2-ух реализации.

Цитата:

Сообщение от Alexandroppolus
w3.org - это теория

Это на самом деле очень огромная работа, связанная с разработкой API веб-языков.



Среди веб-разработчиков широко распространено ошибочное представление о том, что W3C выдаёт некие стандарты, которые должны быть реализованы бедными разработчиками браузеров, нравится им это или нет. Однако это заблуждение: что касается стандартов, мнение производителей браузеров имеет куда больший вес, чем пожелания W3C.

Также в противоположность распространенному мнению стандарты создаются не в вакууме, не за закрытыми дверьми. Например, рабочая группа CSS считает обеспечение доступности одной из важнейших своих задач, все её коммуникации полностью открыты для публики, и каждый свободен высказывать свое мнение и участвовать в обсуждениях.

Вопреки распространенному мнению, W3C не «делает» стандарты. На самом деле он играет роль форума, помогая заинтересованным сторонам собираться в так называемые рабочие группы W3C (W3C Working Groups) и проводить необходимую подготовительную работу. Разумеется, сам W3C также не остается простым наблюдателем: он устанавливает основные правила и контролирует процесс. Тем не менее фактическим написанием спецификаций занимаются (в основном) другие люди, а не сотрудники W3C.

P. S. developer.mozilla.org иногда содержит очень предвзятую информацию, например, может акцентироваться внимание, что что-то не поддерживается в Firefox, при этом умалчивается, что оно экспериментально поддерживается в других браузерах, не говоря уже о подтасовке (как вы уже знаете, как минимум две независимые реализаций должны существовать, чтобы что-то стало стандартом. В этом отношении, w3c, whatwg, tc39 являются более не предвзятыми источниками).

Vlasenko Fedor 20.06.2019 16:40

<table border="1" id="testTable">
  <tr>
    <td width="20" height="20"></td>
    <td width="20" height="20"></td>
  </tr>
  <tr>
    <td width="20" height="20"></td>
    <td width="20" height="20"></td>
  </tr>
</table>
<script>
testTable.addEventListener("click", ({target}) => {
  target.tagName === "TD" && alert(`Координаты X: ${target.cellIndex}\nКоординаты Y: ${target.parentNode.rowIndex}`);
})
</script>

Вариант :)


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