Adding a loading event listener to an object in JavaScript: A step-by-step guide

I'm currently deep into developing a game using sprites in JavaScript. I've been trying to incorporate an event listener that verifies whether the sprite images have loaded before beginning the game. Employing object-oriented programming, I've encountered a few challenges... Let me present an illustrative example:

function Sprite() {
    this.img = new Image();
    
    // Attempt 1:
    this.img.onload = function() {
        // Code for when image loads
    }

    // Attempt 2:
    this.img.addEventListener("load", function() {
        // Logic following successful load
        // However, implementation details still elude me
    });

    this.img.src = "res/image.png";

    this.draw = function() {
        context.drawImage(// parameters);
    }

    this.move = function() {
        // Functionality for sprite movement
    }
}

Regardless of the approach I take, it seems like nothing is working as expected. The sprites refuse to appear without any evident errors. What could be causing this issue?

Answer №1

To ensure clear capture semantics, declare var self = this;. By using the variable self to reference this, you can easily invoke self.draw within the Sprite's image load function.

The issue may arise from attempting to use this.draw inside the onload method, where this actually refers to the anonymous function rather than the Sprite object. Refer to the example provided below for better understanding.

In addition, it seems that commenters are indicating an error in loading your image. Below is a working example utilizing an image sourced from one of the CDNs often used by Stack Overflow:

var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');

function Sprite() {

    var self = this;
    self.img = new Image();

    self.draw = function() {
        context.drawImage(self.img, 0, 0);
    }

    self.move = function() {
        // code that makes the sprites move
    }

    // alternatively:
    self.img.addEventListener("load", function() {
        self.draw();
    });

    self.img.src = "https://cdn.sstatic.net/img/share-sprite-new.svg?v=78be252218f3g";
}

var s = new Sprite();
<canvas id="canvas" width="300" height="300"></canvas>

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Creating custom validation in Vuetify for password confirmation is essential in ensuring that

While developing a Vue.js template, I encountered a scenario on the sign-up page where I needed to compare passwords during user registration. To achieve this, I implemented a custom validation rule in the code snippet below: <v-text-field label=" ...

Discover the technique for splitting a string using jQuery with multiple strings as separators

I am looking to split a string in jQuery or JavaScript using multiple separators. When we have one string as a separator, our code looks like this: var x = "Name: John Doe\nAge: 30\nBirth Date: 12/12/1981"; var pieces = x.split("\n"), p ...

Issue with FullPageJS: scrollOverflow feature not functioning upon click event

I am currently working on a Fullpage.js instance that needs to be initialized with a click event and then destroyed when switching to another page, and vice versa. The scrollOverflow feature works perfectly as long as the #fullpage element is not hidden up ...

The d3.js Force Directed Graph is not working as expected

I keep encountering an error in the dev console whenever I attempt to run my code. The errors are as follows: Error: missing: 1 3d-force-graph:5:22166 TypeError: r.attributes.position is undefine You can view the live version of the faulty code here: He ...

The function exclusively examines the final element within the array

When validating user-submitted emails in my function, I compare each email to a list of valid email domains. The user emails are stored in an array, as well as the valid email domains. However, the issue arises when using the function as it only checks if ...

Execute the script using ajax

Is it possible to execute JavaScript within an AJAX request? I attempted to include some JavaScript code in the PHP file that was called by an AJAX command. The purpose of this script was to modify an HTML attribute on the parent page. However, it did not ...

Purpose of triggering another function during an ajax request

I have encountered an issue while working on a project. There is a page with an input field called balance within a div named balanceDiv. This field should not be visible to the admin, so I used ng-show to hide/show the div based on the user's login I ...

Extract the value of an HTML tag and store it in a PHP variable

I have successfully implemented JavaScript code to dynamically update the value of an input tag in my popup. However, when I try to echo out this updated value using a PHP variable within the same popup, it doesn't seem to work as expected. Despite un ...

Unlock the lightbox and send the user to the parent page

Is there a way to simultaneously launch a lightbox popup and redirect the parent page? I have an AJAX script that retrieves HTML content as a response. My goal is to display this content in a lightbox popup while also directing the parent window to a des ...

Changing the state using React's useState hook

Why is it considered a bad idea to directly mutate state when using React's new useState hook? I couldn't find any information on this topic. Let's look at the following code: const [values, setValues] = useState({}) // doSomething can be ...

How to manage UNC paths and "mapped network drives" within an Electron application?

I have developed a cross-platform (macOS-Windows) app using Electron that functions smoothly with files and media assets from a local drive. However, it encounters issues when dealing with UNC paths and "mapped network drives". Since I am a contractor, I d ...

Pass information submitted through a JavaScript prompt to an expressjs endpoint

I'm currently facing a challenge in extracting the value from my prompt in order to modify a category using a JavaScript function. Typically, I would rely on a form to pass variables to the request.body, but that's not an option here. This is wh ...

What is the best way to retrieve the latest files from a Heroku application?

Having recently migrated my Discord Bot to Heroku, I faced a challenge with retrieving an updated file essential for code updates. I attempted using both the Git clone command and the Heroku slugs:download command with no success in obtaining the necessar ...

What is the best way to prevent event propagation in d3 with TypeScript?

When working with JavaScript, I often use the following code to prevent event propagation when dragging something. var drag = d3.behavior.drag() .origin(function(d) { return d; }) .on('dragstart', function(e) { d3.event.sourceEvent ...

"Enhance Your Online Shopping Experience with Woocommerce Ajax Filters and

I have a structure that looks like this: Company Google Apple Microsoft Material Wood Metal Plastic Essentially, Brand & Material are attributes in the Woocommerce system, while the rest are variables. I am currently working on implementing AJAX fi ...

Is there a way to use moment js to change the date format to just show the month and year?

Want to transform the date time format using momentjs 2017-02-01T00:00:00.000Z into 02-2017 ( month-year ) Looking for a way to change the date format to display only month-year using momentjs? I attempted it like this: var MnthYr = moment(2017-02-01 ...

How can I deactivate the main color of the FormLabel when the focus is on the radio button group?

Is there a way to change the color of FormLabel to black instead of the primary color when the radio button group is focused? const styles = { formLabel: { color: "#000" }, formLabelFocused: { color: "#000" } }; function App({ classes } ...

Animating elements on a webpage can be achieved by using both

Is there a way to create an animation that moves objects based on button clicks? For example, when the "Monday" button is pressed, the object with the correct color will move down. If any other button like "Tuesday" is clicked, the previous object will mov ...

Positioning Avatar component at the center of Card component

Hello there, I am currently trying to center my <Avatar> elements using Material UI with React within the <Card> components. The layout appears very crowded right now. What would be the most effective method to achieve this? I attempted setti ...

Standing alone, an argument can never be fully validated without

Recently, while delving into the valuable resource titled Effective TypeScript by Dan Vanderkam, I stumbled across an intriguing scenario that left me puzzled. Within a code snippet presented in the book, there was a line - shape; that seemed perplexing ...