2015-08-25 6 views
4

Я создаю визуализацию графика выстрела из баскетбола, которая предназначена для поддержки чистки области (см. Серый квадрат), а также для индивидуального точечного взаимодействия (путем зависания над определенными точками). Для этого я использую d3.js. Однако элемент холста кисти находится над элементами шестиугольника, и поэтому я не могу взаимодействовать с элементами позади, хотя они видны.Наведите указатель мыши на элемент под другим элементом

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

Благодарим за помощь.

РЕДАКТИРОВАТЬ: Чтобы прояснить, сделать верхний слой невидимым для кликов не будет работать, поскольку мне все еще нужно щелкнуть и перетащить события, чтобы зарегистрироваться на холсте кисти. Мне просто нужна опция mouseover для шестиугольников, лежащих под ней. Shot chart

+1

Мы говорим о двух разных элементах DOM, наложенных или слоев внутри элемента холста? – MinusFour

+0

Это два разных элемента DOM, наложенных, я уверен. Любая помощь будет очень признательна. – cherrypickerio

+1

Почему бы вам не поместить элемент холста кисти под узлы? –

ответ

2

Если речь идет о двух наложенных элементах DOM, это возможно. Не могу сказать из структуры вашего HTML, потому что его нет, но имейте в виду, что событие будет пузыриться через своих родителей, даже если элемент не замалчивается.

$('#container').on('mouseover', function(){ 
 
    $('#results1').html('Inside green square'); 
 
    $('#results3').html('Last caller: green'); 
 
    }); 
 

 
$('#child').on('mouseover', function(){ 
 
    $('#results2').html('Inside blue square'); 
 
    $('#results3').html('Last caller: blue'); 
 
    }); 
 

 
$('#container').on('mouseleave', function(){ 
 
    $('#results3').html('Last caller: green'); 
 
    $('#results1').html(''); 
 
    }); 
 

 
$('#child').on('mouseleave', function(){ 
 
    $('#results3').html('Last caller: blue'); 
 
    $('#results2').html(''); 
 
    });
#container { 
 
    height: 100px; 
 
    width: 100px; 
 
    background-color: green; 
 
} 
 

 
#child { 
 
    height: 50px; 
 
    width: 50px; 
 
    background-color: blue; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="container"> 
 
    <div id="child"> 
 
    </div> 
 
    </div> 
 
<pre id="results1"></pre> 
 
<pre id="results2"></pre> 
 
<pre id="results3"></pre>

Однако, вы не можете сделать это (только HTML и CSS изменен):

$('#container').on('mouseover', function(){ 
 
    $('#results1').html('Inside green square'); 
 
    $('#results3').html('Last caller: green'); 
 
    }); 
 

 
$('#child').on('mouseover', function(){ 
 
    $('#results2').html('Inside blue square'); 
 
    $('#results3').html('Last caller: blue'); 
 
    }); 
 

 
$('#container').on('mouseleave', function(){ 
 
    $('#results3').html('Last caller: green'); 
 
    $('#results1').html(''); 
 
    }); 
 

 
$('#child').on('mouseleave', function(){ 
 
    $('#results3').html('Last caller: blue'); 
 
    $('#results2').html(''); 
 
    });
#container { 
 
    height: 100px; 
 
    width: 100px; 
 
    background-color: green; 
 
} 
 

 
#child { 
 
    position: absolute; 
 
    top: 10px; 
 
    height: 50px; 
 
    width: 50px; 
 
    background-color: blue; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="container"></div> 
 
<div id="child"></div> 
 
<pre id="results1"></pre> 
 
<pre id="results2"></pre> 
 
<pre id="results3"></pre>

Единственное, что я мог думать, что это настроить слушатель на родительском элементе запуска, который проверяет положение мыши и сравнивает его с положением элемента.

+0

Возможно, мне, вероятно, придется реализовать последнее предложение. У меня мог быть слушатель и триггер на холсте верхнего уровня, который отслеживает движение мыши. И каждый отдельный шестиугольник будет иметь слушателя, что-то вроде on («customerMouseover», функция (d) {if (d3.mouse в пределах диапазона) {change fill}}). Я не совсем уверен, как создать пользовательское событие, но я уверен, что это не слишком сложно. Но еще одна проблема, которую я имею, заключается в том, как сравнить положение с каждым шестиугольником, поскольку, если я сравню с положением, это будет круговой радиус вокруг точки. – cherrypickerio

Смежные вопросы