Javascript - How to Generate an Array of Image Elements for Canvas Rendering?

Struggling to craft an array of image objects and load them in a canvas after the window has fully loaded.

Take a look at the code I've written:

var canvasObj = document.getElementById('myCanvas');
var ctx = canvasObj.getContext('2d');
var imgsrcs = ["1.png", "2.png", "3.png"];
var imgs = [];
for(var i=0; i<imgsrcs.length; i++){
    imgs[i] = new Image();
    imgs[i].onload = function () {
        ctx.drawImage(imgs[i], xb,yb);
    }
    imgs[i].src = imgsrcs[i];
}

However, upon checking the console, I encountered this error message:

TypeError: Argument 1 of CanvasRenderingContext2D.drawImage could not be converted to any of: HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageBitmap.
ctx.drawImage(imgs[i], xb,yb);

Can someone help me identify the issue here?

Your assistance is greatly appreciated.

Answer №1

When the onload event is triggered, the for-loop has already iterated, causing the value of i to be length+1. Since there is no element at index length+1, undefined is passed as the first argument for ctx.drawImage

Ensure to utilize the this context in the drawImage method where this refers to the Image-Object

var canvasObj = document.getElementById('myCanvas');
var ctx = canvasObj.getContext('2d');
var imgsrcs = ["http://i.imgur.com/gwlPu.jpg", "http://i.imgur.com/PWSOy.jpg", "http://i.imgur.com/6l6v2.png"];
var xb = 0,
  yb = 0;
var imgs = [];
for (var i = 0; i < imgsrcs.length; i++) {
  imgs[i] = new Image();
  imgs[i].onload = function() {
    console.log(imgs[i]); //Check this value
    ctx.drawImage(this, xb, yb);
    xb += 50;
    yb += 50;
  }
  imgs[i].src = imgsrcs[i];
}
<canvas id="myCanvas"></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

Utilize AJAX, jQuery, and Symfony2 to showcase array information in a visually appealing table format

I have a requirement to showcase data utilizing ajax and jQuery in a table on my twig file. The ajax call is made with a post request to the controller, where the controller attempts to input several rows from a csv file into the database. However, there ...

refresh the localstorage array using vanilla JavaScript

I am attempting to remove an element from an array stored in local storage. I am using vanilla JavaScript within a Vue.js 3 component. Here is my array: ["96", "281", "287", "415", "650", "661", & ...

Path not being rewritten upon page refresh in the @Nuxtjs/proxy module

Currently, I am tackling a Nuxt project involving the utilization of axios to retrieve information from an API on the backend through the use of asyncData. Additionally, I have incorporated the @nuxtjs/proxy module as a dependency to handle all my API requ ...

Retrieve all entries in MongoDB using Mongoose where a particular date falls within a specified date range

Consider a scenario where documents contain the fields: startDate: 2021-04-14T22:00:00.000+00:00 endDate: 2021-04-19T22:00:00.000+00:00 You want to retrieve all documents where a specific date (e.g., today) falls within the date range. Is it possible to c ...

Scrolling the Html5 canvas smoothly without the need for constant re-rendering

Is it feasible to achieve smooth panning on an HTML5 canvas without the need for rerendering? Are there any examples of code that demonstrate this functionality? Furthermore, is it also possible to apply the same technique for zooming? I am experiencing ...

Tips for submitting a form and retrieving session count without the need to refresh the page after submitting the form

I have set up a form that includes hidden input fields to send data to a PHP script. The script stores the values in an array of sessions by using AJAX to reload the page. Once the data is submitted successfully, an HTML alert message is displayed in <p ...

Troubleshooting Problems with Angular Directive Parameters

I'm currently working on a directive that will receive arguments from the HTML and use them to fill in the template fields. Here's the code for the directive: (function(){ angular.module("MyApp",{}) .directive("myDirective",function(){ ...

Tabs fail to load any content within their designated tab-panes

Struggling to create a bootstrap site with nav-tabs navigation. Can't figure out why the content isn't loading in the tab-pane. The tutorial works, but my project doesn't. Any assistance would be appreciated. I want the tabbed content to dis ...

If the size property varies while the ID keys remain constant, then the item can be added to the cart

I have implemented a cart insertion system that adds items to it based on specific rules: Initially, I initialize an empty array for the cart items: `let cartItems = [];` Each item in the array is a Product object with defined properties: { "id": 10, "na ...

Seeking the location of the `onconnect` event within the Express framework

With the use of "express," I have implemented a middleware function like so: app.use(function(request, response, next) { console.log(request.headers["user-agent"]); // etc. }); This currently displays the user-agent header in the console for ever ...

JavaScript Subscribe / Unsubscribe Button

I am trying to create a simple JavaScript program that allows users to like and dislike content. However, I am new to JavaScript and finding it a bit challenging. Basically, when the user clicks on the Follow button, the "countF" variable should increase ...

Obtaining page information from a frame script in e10s-enabled Firefox: A guide

One of the challenges I'm facing is with my Firefox extension, where a function loads page information using the following code: var title = content.document.title; var url = content.document.location.href; However, with the implementation of multi- ...

Can I use Mongoose to apply a filter to this request?

I have a requirement to query all products with the category status set to true. My product model looks like this: const ProductSchema = Schema({ name : {type: String}, category: {type: Schema.Types.ObjectId, ref: 'Category'} }) Normally, I wou ...

HTML: Ensure that a user fills out a minimum of one text box before submission

<tr><td> First Name: </td><td><input type="text" name="FirstName" required></td> </tr> <tr><td> Last Name: </td><td><input type="text" name="LastName" required> </td></tr> ...

Build a dynamic table by leveraging JSON with the power of JavaScript and HTML

I'm currently working on creating a table where information is stored and updated (not appended) in a JSON file using JavaScript and HTML. The structure of my JSON data looks like this: [{ "A": { "name": "MAK", "height": 170, ...

When sending large amounts of data using JQuery's ajax function with the POST method, it may not send the

While working on my Electron application, I encountered a problem with calling an API using the jQuery $.ajax function. When sending large data sets, part of the data was being truncated. However, when I tested the same request in POSTMAN, the server recei ...

Hover shows no response

I'm having trouble with my hover effect. I want an element to only be visible when hovered over, but it's not working as expected. I've considered replacing the i tag with an a, and have also tried using both display: none and display: bloc ...

What is the best way to retrieve "text" from a function using JavaScript with Selenium web driver?

Update: The solution provided by Jonas has successfully resolved most of the issues. Currently, I am exploring options to utilize datepicker or sendkeys to set the date range as it continues to increment by one day each time the code is rerun. date_start = ...

Stop the stream coming from getUserMedia

After successfully channeling the stream from getUserMedia to a <video> element on the HTML page, I am able to view the video in that element. However, I have encountered an issue where if I pause the video using the controls on the video element a ...

Using Typescript to handle the return value of asynchronous functions

In the TypeScript function below, I am encountering an issue: CheckRegUser(u: User): boolean { let b: boolean = true; let toSend = { email: u.email }; this.http.post("http://localhost:8080/", toSend).subscribe((data: Valid) => { ...