So, at the top of your code, you can define an interval variable to store the interval in and allow it to be accessible anywhere:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const effect = $('#canvas'); // <-- you can also define `effect` here since it'll be used in both functions.
let interval = 0;
...
Since you want to hide and show the element, you can create two functions:
hide(), which will run only if interval != 0, and it will: (1) stop the interval, (2) set interval to 0 so we can check if it was already stopped (so you don't run the function multiple times), and (2) stop the animation and hide the canvas.
show(), which will run only if interval == 0, and it will: (1) unhide the canvas, (2) reset the interval.
Now, at the bottom of your code, where you create the interval, you can create the hide and show functions:
hide()
const hide = () => {
if(interval) {
clearInterval(interval);
interval = 0;
effect.finish().stop().hide() // finish and stop the effect, and hide the canvas
}
}
show()
const show = () => {
if(!interval) { // if `interval` is equal to 0
effect.show()
interval = setInterval(function () {
effect.fadeIn(1000, function () {
effect.fadeOut(1500, function () {
effect.fadeIn(1500)
});
});
}, 3000);
}
}
...and, of course, call show() on load:
$(show);
Here's a demo:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
let interval = 0;
const effect = $('#canvas');
const image = new Image('naturalWidth', 'naturalHeight'); // Using optional size for image
image.onload = drawImageActualSize; // Draw when image has loaded
// Load an image of intrinsic size 300x227 in CSS pixels
image.src = 'https://via.placeholder.com/100'
function drawImageActualSize() {
// Use the intrinsic size of image in CSS pixels for the canvas element
canvas.width = this.naturalWidth;
canvas.height = this.naturalHeight;
// Will draw the image as 300x227, ignoring the custom size of 60x45
// given in the constructor
ctx.drawImage(this, 0, 0);
}
const show = () => {
if(!interval) { // if `interval` is equal to 0
effect.show()
interval = setInterval(function () {
effect.fadeIn(1000, function () {
effect.fadeOut(1500, function () {
effect.fadeIn(1500)
});
});
}, 3000);
}
}
const hide = () => {
if(interval) {
clearInterval(interval);
interval = 0;
effect.finish().stop().hide() // finish and stop the effect, and hide the canvas
}
}
$(show);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<canvas id="canvas"></canvas>
<br>
<button onclick="hide()" />Hide</button>
<button onclick="show()" />Show</button>