Я собираюсь поставить это здесь, как я пытаюсь решить та же проблема и подумал, что это может быть полезно кому-то еще, хотя это не является строгой заменой для has()
.
Моим первым решением было использовать Element.getBoundingClientRect()
.
Если вы имеете дело с прямоугольной целью вы можете проверить й и у события щелчка против ограничивающего прямоугольника из element
(который является angular.element)
$document.bind('click', function(evt) {
var x = evt.x,
y = evt.y,
rect = element[0].getBoundingClientRect();
if(x > rect.left && x < rect.right && y > rect.top && y < rect.bottom) {
//you've clicked somewhere in the element
}
});
IE8 + работает отлично, но есть небольшая ошибка в 5-7
http://www.quirksmode.org/dom/w3c_cssom.html
Досадно, если ваш элемент содержит другие элементы, которые не влияют на его ширина/высота, которая не будет работать. Но вы можете использовать это (слегка взломанное) решение
link: function(scope, element, attrs) {
var clicked = false;
element.on('click', eClickHandler);
$document.on('click', clickHandler);
function eClickHandler(event) {
clicked = true;
$timeout(function() {
clicked = false;
});
}
function clickHandler(event) {
if(!clicked) {
// click occurred outside
}
}
}
В чем ваш прецедент? –
Я перекодирую плагин Bootstrap clickover (fancy popover). Мне нужно определить, было ли нажато тело, но убедитесь, что его не выбрал сам popover. Попытка сделать щелчок в любом месте и закрыть функцию. В приведенном выше коде «someelement» находится элемент popover div - «другой» - это возврат от функции щелчка тела - https://github.com/lecar-red/bootstrapx-clickover/blob/master/js/bootstrapx -clickover.js # L76 - У меня нет проблем с обнаружением щелчков по телу, но строка has() меня озадачивает. – cyberwombat
Почему бы вам просто не добавить обработчик кликов в '$ document'? Вот как работает выпадающий переключатель - [проверьте код] (https://github.com/angular-ui/bootstrap/blob/master/src/dropdownToggle/dropdownToggle.js) - и он должен быть супер простым (например, две или три строки кода), чтобы добавить это в плагин popover. –