drawImage doesn't work when I refer to an image in another javascript file

元气小坏坏 提交于 2020-01-11 11:29:09

问题


(I'll show the pure javascript below) I've got these two lines of code that are, in my mind, doing the exact same thing but one of them reports an error. This appears in a file named "Rendering.coffee". Here are the two lines (in coffeescript):

...
ctx.drawImage(document.getElementById("bg"), 0, 0)  #this works
ctx.drawImage(root.resources.bg, 0, 0)  #TypeError: Value could not be converted to any of: HTMLImageElement, HTMLCanvasElement, HTMLVideoElement.
...

I assign root.resources.bg in another file named "Resources.coffee" like this:

root = exports ? this
root.resources = {}

root.resources.bg = document.getElementById("bg")

Here's the html that loads all the code:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Canvas tutorial</title>

    <script src="Resources.js" type="text/javascript"></script>
    <script src="Rendering.js" type="text/javascript"></script>


    <style>
        canvas {
            border: 1px solid black;
        }
    </style>

</head>

<body onload="window['core'].startGame();">
<canvas id="canvas" width="640" height="480"></canvas>
<img id="bg" src="bg.png" style="display: none">

</body>
</html>

When I change the rendering code to this, I get no error:

root.resources.bg = document.getElementById("bg")
ctx.drawImage(root.resources.bg, 0, 0)

or

bg = document.getElementById("bg")
ctx.drawImage(bg, 0, 0)

That makes me think there's something more fundamentally wrong here. Can I only use img tags after I've already created the canvas context? If I change my "Resources.js" to print out the value of the bg variable it prints "null", but if I print it in the "Rendering.js" it prints [object HTMLImageElement] Why is it null in the "Resources.js"?

This is firefox, by the way.


Javascript

Rendering.js:

...
ctx.drawImage(document.getElementById("bg"), 0, 0);
ctx.drawImage(root.resources.bg, 0, 0);
...

Resources.js:

// Generated by CoffeeScript 1.6.2
(function() {
  var root;

  root = typeof exports !== "undefined" && exports !== null ? exports : this;

  root.resources = {};

  root.resources.bg = document.getElementById("bg");

}).call(this);

TL;DR: Why am I getting this error when I assign my image outside of my rendering function? #TypeError: Value could not be converted to any of: HTMLImageElement, HTMLCanvasElement, HTMLVideoElement.


My First Attempt at a Solution

This worked for me, but I'm not sure if it's a good solution:

root = exports ? this
root.resources = {}

bgResource = undefined

root.resources.bg = ->
  if not bgResource
    bgResource = document.getElementById("bg")
  return bgResource

Then I call this as root.resources.bg()


回答1:


You can try to solve this two ways -

Method 1

Move the scripts to the bottom of the file before the closing tag </body>. This way all DOM elements are loaded before any JavaScript is executed.

Method 2

Try to wrap all inits that are dependent on DOM elements in the window's load event inside the script files themselves in case you cannot or don't want to move them to the bottom:

window.addEventListener('load', function() {

    /// init the resource here...

}, false);


来源:https://stackoverflow.com/questions/17913486/drawimage-doesnt-work-when-i-refer-to-an-image-in-another-javascript-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!