- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 space invaders canvas animation作为我的 404 未找到页面。当用户第一次被重定向到它时,它工作得很好,但如果用户第二次被重定向,动画就会挂起。
我创建了一个 Plunker显示问题的示例。该页面从加载 home.html 的 /
位置开始。如果您单击“重定向到/404”,该位置将更改为 /404
并且将加载 404.html。游戏动画将正常运行。
但是,如果您返回到 /
(单击链接)并再次返回到 /404
,动画将被挂起。此外,每秒帧数将从 60fps 降至 10fps。
这个演示是用 AngularJS 构建的,我使用 ngRoute 切换页面,如下所示:(没有什么特别的)
$routeProvider.
when('/', {
templateUrl: 'partials/home.html',
controller: 'HomeCtrl'
}).
when('/404', {
templateUrl: 'partials/404.html',
controller: '404Ctrl'
});
home.html 仅包含说明,而 404.html 包含 canvas 元素:
<canvas id="game-canvas" width="600" height="400"></canvas>
Angular Controller 启动动画调用 initInvaders404();
。此函数在 handle-game.js 中定义。 game.js 完成 404.html 页面加载后立即执行的 Canvas 动画代码。
初步猜测:问题可能与使用其 ID 启动的 Canvas 有关。当我重新创建 404.html 时,动画附加了以前的 ID,但没有附加新的 ID。为了对此进行测试,我创建了另一个 Plunker并用类似的方法测试了另一个动画(蓝色矩形移动)。它工作正常,所以也许这不是问题所在。
第二次猜测:附加到 Canvas 的动画代码只执行一次,这就是为什么它不能第二次工作的原因。为了对此进行测试,我将 game.js 和 handle-game.js 代码放入了 Controller 中。不幸的是,同样的问题。 Plunker
第三个猜测: ngRoute 干扰了 canvas 元素。为了对此进行测试,我将 Canvas 元素放置在 ngView 之外并控制 ngShow 以隐藏/显示 Canvas 。通过这种方法,问题就解决了。 initInvaders404();
可以被调用多次,但它总是聚焦于同一个元素,并且永远不会被重新创建。 Plunker .
为什么这个动画不能执行两次?
注意 1: 我不想要变通解决方案(我已经在第三次猜测中找到了一个)。我想将 canvas 元素保留在 404.html 文件中。
注意 2: 这个问题不是“请调试我的代码”(因为 game.js 有 2000 行代码)。我想了解的是,是否存在可能导致此问题的 canvas 属性或 ngRoute 行为。
最佳答案
我发现可以第二次执行动画,但前提是第一个动画已经完成。在这种情况下,游戏结束后会发生 onWin()
或 onLoose()
事件。
当 ngRoute 改变 View 时,canvas 元素被销毁,但游戏循环仍在后台运行(正如我使用一些 console.log()
确认的那样)。当我尝试将相同的游戏循环附加到相同的 Canvas ID 时,它会挂起。
使用的解决方法是捕获 $locationChangeStart
事件并在 Canvas 销毁之前停止动画。当我需要第二次执行游戏时,它会运行:Plunker .
获取 $locationChangeStart
事件:
ctrls.controller(
'MyRootController',
function($location, $rootScope) {
$rootScope.$on("$locationChangeStart", function(event, next, current) {
var contains404 = current.includes("404");
if (contains404) { // if current is 404, next will be something else
stopInvaders404(); // code to stop the game loop before destroying the canvas
}
});
}
);
然而,第三方动画最简单的解决方案是将 Canvas 放在 ngView
并控制其可见性:Plunker .
关于javascript - 为什么这个 Canvas 动画在使用 ngRoute 第二次加载时挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495103/
当我们写 angular.module('app',['ngRoute']); 这里的依赖到底是什么意思? 最佳答案 准确地说,ngRoute 只不过是一个简单的 Angular 模块,如 angul
我有一个非常奇怪的错误,我已经设置了路线和 Controller 。现在我只有一个没有错误的空白页面? index.html; Rekentalent.nl: Ben j
如果我尝试使用 ngRoute 方法更改主页面 View ,我有一个网络应用程序似乎根本无法工作。路由配置如下所示: var app; app = angular.module('genehaxx',
我想让这个简单的路由工作,但无法弄清楚问题出在哪里。 这是 HTML: . . .
我尝试通过导航栏使用 ngRoute 导航到其他 HTML 页面,但是当我单击导航栏上的不同按钮时,页面上没有显示任何内容。 Index.html 文件: table, th , td {
我正在创建一个 Angular 应用程序。文件结构如下: index.html login.html js/index.js index.html内容为
为什么我有这个错误?这是我的错误: “无法实例化模块 ngRoute” 详细信息: “ Uncaught Error :[$injector:modulerr] http://errors.angul
我的自定义指令中的隔离范围有问题。 我已经构建了一个自定义指令。当我没有使用父作用域在指令中设置作用域属性时,它起作用了。 它做了什么?它呈现了一个原生的 JavaScript 控件。每次加载站点时,
我在函数中传递 /?preview=true 并在 app.js $route.current.params.preview 中捕获。但是当我在控制台日志中输出 $route.current.para
我的代码遇到问题。 刷新 localhost:portnumber/home 或/todos 或/contacts 上的页面时崩溃 -> 使用重播无法获取/home 或/todos 或/contact
我的应用程序在几个小时前运行良好。现在,当我进入一个页面、触发一个事件时,应用程序会返回到主菜单。 我是这样使用 ngRoute 的: app.js angular.module('starter',
我是 Angular 新手,很难让 ngRoute 获取我的模板文件。 这是我的index.html:
我创建了一个网络应用程序,运行完美。现在我需要使用稍微不同的 Controller 创建几乎完全相同的 html 页面。我正在尝试使用 ngRoute 但它不起作用,我也不是 100% 相信我的路线会
我的 ng-route 与我在网页上实现的动画滚动冲突: 这是我的滚动元素: Next 其中“#one”是部分ID,其中滚动到goto-next是图像类,scrolly用于平滑滚动动画。 这是我的 n
我正在开发一个新的 Angularjs 网络应用程序,我必须在其中使用 ngRoute。首先我有点困惑,因为在我的情况下路由根本不起作用 - 我总是在 index 结束。和 MainCtrl。 在 i
我有四个文件: angularjs.js scripts.js ngroute.js index.html 现在,我配置了以下路由: var myApp = angular.module("myApp
我的应用程序可以与 ngRoute 配合使用,但是当我尝试直接访问我的部分(从地址栏)时,它仅返回该部分(没有主页)。如何隐藏这些部分以防止直接访问? 说明:我有一个有 2 个街区的站点。第一个是菜单
我有一个索引页面(登录),其中存在注册链接,因此在重定向时我尝试加载 Controller ,但它没有加载,控制台中也没有错误。 我的主页正在加载 URL:http://localhost:8081/
好吧,我是 Angular 的新手,为了测试我在 Codecademy 上获得的技能,我正在做一个音乐艺术家的测试网站。第一页是艺术家列表。当您单击其中一位艺术家的 block 时,它会在同一页面上加
是否可以向 AngularJS 应用程序中的所有路由添加基本 URL?本质上是改变它在服务器上的位置(有点,如果这有意义的话......所以它不会通过 / 而是通过 /something/ 访问)。
我是一名优秀的程序员,十分优秀!