Как вы слушаете HTML-элемент, движущийся в JavaScript? - PullRequest
10 голосов
/ 16 августа 2011

У меня есть элемент HTML, который мне нужен для отслеживания другого элемента. В частности, мне нужно, чтобы верхний левый и верхний правые углы обоих элементов были расположены одинаково. Когда размер окна изменяется, срабатывает событие изменения размера, и я могу настроить положение зависимого элемента. Однако, если отслеживаемый элемент перемещается (но не изменяется), я не вижу никаких событий DOM.

Как мы можем узнать, был ли перемещен элемент DOM? Мы используем последнюю версию jQuery.

Вот пример кода.

Обратите внимание, что элементы elementOne и mouseTracking предназначены для отображения элементов, которые перемещаются по «некоторой» причине, которая находится вне контроля моего кода.

  1. Этот код работает для случая elementOne.
  2. MouseTrackingTracker не отслеживает движущийся элемент.
  3. ResizerTracker не помещает рамку вокруг всего текста в случае переполнения.

Я бы хотел, чтобы trackingDivs перемещался и изменял размеры независимо от причины изменения отслеживаемого элемента.

Этот код основан на изменении размера окна, являющемся перехваченным событием. Перехват какого-то события, которое происходит, когда элемент меняет свои размеры, ближе к тому, что мне нужно.

<!DOCTYPE html>
<html>
<head>
  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.js"></script>
  <style type="text/css">
#elementOne { float : right;width : 200px; display:inline-block}
#resizer { float : left; display:inline-block}
.trackedDiv { width:50px; height:50px; background-color: blue }
.trackingDiv { position:absolute; z-index: 1; border:3px green; border-style: solid;}
</style>
<script>
  $(function() {
      $( window ).bind("resize",function(){
          $("#elementOne").trigger("reposition");
          $("#mouseTracking").trigger("reposition");
          $("#resizer").trigger("reposition");
       });

       var repositionFunction = function(selfish, element){
           var self = $(selfish);
           var offset = self.offset();
           var selfTop = offset.top;
           var selfLeft = offset.left;

           var selfWidth = self.width();
           var selfHeight = self.height();
           $(element).css({
              top: selfTop,
              left: selfLeft,
              width : selfWidth,
              height : selfHeight
           });
       }
       $(document).mousemove(function(ev){
           $("#mouseTracking").position({
             my: "left bottom",
             of: ev,
             offset: "3 -3",
             collision: "fit"
           });
         });

       var timedShort = function() {
           $('#resizer').html("Really short").resize();
           setTimeout(timedLong, 10000);
       }
       var timedLong = function() {
           $('#resizer').html("Really longggggggggggggggggggggggggggggggggggggggggggggggggggg text").resize();
           setTimeout(timedShort, 10000);
       }
       setTimeout(timedLong, 10000);

       $("#elementOne").bind("reposition",
               function() { repositionFunction(this, "#elementOneTracker"); });
       $("#mouseTracking").bind("reposition",
               function() { repositionFunction(this, "#mouseTrackingTracker"); });
       $("#resizer").bind("reposition",
               function() { repositionFunction(this, "#resizerTracker"); });
  });
  </script>
</head>
<body>
  <div class="trackedDiv" id="mouseTracking">tracks mouse</div>
  <div class="trackingDiv" id="mouseTrackingTracker"></div>
  <div style="clear:both;"></div>
  <div class="trackedDiv" id="resizer">resizer: resizes</div>
  <div class="trackingDiv" id="resizerTracker"></div>
  <div class="trackedDiv" id="elementOne">elementOne: floats to the right</div>
  <div class="trackingDiv" id="elementOneTracker"></div>
</body>
</html>

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

Вы можете запускать пользовательские события с помощью jquery всякий раз, когда вы перемещаете элемент.

$( window ).bind("resize",function(){

   $("#elementOne").css({
      top: 200,
      left: 200
   }).trigger("reposition");

});

// and now you can listen to a "reposition event"

$("#elementOne").bind("reposition",function(){

   var self = $(this);
   $("#elementTwo").css({
      top: self.css("top"),
      left: self.css("left")
   });

});

Таким образом, вы можете самостоятельно перехватывать события с помощью некоторого ручного кодирования, что полезно, поскольку классные события, такие как DOMAttrModified и т. Д., Не полностью поддерживаются во всех браузерах. Недостатком является то, что вы должны сделать все сами.

3 голосов
/ 17 августа 2011

К сожалению, нет надежных событий, сообщающих вам, когда элемент перемещается или изменяется.Вы можете прибегнуть к опросу элемента, хотя это не обязательно будет наиболее эффективным решением:

setInterval(repositionElement, 10);

Другой вариант - заставить ваш элемент "отслеживать" другой элемент чисто черезCSS.Чтобы это работало, вам понадобится «обертка» вокруг отслеживаемого элемента и другой элемент:

#wrapper-around-element-to-track
{
    position: relative;
} 

#tracked-element
{
    position: absolute;
    /* set top and left to position, if necessary */
}

#tracking-element
{
    position: absolute;
    /* set top and left to position, if necessary */
}

Поскольку вы уже используете jQuery, вы также можете использовать Плагин изменения размера для имитации события изменения размера любого элемента, но если я вспомню последний раз, когда я смотрел на него, он просто выполняет опрос, как я упоминал.

2 голосов
/ 16 августа 2011

Существует событие DOMAttrModified , но оно реализовано только в Firefox и Chrome . Но так как вам нужна функция JavaScript для начала перемещения элемента, вы можете запустить пользовательское событие с Jquery в этом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...