Событие с превышением поля

#javascript #html #css #gwt

#javascript #HTML #css #gwt

Вопрос:

Имея:

 <div id="outerDiv">
    <div id="innerDiv" style="margin: 10px">Content goes here</div>
</div>
  

Я хочу идентифицировать те события мыши, которые происходят за пределами innerDiv, но внутри outerDiv (по-другому, эти события за пределами поля innerDiv).

Этого легко достичь, если я добавлю outerDiv отступ или границу, но я хотел бы знать, есть ли другой способ сделать это без необходимости добавлять дополнительные пиксели к outerDiv.

Спасибо

Комментарии:

1. Это для перетаскивания, поэтому мне нужно удерживать мышь вниз, перемещать мышь и мышь вверх.

Ответ №1:

Используя jQuery, я бы сделал следующее

 $("#outerDiv").bind("event", function(e) {
  if ($(e.target).closest("#innerDiv")) {
    alert("from inner div");
  }
  else {
    alert("from outer div only");
  }
});
  

Объяснение:

#outerDiv получит событие с пузырьками. Если целью события или предком цели является #innerDiv , то мы знаем, что оно возникло во внутреннем div. В противном случае этого не произошло. Поскольку это произошло #outerDiv , мы знаем, что это произошло где-то в #outerDiv , но не в #innerDiv

Ответ №2:

Это может быть достигнуто с помощью флага:

 <div id="outerDiv" style="border:thin solid red;">
    <div id="innerDiv" style="border:thin solid blue; margin: 10px;">Content goes here</div>
</div>

<script language="javascript">

var flag = false;

document.getElementById("outerDiv").onclick = function(){
    if (flag) {
        flag = false;
        return false;
    }
    alert("Clicked outerDiv");
}

document.getElementById("innerDiv").onclick = function(){
    flag = true;
    alert("Clicked innerDiv");
}

</script>
  

Суть в том, что событие для innerDiv будет запущено первым. Если это так, предотвратите событие для outerDiv .

Этот метод работает для onmousedown , onmouseup и onmousemove .

Комментарии:

1. Спасибо, но ваш пример работает, потому что вы добавили границу к outerDiv, и это то, чего я пытаюсь избежать

2. Для меня работает в Safari, Firefox, Chrome и Opera на Mac — с границами и без них. Ожидайте, что это будет работать и во всех других форматах. Я добавил границы только для того, чтобы знать, где нажимать 😉

3. Однако DIVS отображаются не так, как вы можете ожидать, если вы не добавите границу. Например, посмотрите разницу между style="background-color:yellow;" и style="border:thin solid red;" для outerDiv . Это различие означает, что outerDiv оно не будет кликабельным сверху и снизу innerDiv , если у него нет границы. Если вы не хотите добавлять границу, вы можете установить height для outerDiv или присвоить ему некоторые padding значения.