- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 html 文档,其中包含大量 SVG 元素。某些元素需要附加事件处理程序,我想在专用的 browserify 模块中执行此操作(这是一个编程类的游戏)。我的 HTML 标记通常如下所示:
<!-- Health Stuff -->
<g id="Health_Plus">
<rect x='72' y='184' width='20' height='20' fill-opacity='0' />
<line fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" x1="82.223" y1="186.167" x2="82.223" y2="202.167"/>
<line fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" x1="89.723" y1="194.167" x2="74.723" y2="194.167"/>
</g>
<g id="Health_Minus">
<rect x='74.723' y='210' width='15' height='10' fill-opacity='0'/>
<line fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" x1="89.723" y1="213.833" x2="74.723" y2="213.833"/>
</g>
<g id="Health_Icon">
<line fill="none" stroke="#EC1C24" stroke-width="11" stroke-miterlimit="10" x1="61.504" y1="128.726" x2="61.504" y2="177.716"/>
<line fill="none" stroke="#EC1C24" stroke-width="11" stroke-miterlimit="10" x1="37.01" y1="153.221" x2="86" y2="153.221"/>
</g>
<g>
<text id='Health_Text' x='40' y='210' font='sans-serif' font-size='25'>10</text>
</g>
我的模块代码如下所示:
module.exports = (function ()
{
// function StatsManager = {};
function StatsManager ()
{
//////////////////////////////////////
// Value for outputting debug code. //
//////////////////////////////////////
this.DEBUG = true;
//////////////////////////////////////
// Default values for start of game //
//////////////////////////////////////
this.startingAttackVal = 5;
this.startingDefenseVal = 5;
this.startingHealthVal = 5;
this.attackCap = 10;
this.defenseCap = 10;
this.healthCap = 10;
this.attackFloor = 1;
this.defenseFloor = 1;
this.healthFloor = 1;
///////////////////
// Actual values //
///////////////////
this.attackVal = this.startingAttackVal;
this.defenseVal = this.startingDefenseVal;
this.healthVal = this.startingHealthVal;
//////////////////////////////////////////////////////
// Hooks to all the UI buttons in the stats manager //
//////////////////////////////////////////////////////
this.attackPlus = document.getElementById('Attack_Plus');
this.attackPlus.addEventListener('click', self.AttackPlus);
this.attackMinus = document.getElementById('Attack_Minus');
this.attackMinus.addEventListener('click', this.AttackMinus);
this.defensePlus = document.getElementById('Defense_Plus');
this.defensePlus.addEventListener('click', this.DefensePlus);
this.defenseMinus = document.getElementById('Defense_Minus');
this.defenseMinus.addEventListener('click', this.DefenseMinus);
this.healthPlus = document.getElementById('Health_Plus');
this.healthPlus.addEventListener('click', this.HealthPlus);
this.healthMinus = document.getElementById('Health_Minus');
this.healthMinus.addEventListener('click', this.HealthMinus);
this.specialUp = document.getElementById('Special_Up');
this.specialUp.addEventListener('click', this.SpecialUp);
this.specialDown = document.getElementById('Special_Down');
this.specialDown.addEventListener('click', this.SpecialDown);
//////////////////////////////
// Assignment of the values //
//////////////////////////////
this.attackText = document.getElementById('Attack_Text');
this.attackText.textContent = this.attackVal;
this.defenseText = document.getElementById('Defense_Text');
this.defenseText.textContent = this.defenseVal;
this.healthText = document.getElementById('Health_Text');
this.healthText.textContent = this.healthVal;
}
StatsManager.prototype.AttackPlus = function()
{
if (this.DEBUG) { console.log("Attack +1 Clicked"); }
if (this.attackVal < this.attackCap)
{
this.attackVal++;
this.attackText.textContent = this.attackVal;
}
}
StatsManager.prototype.AttackMinus = function()
{
if (this.DEBUG) { console.log("Attack -1 Clicked"); }
if (this.attackVal > this.attackFloor)
{
this.attackVal--;
this.attackText.textContent = this.attackVal;
}
}
StatsManager.prototype.DefensePlus = function()
{
if (this.DEBUG) { console.log("Defense +1 Clicked") }
if (this.defenseVal < this.defenseCap)
{
this.defenseVal++;
this.defenseText.textContent = this.defenseVal;
}
}
StatsManager.prototype.DefenseMinus = function()
{
if (this.DEBUG) { console.log("Defense -1 Clicked") }
if (this.defenseVal > this.defenseFloor)
{
this.defenseVal--;
this.defenseText.textContent = this.defenseVal;
}
}
StatsManager.prototype.HealthPlus = function()
{
if (this.DEBUG) { console.log("Health +1 Clicked"); }
if (this.healthVal < this.healthCap)
{
this.healthVal++;
this.healthText.textContent = this.healthVal;
}
}
StatsManager.prototype.HealthMinus = function()
{
if (this.DEBUG) { console.log("Health -1 Clicked."); }
if (this.healthVal > this.healthFloor)
{
this.healthVal--;
this.healthText.textContent = this.healthVal;
}
}
StatsManager.prototype.SpecialUp = function()
{
if (this.DEBUG) { console.log("Special Up Clicked.") }
}
StatsManager.prototype.SpecialDown = function()
{
if (this.DEBUG) { console.log("Special Down Clicked.") }
}
StatsManager.prototype.IncreaseAttackCap = function(val)
{
if (this.DEBUG) { console.log("Increasing Attack Cap") }
var amt = val || 1;
this.attackCap += amt;
}
StatsManager.prototype.IncreaseDefenseCap = function(val)
{
if (this.DEBUG) { console.log("Increasing Defense Cap") }
var amt = val || 1;
this.defenseCap += amt;
}
StatsManager.prototype.IncreaseHealthCap = function(val)
{
if (this.DEBUG) { console.log("Increasing Health Cap") }
var amt = val || 1;
this.healthCap += amt;
}
return StatsManager();
})();
我需要通过调用在 test.js 文件中使用 browserify 模块
StatsManager = require('./StatsManager.js');
问题是当我尝试通过单击 SVG 按钮来测试事件处理程序时,没有任何反应。没有控制台消息,什么也没有。但是,文本框的所有值都更改为 5(与 HTML 标记默认值 10 不同)。所以这意味着我的模块必须访问 DOM 才能更改这些值,但由于某种原因没有附加事件处理程序。我和我的教授都无法弄清楚为什么,任何帮助将不胜感激。
最佳答案
根据您对 StatsManager.prototype.*
的分配,我猜测您实际上想要返回 StatsManager
的实例
return new StatsManager();
否则,代码中的 this
将成为全局范围(window
)。
我认为,点击回调函数中的 this
也是错误的。
当您到达如下行时,您的代码现在的样子:
this.specialDown.addEventListener('click', this.SpecialDown);
this
是 window
并且没有 SpecialDown
函数。使用 new StatsManager()
将导致运行相同的函数,但将 this
设置为新创建的对象实例,该实例继承自 StatsManager 的原型(prototype)链。
第二个问题是,当 addEventListener()
执行回调函数之一时,这些函数中的 this
上下文将是被单击的 HTML DOM 元素,并且MouseEvent
参数将传递给该函数。您需要做一些事情来捕获闭包中的 StatsManager
实例或调用 StatsManager
实例上的函数。
例如:
var self = this;
this.defensePlus.addEventListener('click', function(mouseEvent) {
self.DefensePlus(mouseEvent);
});
或者根据浏览器支持需求,您可以使用[Function.prototype.bind()][1]
,如下所示:
this.defensePlus.addEventListener('click', this.DefensePlus.bind(this));
<小时/>
与许多其他语言不同,this
不是拥有该函数的对象,this
是调用该函数的上下文。
关于javascript - 从 Browserify 模块访问 DOM 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34145793/
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!