Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как избежать повторов? (https://javascript.ru/forum/dom-window/82795-kak-izbezhat-povtorov.html)

miltorg 07.07.2021 00:32

Как избежать повторов?
 
Есть код:

v1.ondrop = drop_handler;
v1.ondragover= dragover_handler;
v2.ondrop = drop_handler;
v2.ondragover= dragover_handler;
v3.ondrop = drop_handler;
v3.ondragover= dragover_handler;
v4.ondrop = drop_handler;
v4.ondragover= dragover_handler;


k1.ondragstart=dragstart_handler;
k1.ondragend = dragend_handler;
k2.ondragstart=dragstart_handler;
k2.ondragend = dragend_handler;
k3.ondragstart=dragstart_handler;
k3.ondragend = dragend_handler;
k4.ondragstart=dragstart_handler;
k4.ondragend = dragend_handler;
k5.ondragstart=dragstart_handler;
k5.ondragend = dragend_handler;
k6.ondragstart=dragstart_handler;
k6.ondragend = dragend_handler;
k7.ondragstart=dragstart_handler;
k7.ondragend = dragend_handler;
k8.ondragstart=dragstart_handler;
k8.ondragend = dragend_handler;

Как избежать повторов? Тем более что до конца не ясно сколько будет v1..vn

Спасибо

рони 07.07.2021 07:33

miltorg,
сделать цикл или использовать родителя.

miltorg 07.07.2021 16:58

Цитата:

Сообщение от рони (Сообщение 538451)
miltorg,
сделать цикл или использовать родителя.

А цикл по чём? v1...vn - это <div> - количество которых не известно

А родителя это как? Намекните пожалуйста.
Я даже не могу правильно сформулировать вопрос для Гугла

Спасибо.

ksa 07.07.2021 17:10

Цитата:

Сообщение от miltorg
v1...vn - это <div> - количество которых не известно

Но их как-то можно выбрать... Например дать им некий общий класс.

Цитата:

Сообщение от miltorg
А родителя это как? Намекните пожалуйста.

Пора тебе делать тестовый пример. ;)
На нем и будут показывать.

miltorg 07.07.2021 19:41

Цитата:

Сообщение от ksa (Сообщение 538469)

Пора тебе делать тестовый пример. ;)
На нем и будут показывать.

<table class="vse">
  <tr>
    <td>




<div class="ramka">
<div class="zag_ramka">
    2021-08-21T05:00:00</div>
<div class="otstup">

  <div id="v1" data-myid="2523">
  2523        gggg    </div>
  
  <br>----<br>
  <div id="v2" data-myid="2525">  
  2525   sssssssss  оллл    </div>  
   
  </div>
  </div>

  
<div class="ramka">
<div class="zag_ramka">
    2021-07-09T05:00:00</div>
<div class="otstup">

  <div id="v3" data-myid="2585">
  2585   sssssss fffffff    </div>
  
  <br>----<br>
  <div id="v4" data-myid="2586">  
  2586   hhhhhh hhhhhhh  <p>Нужен кран прораб 222322</p>
  </div>  
   
</div>
</div>

    <td>

<div class="kran">

<div id="k1" draggable="true">11111111</div>




<div id="k2" draggable="true">22222222</div>




<div id="k3" draggable="true">3333333</div>

</div></table>




<script>
  
function dragstart_handler(ev) {
 console.log("dragStart");
 
}
function dragover_handler(ev) {
 console.log("dragOver");

}
function drop_handler(ev) {
  console.log("Drop");

}


function dragend_handler(ev) {
  console.log("dragEnd");


}

v1.ondrop = drop_handler;
v1.ondragover= dragover_handler;
v2.ondrop = drop_handler;
v2.ondragover= dragover_handler;
v3.ondrop = drop_handler;
v3.ondragover= dragover_handler;
v4.ondrop = drop_handler;
v4.ondragover= dragover_handler;


k1.ondragstart=dragstart_handler;
k1.ondragend = dragend_handler;
k2.ondragstart=dragstart_handler;
k2.ondragend = dragend_handler;
k3.ondragstart=dragstart_handler;
k3.ondragend = dragend_handler;



</script>

miltorg 07.07.2021 19:43

Цитата:

Сообщение от ksa (Сообщение 538469)
Но их как-то можно выбрать... Например дать им некий общий класс.

А дальше то что?

Aetae 07.07.2021 21:04

class Drag {
  drop = drop_handler;
  dragover = dragover_handler;
  dragstart =dragstart_handler;
  dragend = dragend_handler;
  
  events = ['dragover', 'drop', 'dragstart', 'dragend'];
  
  constructor(targetSelector, elementSelector) {
    this.targetSelector = targetSelector;
    this.elementSelector = elementSelector;
    this.start();
  }
  
  handleEvent(event) {
    let { type, target } = event;

    switch(type) {
      case 'dragover':
      case 'drop':
        target = target.closest(this.targetSelector);
        break;
      case 'dragstart':
      case 'dragend':
        target = target.closest(this.elementSelector)
        break;
    }
    
    if(target)
      this[type].call(target, event);
  }

  start() {
    this.events.forEach(type => document.addEventListener(type, this));
    return this;
  }
  stop() { 
    this.events.forEach(type => document.removeEventListener(type, this));
    return this;
  }
}

const drag = new Drag('.drag-target', '.drag-element');

ksa 07.07.2021 21:18

Цитата:

Сообщение от miltorg
А дальше то что?

Обрабатывать в цикле. :)

Пример конечно капец какой корявый... :(
Что ты там гонощишь в итоге?

miltorg 07.07.2021 22:11

Цитата:

Сообщение от Aetae (Сообщение 538476)
class Drag {
  drop = drop_handler;
  dragover = dragover_handler;
  dragstart =dragstart_handler;
  dragend = dragend_handler;
  
  ...

Не проверял.)

Работает. Ура! Огромное спасибо!

miltorg 07.07.2021 22:29

drop_handler не срабатывает. А он нужен.

miltorg 07.07.2021 22:37

dragStart
dragOver

вроде как срабатывают одновременно

miltorg 07.07.2021 22:47

Или это так и должно быть. Стартанули и Тянем.

Над объектом и сбросили.

Aetae 08.07.2021 01:18

Работает, нужен только маленький фикс:
this[type].call(target, event);
->
if(target)
  this[type].call(target, event);

:)
https://jsfiddle.net/dwx6r2jo/

miltorg 08.07.2021 03:29

Абалдеть. Спасибо огромное.

miltorg 12.07.2021 05:43

for (let i=1; i < 5; i++) {
 window['v'+i].ondrop = drop_handler;
  window['v'+i].ondragover = dragover_handler;
} 


for (let i=1; i < 4; i++) {
 window['k'+i].ondragstart = dragstart_handler;
  window['k'+i].ondragend = dragend_handler;
}

miltorg 12.07.2021 05:46

А как определить последний элемент vn ?

miltorg 12.07.2021 06:34

mv = document.querySelectorAll("[id^=v]");
mk = document.querySelectorAll("[id^=k]");

for (let i=0; i < mv.length; i++) {
  mv[i].ondrop = drop_handler;
  mv[i].ondragover = dragover_handler;
  }

for (i=0; i < mk.length; i++) {
  mk[i].ondragstart = dragstart_handler;  
  mk[i].ondragend = dragend_handler;
  }

miltorg 12.07.2021 06:35

У меня покороче код?
Может не верно чего?
Но вроде - работает.

Aetae 12.07.2021 12:56

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

miltorg 12.07.2021 17:10

Цитата:

Сообщение от Aetae (Сообщение 538594)
miltorg, так тоже можно. Только это не универсально и не поддерживаемо. Переиспользовать такой код нельзя.

А можно как то расшифровать ваше утверждение?
Что значит - "не универсально"? - Для 3 строчек писать отдельный Класс?
- "Не поддерживаемо"?
- "Нельзя переиспользовать"?

Aetae 12.07.2021 23:43

miltorg, дык суть в том что класс этот ты написал, вынес в свою библиотеку и потом переиспользуешь везде, где тебе понадобится что-то откуда-то куда-то перетягивать. Только классы подставляй.
Твоё же решение придётся копипастить и ручками править в каждом таком случае. Если ты уверен что этого больше нигда не понадобится - сойдёт, иначе лучше сразу закладывать универсальность.

miltorg 13.07.2021 04:07

Цитата:

Сообщение от Aetae (Сообщение 538612)
miltorg, дык суть в том что класс этот ты написал, вынес в свою библиотеку и потом переиспользуешь везде, где тебе понадобится что-то откуда-то куда-то перетягивать. Только классы подставляй.
Твоё же решение придётся копипастить и ручками править в каждом таком случае. Если ты уверен что этого больше нигда не понадобится - сойдёт, иначе лучше сразу закладывать универсальность.

Я не пишу класс - меньше чем на 200 строк кода.

miltorg 13.07.2021 04:10

А этот код вообще ничего универсального не делает.
Он подключает неуниверсальные функции к неуниверсальным блокам.


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