Определить тэг под перемещаемым контейнером DIV.

PHProgress

Новичок
Определить тэг под перемещаемым контейнером DIV.

Добрый день, написан небольшой Drag and Drop.

Смысл кода в следующем – перемещение контейнеров с классом DragCan из одной ячейки таблицы в другую.

Проблеме в следующем. Когда перемещаешь данный контейнер, и если курсор находиться в его пределах – я не могу определить место для вставки. Метод window.event. srcElement.tagName выдает название тэга Div. Т.е. моего контейнера, который мы перемещаем в данный момент. Как мне узнать текущий тэг под перемещаемым контейнером?
 

dimagolov

Новичок
обрабатывать события onmousemove/onmouseover/onmouseout/onmouseup на тех объектах, куда может быть drop
 

PHProgress

Новичок
Автор оригинала: dimagolov
обрабатывать события onmousemove/onmouseover/onmouseout/onmouseup на тех объектах, куда может быть drop
Вот это у меня и не получаеться сделать.
Я так понимаю, что все события у меня перехватывает перетаскиваемый контейнер...
Не могу определить что под DIV, т.к. курсор находиться в области DIV, который перетаскивается c position absolute.
 

PHProgress

Новичок
А как тогда я определю на какую активную ячейку таблицы наведен курсор мыши с контейнером?

Код - Работает только в IE:


PHP:
<html>

 
<head>

<script language="JavaScript"> 
	
flg = (document.all) ? 0 : 1;
var obj, objClone, TMPx, TMPy;

function mousedown(e) 
{
	obj = event.srcElement;
	/* выходим на тэг DIV (SPAN) с классом dragNdrop */
	while(!(obj.getAttribute("className") == "dragCan") && obj)
	obj = obj.parentElement;
}
 
	
function mousemove(e) 
{
	document.all.DWsInputText.value = this.cellIndex;
	
	if (obj) 
	{
		/* Создаем возможность перемещения объекта */
		obj.setAttribute ("className", "dragMove");
		obj.style.pixelLeft = event.clientX + document.body.scrollLeft - 50; /* Данный вычет поставлен намеренно */
		obj.style.pixelTop 	= event.clientY + document.body.scrollTop  - 50; /* Данный вычет поставлен намеренно */
		
		document.all.DWsInputText.value = "Вот здесь: \nАктивная Строка № [],  Активная ячейка №[] Активный тэг за контейнером DIV (должен быть TD)!!!! \n " + event.srcElement.tagName; /* Что здесь надо написать? */

		return false;
	}
}
 
function mouseup(e) 
{
	obj.setAttribute ("className", "dragCan");
	switch ( event.srcElement.tagName )
	{
		case 'TD' : event.srcElement.appendChild(obj); break;
		case 'DIV':	event.srcElement.insertAdjacentElement ("beforeBegin", obj ); break;
		default: 	/*alert ("Вставка произошла за пределы поля TD\nВозвращаем элемент на место!");*/ break;
	}
	obj = null;
}
 
if (flg) 
{
  document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
}
 
document.onmousedown = mousedown;	/* Пользователь начал перетаскивание */
document.onmousemove = mousemove;
document.onmouseup = mouseup;		/* Пользователь заверши перетаскивание */
 
 
</script>

<style type="text/css">
/* Класс для объектов, 
с которомы можно производить перенос */
.dragCan
{
	position: static;
	width: 150px;
	background-color: #009966; 
	border: #000000 1px solid;
}

/* Класс клонированного объекта */
.dragMove
{
	cursor: move;
	position: absolute;
	width: 150px;
	color: red;
	background-color: #efefef; 
	border: #000000 1px dashed;
	filter: alpha (opacity=50);
}
</style>

</HEAD>
 
 
<BODY>

Текущий тэг<textarea cols="100" rows="5" id="DWsInputText"></textarea> 


<hr>
 <table border="4" align="center" height="300" width="1000">
 <tr><td colspan="3"> <center><h2>В эту таблицу должна перенестись картинка!</h2></center> </td></tr>
 <tr><td width="20%"><div class="dragCan" id="Lab" style="z-index: 5;"> <b>^. 
 Новые средства безопасности и конфиденциальности 
 <img src="http://t3.gstatic.com/images?q=tbn:d3izzojwwt-PmM:[url]http://www.memorial.ru/lists/irkutsk/aeroplans/il76.gif[/url]" name="a">
 позволяют сделать просмотр веб-страниц более безопасным.</b> </div>	
 	<div class="dragCan"><b>4. Действия перья.</b> </div>		
 	<div class="dragCan"><b>5. Информация была полезной?</b></div></td>  <td width="60%"> -- <b>Привет, это тест</b> Без всего <i>Я наклонный текст</i> </td> <td width="20%"> 
 
	<div class="dragCan"><b>1. Сведения, приведенные в этом разделе справки, относятся к Windows Internet Explorer 8.</b></div>	
 	<div class="dragCan"><b>2. Сведения, приведенные в этом разделе справки, относятся к Windows Internet Explorer 8.</b></div>		
 	<div class="dragCan"><b>3. Сведения, приведенные в этом разделе справки, относятся к Windows Internet Explorer 8.</b></div>

<div class="dragCan" style="cursor: hand; border: #000000 3px solid;">
ильтрация InPrivate предотвращает предостав<br>
<img src="http://t3.gstatic.com/images?q=tbn:d3izzojwwt-PmM:[url]http://www.memorial.ru/lists/irkutsk/aeroplans/il76.gif[/url]" name="a"><br>
Привет.
</div>
 
  </td></tr>
 </table>
 

<div class="dragCan" style="cursor: hand; border: #000000 3px solid;">
 <table border="1"><tr><td>
<img src="http://test1.ru/themes/classic/images/ico/delete.gif">
<img src="drop.gif" style="cursor: move;">
<img src="http://test1.ru/themes/classic/images/ico/edit.gif">
<img src="http://test1.ru/themes/classic/images/ico/delete.gif">
<br>
<img src="http://t3.gstatic.com/images?q=tbn:d3izzojwwt-PmM:[url]http://www.memorial.ru/lists/irkutsk/aeroplans/il76.gif[/url]" name="a"><br>
Привет.
</td></tr></table></div>
 
 

 
<div class="dragCan">
<img src="drop.gif" style="cursor: move;"><br>
Привет.
</div>
 
<div class="dragCan">
<img src="drop.gif" style="cursor: move;"><br>
<img src="http://t3.gstatic.com/images?q=tbn:d3izzojwwt-PmM:[url]http://www.memorial.ru/lists/irkutsk/aeroplans/il76.gif[/url]"><br>
</div>
 
<div class="dragCan">
<img src="http://t3.gstatic.com/images?q=tbn:d3izzojwwt-PmM:[url]http://www.memorial.ru/lists/irkutsk/aeroplans/il76.gif[/url]"><br>
</div>

 

<div class="dragCan">
<img src="http://t3.gstatic.com/images?q=tbn:d3izzojwwt-PmM:[url]http://www.memorial.ru/lists/irkutsk/aeroplans/il76.gif[/url]">
Режим просмотра InPrivate позволяет посещать веб-страницы без сохранения истории в Internet Explorer. 
<table border="1"><tr><td>Тестовая таблица</td></tr></table>
Это помогает предотвращать получение посторонними пользователями компьютера информации о посещенных страницах и просмотренном содержимом. Дополнительные сведения см. в разделе Что такое просмотр InPrivate?
</div>
 
</body>
</html>
 

dimagolov

Новичок
А как тогда я определю на какую активную ячейку таблицы наведен курсор мыши с контейнером?
То есть как? Если отработало onmouseover, на ячейке, то она активна. Если отработало onmouseout, то нет.
 

PHProgress

Новичок
Допустим я перемещая контейнер произвольно.
Работает событие mousemove.

Навожу этот контеэнер <div class="dragCan"> Содержание </div> на определенную ячейку таблицы.

В задачу входит - определить №ячейки, №строки - на которую я навел данный контейнер. Содержимое необходимо вывести в поле textarea - <textarea cols="100" rows="5" id="DWsInputText"></textarea> в формате row[x] cell[x].

Если у меня "пустой" курсор (которым можно щелкать по объектам и выделять текст в окне браузера)
- то определить активный тэг я могу двумя путями:

1. document.activeElement.tagName.
2. event.srcElement.tagName.

№ номера ячеек выведу через cellIndex и rowIndex.


:confused: Но как подобраться к данной ячейке, если между курсором и ячейком находиться передвигаемый контейнер DIV событием mousemove. 1. document.activeElement.tagName. и 2. event.srcElement.tagName. выдадут активный элемент т.е. Тэг DIV , либо любой другой тэг в пределах контейнера, на котором зажат курсор?
 

dimagolov

Новичок
PHProgress, JS это событийно-управляемая среда.
У тебя есть такие части Drag and Drop-а:
1. по onmouseover/onmouseout на контейнерах (куда переносим) отслеживаешь активный контейнер и сохраняешь этого в контроллере контейнеров (если тупо то в глобальной переменной)
2. по mousemove тягаешь что тебе там надо
3. по onmousedown/onmouseup ты начинаешь тягание (активируешь ч.2) или заканчиваешь его, то есть передаешь в контроллер контейнеров, что притянули в активный контейнер
4. контроллер контейнеров смотря на то, что сейчас активно, или говорит "ОК" на отпускание, и что-то делает, или говорит "хрен вам", не могу сюда перетянуть.
 

PHProgress

Новичок
Даже если я отпущу кнопку мыши - курсор всеравно будет активным на контейнере. Но не на ячейке. Следовательно не смогу определить что за ячейка. Вот в этом проблема задачи. Как мне в момент перетаскивания (и отпускания) определить что в данный момент находиться под курсором -> под контейнером (курсор на контейнере).
 

dimagolov

Новичок
PHProgress, ты измышлениями не занимайся, а повесь обработчики событий onmouseover/onmouseout на свои ячейки и отображай где-нибудь состояние (типа over=id, out=id). как это сделаешь, может поймешь, что я тебе пытаюсь объяснить
 

PHProgress

Новичок
Автор оригинала: dimagolov
PHProgress, ты измышлениями не занимайся, а повесь обработчики событий onmouseover/onmouseout на свои ячейки и отображай где-нибудь состояние (типа over=id, out=id). как это сделаешь, может поймешь, что я тебе пытаюсь объяснить
В общем. Понял о чем идет речь.
Попробую. После отпишусь что получилось.

И еще вопрос перед пробами:
Как работает данное устройство - "так сделай так, чтобы не перехватывал. e.cancelBubble/e.stopPropagation(), вернее их отсутствие."
 

dimagolov

Новичок
по логике ты не обрабатываешь onmouseover/onmouseout и поэтому это (e.cancelBubble/e.stopPropagation()) должно быть не актуально для тебя.

а по теме, в объекте event есть свойство cancelBubble (IE) и метод stopPropagation() (FF & etc.), которые ответственны за то, чтобы событие обрабатывалось другими объектами (слоями, родителями и т.п.). Это если делать attachEvent/addEventListener. Если делать просто obj.onmouseover= func, то за всплытие отвечает код возврата ф-ии обработчика, false = cancelBubble, true соответственно продолжать обработку если возможно. Подобный нехитрый код (onclikc='return false;') не дает переходить по ссылке в случае клика по ней (потому что первым отработает обработчик onclick, вернет false и всплытия не будет, значит и перехода не будет, он той же очередью обработчиков обрабатывается.
 

PHProgress

Новичок
В общем задачу не решил...
Посмотрел данные функции.

Решил подготовить видео с описанием проблемы.
Загружено на rutube.ru
http://rutube.ru/tracks/3117238.html?v=3c3972463addf03486175ccaa7417293

После просмотра:
1. Контейнер с тэгом DIV становиться активным.
2. Следовательно event.srcElement читает его, а не то что под ним.
3. Таблица и ячейки могут быть произвольными.
 

dimagolov

Новичок
PHProgress, дурень, у тебя НЕ ОДНО СОБЫТИЕ!!!!!
Повторяю по-моему уже 3-й раз:
через onmouseover/onmouseout ты отслеживаешь текущий контейнер, через mousemove перемещение, через onmousedown/onmouseup начало и завершение перемещения.
Все обработчики работают на один объект контроллера, его состояние изменяют и из него берут нужную инфу.
 

PHProgress

Новичок
Наверное в следующий раз я уже буду хуже дурня, если спрошу.

С этими 5-тью событиями все ясно. Вопросов нет.
Вопрос в том, как мне получить нужную инфу, а именно то, что находиться под контейнером?

-~{}~ 07.04.10 23:13:

Даже если я присваиваю onMouseOver="document.all.DWsInputText.value = event.srcElement.tagName;" каждой ячейке таблицы. Он мне всеравно выдает активный элемент - передвигаемый DIV контейнер!!!!!

Это к вопросу:

PHProgress, ты измышлениями не занимайся, а повесь обработчики событий onmouseover/onmouseout на свои ячейки и отображай где-нибудь состояние (типа over=id, out=id). как это сделаешь, может поймешь, что я тебе пытаюсь объяснить
.
 

dimagolov

Новичок
PHProgress, а ты не думал, что onmouseover будет отрабатывать и для твоего div-а, но вот реагировать на него тебе надо только для твоих контейнеров, вернее только для них нужно менять свойство "активный контейнер"? а для всей остальной хрени можно просто игнорировать событие?

-~{}~ 07.04.10 16:36:

и это, забудь про document.all, юзай getElementById
 

mihailov.o.v

Новичок
Автор оригинала: dimagolov
PHProgress, а ты не думал, что onmouseover будет отрабатывать и для твоего div-а, но вот реагировать на него тебе надо только для твоих контейнеров, вернее только для них нужно менять свойство "активный контейнер"? а для всей остальной хрени можно просто игнорировать событие?

-~{}~ 07.04.10 16:36:

и это, забудь про document.all, юзай getElementById
По идее он будет отрабатывать только для своего div, что-то Вы путаете..
 
Сверху