#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
значения.