我有一个包含许多图像的 JavaScript 数组。这些图像都是从我的 HTML 中的一个隐藏部分使用的,例如
sources[0] = document.getElementById("building").src
我从 HTML 而不是直接从源获取图像的原因是因为我想在HTML5画布上显示大约 30 个图像,如果我要将它们直接从源加载到 JavaScript 代码中,页面会占用加载时间很长,所以我将它们“预加载”在我的 HTML 的隐藏部分中,然后从那里将它们加载到 JavaScript 代码中。
因此,我使用以下内容创建了我的 JavaScript 数组:
var sources = [];
sources[0] = document.getElementById("building").src,
sources[1] = document.getElementById("chair").src,
....
sources
(将图像添加到数组中大约有 30 行)。
这个想法是会有四五种不同“类型”的图像(即,一些是资产,另一些是负债等),用户需要将每个图像拖到其对应的描述框(也显示在画布上)。
所以我想做的是将图像放入一个数组中的不同“组”中。我已经研究过了,我的理解是最好的方法是使用关联数组,例如:
var sources = {
name1 : ["name1", "place1", "data1"],
name2 : ["name2", "place2", "data2"],
name3 : ["name3", "place3", "data3"]
};
但我不确定如何在我目前拥有的环境中使用它......我会做类似以下的事情吗?
var sources = {
asset1 : document.getElementById("building").src,
asset2 : document.getElementById("chair").src,
liability1: document.getElementById("electricity").src,
...
};
当用户将图像拖动到他们认为属于的描述框时,我将如何检查图像是否属于它被拖动到的描述框?
我打算检查图像是否已被拖动到正确的描述框的方式是,当在“可拖动”图像之一上检测到事件时,将布尔值设置为“真” mousedown
,并跟踪光标在画布上移动时的 x 和 y 坐标。
然后,当mouseup
事件被触发时,我将检查光标在该点的坐标。如果光标已将图像拖放到绘制描述框之一的位置(例如,x 介于 50-100 之间,y 介于 150-200 之间是资产描述框所在的位置,负债描述框位于 x 150 -200, y 150-200),然后我将检查哪个描述框位于该位置(循环遍历描述框位置数组,并检查哪个位于光标位置,如果有的话)。
一旦我在该位置获得了描述框的名称,我将检查刚刚丢弃的图像是什么“类型”,如果它与丢弃位置的框匹配,它将从画布,如果不是,它将被拉回到用户最初“拾取”的位置。
我不确定如何执行此操作,我如何访问用户从数组中单击的图像的“类型”?
编辑 2013-03-13T14:15
所以我已经给出了建议的答案。但是,当我现在在浏览器中查看我的页面时,没有显示画布,并且我在控制台中收到“未捕获的异常”错误。此错误消息说:
未捕获的异常:[异常...“组件返回失败代码:0x80040111(NS_ERROR_NOT_AVAILABLE)[nsIDOMCanvasRenderingContext2D.drawImage]”nsresult:“0x80040111(NS_ERROR_NOT_AVAILABLE)”位置:“JS 框架 :: file:///M:/year%205 /major%20project/development/collision/kinetic.js :: :: line 4250" 数据:无]
我想知道这是否是因为我在这个函数末尾调用的函数......?为了进一步解释,我在函数sources
内部创建和使用数组。window.onload
它目前看起来像这样:
window.onload = function(){
var sources = {
assets: [],
liabilities: [],
income: [],
expenditure: []
}
console.log("the code reaches here");
sources.assets[0] = document.getElementById("building").src,
sources.assets[1] = document.getElementById("chair").src,
sources.assets[2] = document.getElementById("drink").src,
sources.assets[3] = document.getElementById("food").src,
sources.assets[4] = document.getElementById("fridge").src,
sources.assets[5] = document.getElementById("land").src,
sources.assets[6] = document.getElementById("money").src,
sources.assets[7] = document.getElementById("oven").src,
sources.assets[8] = document.getElementById("table").src,
sources.assets[9] = document.getElementById("van").src,
sources.liabilities[10] = document.getElementById("burger").src,
sources.liabilities[11] = document.getElementById("chips").src,
/* I have loads of lines like this, adding in roughly 30 images */
/*Maybe create an array of attributes within each position
of this array, so that I have access to all of each
element's attributes. */
/*Create an associative array for the images and their types*/
var imageTypes = new Array();
/*Use a loop to populate the associative array, declare variables for the total number
of items in each group, declare a variable for the item being for example: */
var numAssets = 10;
var numLiabilities = 5;
var numEx = 11;
var numInc = 8;
// Error checking- check total of these numbers adds up to the number elements in sources array.
var j = 0; // This is to indicate the location of the image in sources array
loadImages(sources, drawImage);
drawGameElements();
drawDescriptionBoxes();
//drawBox();
stage.add(imagesLayer);
};
由于我在函数末尾调用的其他函数之一,画布现在没有显示window.onload
吗?但是这些函数调用在我更改sources
数组之前执行正确,所以我在sources
数组中更改的内容可能有问题?