gpt4 book ai didi

javascript - 单击外部 div - 当 div 具有触发事件的按钮时 - angularjs

转载 作者:行者123 更新时间:2023-11-29 19:24:49 25 4
gpt4 key购买 nike

我正在使用以下指令来检测何时在 div 外部进行了点击:

app.directive('clickOut', function ($window, $parse) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var clickOutHandler = $parse(attrs.clickOut);

angular.element($window).on('click', function (event) {
if (element[0].contains(event.target)) return;
clickOutHandler(scope, {$event: event});
scope.$apply();
});
}
};
});

在这个 div 中:

             <div class="panel-body" click-out="closeMyPopup()">                 
<div class="row clearfix">
<div class="col-md-12">
<div class="form-inline pull-right">
<button type="button" class="form-control btn" ng-click="onCancelAnnouncement()">Cancel</button>
<button type="submit" class="form-control btn" ng-click="onSaveAnnouncement()">Save</button>
</div>

</div>
</div>

</div>

效果很好,当您在 div 外部单击时,将触发函数 closeMyPopup(),问题是 div 具有触发其他函数的按钮。由于某种原因,当其他函数被调用时(例如单击按钮时),外部单击事件被触发调用 closeMyPopup(),按钮位于 div 内部,因此不应调用外部单击事件。我可以使用另一个指令,它具有正确的行为,并且在您触发另一个功能时不会触发外部点击?或者我该如何解决这个问题?

我也使用这个其他指令,但有同样的问题:

app.directive("outsideClick", ['$document', '$parse', function      ($document, $parse) {
return {
link: function ($scope, $element, $attributes) {
var scopeExpression = $attributes.outsideClick,
onDocumentClick = function (event) {
var isChild = $element.find(event.target).length > 0;

if (!isChild) {
$scope.$apply(scopeExpression);
}
};

$document.on("click", onDocumentClick);

$element.on('$destroy', function () {
$document.off("click", onDocumentClick);
});
}
}
}]);

最佳答案

这是因为事件正在传播到 Window 对象。

- Window
- document
- dialog
- button

在上面的层次结构中,如果点击事件发生在最后一个 button 元素上,该事件将传播到父元素,直到它到达 Window,然后关闭您的对话框。

解决方案一:

通过将事件作为参数传递并调用 event.stopPropagation() 函数来停止每个 Controller 函数中的事件传播:

<button type="button" class="form-control btn"  ng-click="onCancelAnnouncement($event)">Cancel</button>

...

$scope.onCancelAnnouncement($event) {
$event.stopPropagation();
}

解决方案 2:

让事件传播并检查目标元素:

angular.element($window).on('click', function (event) {
var target = $(event.target);
if(target.attr("id") === "anyid") { // or target.hasClass("someclass")
// or target.closest(".some-selector")
// just ignore
} else {
// Do whatever you need
}
});

关于javascript - 单击外部 div - 当 div 具有触发事件的按钮时 - angularjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com