angularjs点击事件在firefox中不起作用,但在chrome中效果良好

li9yvcax  于 2021-09-29  发布在  Java
关注(0)|答案(0)|浏览(202)

我在使用angularjs实现菜单时遇到了一个奇怪的问题。
下面的实现在chrome上运行良好,但在firefox中它只在某个时候起作用,其余时间锁定菜单dom对象上的所有onclick事件。
这是我的 menu.html html模板:

<div id="reportNav">
    <ul id="reportsMenu" ng-class="">
        <li class="tabMenu-item {{menu.classes}}" data-ng-repeat="menu in reportDetail.menusinfo">
            <label analytics-event event-source="tab_name" data-ng-bind="menu.liValue"></label>

                <ul class="submenu level1" data-ng-if="menu.subItems.length > 0"> 
                     <!-----  Sub menu implementation  --->
                </ul>
        </li>
    </ul>
</div>

现在,这里是一个附加了上述html模板的指令 directive.js 文件

reportDirectives.directive('reportmenudir', ['$rootScope','$timeout', '$window', function($rootScope,$timeout, $window) {
    return {
        restrict: 'A',
        replace: true,
        templateUrl: appContext+"/menus.html",
        link: function(scope, element, attrs){

            $rootScope.$on('report-loaded', function(event, args){
                if(!scope.reportViewData.reportCommand.fullReport) {
                      element.on('click', scope.handleClickEvent);
                  }

                scope.horizontal = scope.$eval(attrs.horizontal);

                if(scope.reportViewData.reportCommand.fullReport) {
                    $timeout(function(){
                        angular.element("li.tabMenu-item").each(function () {
                            var curObj = angular.element(this);
                            var event = {
                                target: curObj,
                                preventDefault: function () {
                                }
                            }
                            //console.log("calling", curObj.attr("id"));
                            scope.handleClickEvent(event);
                        });
                        angular.element('.floatmenu').floatmenu();
                    });
                }
            });
        }
    };
}]);

这里是对 handleClickEvent controller.js文件中的函数

$scope.handleClickEvent = function (event) {
        angular.element(".tabMenu").find(".submenu").hide();
        var tarEle = event.target || event.srcElement;
        var parentEle = (tarEle) ? angular.element(tarEle).closest("li.tabMenu-item") : null;

        if (null != parentEle && !parentEle.hasClass("nodata") && !parentEle.hasClass("sel")
            && typeof (parentEle.attr("id")) != 'undefined') {
            parentEle.find(".submenu").show();
            angular.element("#reportsMenu").find(".sel").removeClass("sel");
            parentEle.addClass("sel");
            var reportObj = $scope.reportDetail;

            /**
             *  Get details of the selected menu and update the view etc...
             */

        } else {
            event.preventDefault();
        }
    }

所以,如果我在新选项卡中打开页面,或者在同一选项卡中打开页面,并且没有任何错误消息,那么上述实现将在firefox中失败。奇怪的是它有时会起作用(每10次尝试一次)。
同样,上述实现在chrome和safari中每次都能正常工作。
很多天以来,我一直在努力寻找答案,但是运气不好。上述js文件(编译为ngg angular.js后)作为war文件的一部分使用wildfly服务器提供。
在firefox调试器中,当菜单无响应时,onclick事件不会被上述代码块捕获,但当菜单正常工作时,会被调试器断点捕获。

这个问题的根本原因是什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题