Javascript.RU

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

потерял onmouseUP в div-е содержащем object c svg картинкой
Здравствуйте!
осваиваю Drag'n'Drop по классическим примерам в т.ч. с этого сайта.
<div class="svg_div_block">
	<div id="ball" class="dragable_div">
	  <div id="svg_source" class="mdiv"> </div>
	  <object id="svg_source" type="image/svg+xml" data="img/led2.svg"> </object>
	</div>
  </div>

на событие onmousedown с последующим onmousemove двигаю div-ом с id="ball" (в который вложены div id="svg_source" и svg картинка в object id="svg_source" )
Если я комментирую object id="svg_source", то классический пример срабатывает, и на onmouseup перетаскивание заканчивается.
Но как только появляется object id="svg_source", то в обработчик onmouseup больше не вхожу при отпускании левой кнопки мыши.
Где грабли? подскажите пожалуйста.
var dragObject = null;
	
	var ball = document.getElementById('ball');

	function moveAt(e) {
		dragObject.style.left = e.pageX - dragObject.offsetWidth / 2 + 'px';
		dragObject.style.top = e.pageY - dragObject.offsetHeight / 2 + 'px';
	}
		
	document.onmousemove = function(e) {
		if (dragObject !== null)	moveAt(e);
		document.activeElement = dragObject;
		return false;
	}
		
	document.onmouseup = function(e) {
		alert("UP");
		if (dragObject !== null) alert("UP");
	}
	
	ball.onmousedown = function(e) { // 1. отследить нажатие
	    if (e.which != 1) return false;//только левой кнопки мыши
		dragObject = this;
		dragObject.style.position = 'absolute';//подготовить к перемещению 2. разместить на том же месте, но в абсолютных координатах
		document.body.appendChild(dragObject);// переместим в body, чтобы мяч был точно не внутри position:relative
		dragObject.style.zIndex = 1000; // показывать мяч над другими элементами
		return false;
	}

	// 4. отследить окончание переноса
	ball.onmouseup = function(e) {
		alert("UP");
		document.onmousemove = null;
		ball.onmouseup = null;
		dragObject = null;
Ответить с цитированием
  #2 (permalink)  
Старый 22.09.2017, 15:36
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Герасим,
Прежде всего, id должен быть уникальным
Ответить с цитированием
  #3 (permalink)  
Старый 22.09.2017, 15:51
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Хотя и с одинаковым id все равно работает (т.к. он не используется в коде?)
<style>
.mdiv {
   width:20px;
   height:20px;
   border:1px solid black;
   border-radius:50%;
}
</style>
<div class="svg_div_block">
	<div id="ball" class="dragable_div">
	  <div id="svg_source" class="mdiv">
          <object id="svg_source" type="image/gif" data="https://javascript.ru/forum/images/smilies/smile.gif"> </object>
            </div>
	</div>
</div>
<script>
var dragObject = null;
	
	var ball = document.getElementById('ball');

	function moveAt(e) {
		dragObject.style.left = e.pageX - dragObject.offsetWidth / 2 + 'px';
		dragObject.style.top = e.pageY - dragObject.offsetHeight / 2 + 'px';
	}
		
	document.onmousemove = function(e) {
		if (dragObject !== null)	moveAt(e);
		document.activeElement = dragObject;
		return false;
	}
		
	document.onmouseup = function(e) {
		alert("UP");
		if (dragObject !== null) alert("UP");
	}
	
	ball.onmousedown = function(e) { // 1. отследить нажатие
	    if (e.which != 1) return false;//только левой кнопки мыши
		dragObject = this;
		dragObject.style.position = 'absolute';//подготовить к перемещению 2. разместить на том же месте, но в абсолютных координатах
		document.body.appendChild(dragObject);// переместим в body, чтобы мяч был точно не внутри position:relative
		dragObject.style.zIndex = 1000; // показывать мяч над другими элементами
		return false;
	}

	// 4. отследить окончание переноса
	ball.onmouseup = function(e) {
		alert("UP");
		document.onmousemove = null;
		ball.onmouseup = null;
		dragObject = null;
        }
</script>

Последний раз редактировалось Dilettante_Pro, 22.09.2017 в 16:56.
Ответить с цитированием
  #4 (permalink)  
Старый 22.09.2017, 18:31
Интересующийся
Отправить личное сообщение для Герасим Посмотреть профиль Найти все сообщения от Герасим
 
Регистрация: 22.09.2017
Сообщений: 24

да, когда с GIF работает (и с jpg, png проверил - работает).
значит дело в SVG, с ним не работает, мышь залипает не срабатывает onmouseup
Если убираю obj.style.position = 'absolute'; то эффект залипания мыши пропадает (можно дропать) но захваченный элемент перемещается только внутри своего DIVa, а не по все странице

Последний раз редактировалось Герасим, 22.09.2017 в 21:32.
Ответить с цитированием
  #5 (permalink)  
Старый 25.09.2017, 12:16
Интересующийся
Отправить личное сообщение для Герасим Посмотреть профиль Найти все сообщения от Герасим
 
Регистрация: 22.09.2017
Сообщений: 24

плиз помогите понять где и в каком месте я mouseup потерял?
Ответить с цитированием
  #6 (permalink)  
Старый 25.09.2017, 18:11
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Если тыкать мышь на svg, то не работает. Если на бордер - более-менее работает.
Причем у круглого бордера активны только четыре верхних-нижних-левых-правых точек - остальное перекрыто квадратным внутренним #document
<style>
object {
      border:4px solid black;
      height:82px;
      width:82px;
      border-radius:50%;
}
</style>
<body>
          <object id="ball" type="image/svg+xml"  data="https://js.cx/clipart/ball.svg"> </object>

</body>
<script>
	
var ball = document.getElementById('ball');
// ball.onload = function() {
// var image = ball.contentWindow.document.querySelector('svg');
//     image.onmousedown = function() {
//          return false;
//     }
// }
ball.onmousedown = function(e) {

  ball.style.position = 'absolute';
  document.body.appendChild(ball);
  moveAt(e);

  ball.style.zIndex = 1000; // над другими элементами

  function moveAt(e) {
    ball.style.left = e.pageX - ball.offsetWidth / 2 + 'px';
    ball.style.top = e.pageY - ball.offsetHeight / 2 + 'px';
  }

  document.onmousemove = function(e) {
    moveAt(e);
  };

  ball.onmouseup = function() {
    document.onmousemove = null;
    ball.onmouseup = null;
  };

}

ball.ondragstart = function() {
  return false;
};
</script>


Можно было бы попробовать поиграть с содержимым object (например, строки 10-15), но кроссдоменный запрет...
А без object svg себя прекрасно ведет... https://learn.javascript.ru/drag-and-drop

Последний раз редактировалось Dilettante_Pro, 26.09.2017 в 13:44.
Ответить с цитированием
  #7 (permalink)  
Старый 26.09.2017, 13:31
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Поиграл с однодоменным вариантом svg в object - утешительного мало.
Можно подавить паразитные перемещения svg мышью, но все равно object можно перемещать, только указав на border - внутренний #document перекрывает всю внутреннюю часть object.
Так что используйте svg непосредственно, без вкладывания его в object.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Event тега object после подгрузки svg контента внутри него Wahlberg Events/DOM/Window 8 26.01.2015 19:38