调用时间密集型函数后,单击事件将停止在firefox mobile上运行

问题描述 投票:1回答:1

在调用需要一些计算(或渲染)时间的函数后,所有单击事件(ng-click函数以及通过addEventListener单击与js绑定的函数)都不会被触发。

点击事件停止工作后我注意到的事情:

  • javascript一直在运行(我用一个简单的setIntervall函数测试它,它向控制台打印一些东西)。
  • 我使用Firefox WebIDE远程调试网站,控制台中没有错误或警告。
  • click事件仍然绑定到元素并通过getElementById("...").click()工作的控制台触发click事件。
  • 一切正常适用于firefox / chrome /即桌面版。
  • 要使点击事件再次起作用,我必须重新加载页面。
  • 减少负载或删除, "ngMaterial", "ngMessages"依赖项将防止错误发生
  • 一旦错误进入,控制台就会停止打印“点击”。

这是一个最小的示例,您可能必须更改加载变量,以便完成计算至少需要5秒钟。只需单击“计算”标题即可启动重载功能。如果计算时间足够长,“计算”按钮就会停止工作。

<html lang="en">

<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.8/angular-material.min.css">
</head>

<body ng-app="BlankApp" ng-controller="heavywork" ng-cloak>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-animate.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-aria.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-messages.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.2/angular-route.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.8/angular-material.min.js"></script>

    <script type="text/javascript">
        document.body.addEventListener("click", function () { console.log("clicked"); });
        document.body.addEventListener("touchend", function () { console.log("touchend"); });

        var app = angular.module('BlankApp', ["ngRoute", "ngMaterial", "ngMessages"]);
        app.controller("heavywork", function ($scope) {
            $scope.count = 0;
            $scope.calculate = function () {
                $scope.count += 1;
                //Edit load here such that it takes at least 5 seconds to finish
                var load = 1000000000;
                for (i = 0; i < load; i++) var x = Math.sqrt(10000);
            }
        })
    </script>

    {{count}}
    <h1 ng-click="calculate()">calculate</h1>
</body>

</html>
javascript angularjs mobile angularjs-material
1个回答
2
投票

如果遇到这样的问题,你会想要禁用点击劫持。

app.config(function($mdGestureProvider) {
  $mdGestureProvider.skipClickHijack();
});

这是一个固定的CodePen。它可以在移动here上测试。

有关这方面的文档可以在here找到。

© www.soinside.com 2019 - 2024. All rights reserved.