【问题标题】:Preload images in jquery/canvas "Uncaught TypeError: Type error"在 jquery/canvas 中预加载图像“未捕获的 TypeError:类型错误”
【发布时间】:2013-06-06 00:02:32
【问题描述】:

我想将图像目录预加载到我的画布中,以便在我需要时可以显示它们。

I found this question on stackoverflow 并且接受的答案非常有帮助。 它们的函数遍历图像位置数组,然后(我假设)将它们预加载到画布上。

使用此功能预加载它们后,我很难实际显示它们。我很清楚单张图片的加载方式-

img = new Image();
img.src = imgLocation;
img.onload = function() {
  context.drawImage(img, 0, 0);
}

但由于它们已经加载,我假设我不需要使用img.onload 或除context.drawImage 之外的任何上述代码来实际显示图像。

当我尝试从(我只能假设是包含所有图像的输出数组)加载图像时,我得到一个类型错误。当我在任何索引处检查数组中的内容(带有console.log())时,它会显示[object, Object]

我的代码代码如下所示:

var framesArr = new Array();
var framesAmnt = 300; // we would normally get this number from the PHP side of things

function ldBtn(){

    //load all frames locations into framesArr
    var i=0;
    for (i=0;i<=(framesAmnt-1);i++){
        framesArr[i] = "frames/Frame" + i + ".png";
    }

    //preload them
    preloadImages(framesArr, preloadDone);
}

var deferreds = [];
var deferred;

function preloadImages (paths, callback) {

    $.each(paths, function (i, src) {
        deferred = $.Deferred(),
        img = new Image();

        deferreds.push(deferred);
        img.onload = deferred.resolve;
        img.src = src;
    });

    $.when.apply($, deferreds).then(callback);
}

function preloadDone(){
    //any old index number will do. *Shruggs*
    context.drawImage(deferreds[2], 0, 0); //this will cause a type error.
}

如何在画布上显示由preloadImages 函数加载的图像?

我想我不完全明白当img = new Image(); img.src = imgLocation; img.onload = function() 发生时会发生什么。 javascript/jquery 将图像存储为什么?如果答案是“一个对象”,那它为什么不加载这个数组中的对象呢?

提前感谢您提供的任何建议。

【问题讨论】:

    标签: javascript jquery html html5-canvas preloading


    【解决方案1】:

    首先,您需要将一个实际的图像元素传递给drawImage 方法。现在你正在传递一个延迟输入。

    接下来,Chrome 和原生元素构造函数 (new Image()) 存在错误。

    因此,只需使用 document.createElement("img") 即可完成完全相同的操作 - 没有错误。

    查看相关错误:

    我在这里创建了一个简化的示例:http://jsfiddle.net/YVDpD/

    【讨论】:

    • 请原谅我听起来既震惊又无脑,但你是说这不是我的错吗? XDD 无论哪种方式,您能否建议我在代码中的哪个位置更改 new Image() ?您是指preloadImages 中的那个吗?因为那仍然给出了类型错误。另外,你是说我的代码是正确的并且应该可以工作吗?(除了 chrome 错误)请澄清,我有点困惑。
    • 实际上,您在将 Deferred 对象而不是图像对象传递给 drawImage 方法时遇到了问题。我修复了答案并考虑到这一点,并根据您的核心代码添加了一个简化的演示。
    • 顺便说一句,你不应该在 JavaScript 中使用 new Array(),使用文字形式 var framesArr = []。使用对象构造函数时会发生一些怪癖(适用于所有本机类型:字符串、布尔值、数字、函数等)
    • 非常感谢您的澄清,尤其是您的 JSfiddle,您修复了它,现在我明白它为什么以及如何工作了。此外,我不知道使用“新”任何东西都是“不好的做法”,我已经将我的代码附加到它出现的任何地方。 =D 最后,您用作示例的那张照片很可爱。你画了吗? =D 再次感谢!
    • 哈哈,不,那是来自 Octodex 的图片:octodex.github.com 只是为了澄清,它不是没有new 任何东西(继承真的没问题)。它不是new 原生类型。根本的问题是这些构造函数创建了我们所说的 complex object 并且它们变得无法被typeof 使用 - 当然在库中实现了一些解决方法,但是处理一个复杂的对象并不是很好你的同事。例如:typeof new String("hey") === "object" VS typeof "hey" === "string"
    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多