nim-lang / Nim

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
https://nim-lang.org
Other
16.55k stars 1.47k forks source link

`removeEventListener` does not work because raw function is not passed #23921

Open hamidb80 opened 2 months ago

hamidb80 commented 2 months ago

Description

import std/[dom]

proc onkeydownEventHandler(e: Event) =
  echo "hey"

window.addEventListener    "keydown", onkeydownEventHandler
window.removeEventListener "keydown", onkeydownEventHandler
<script src="./play.js"></script>

Nim Version

Nim Compiler Version 2.1.9 [Windows: amd64] Compiled at 2024-07-30 Copyright (c) 2006-2024 by Andreas Rumpf

active boot switches: -d:release

Current Output

`hey` is printed after every key press

Expected Output

it should not not log anything when pressing keys

Possible Solution

here's the produced code when -d:danger:

Temporary1 = onkeydownEventHandler__play_u2.bind(null); Temporary1.ClP_0 = onkeydownEventHandler__play_u2; Temporary1.ClE_0 = null;
window.addEventListener("keydown", Temporary1, false);
Temporary2 = onkeydownEventHandler__play_u2.bind(null); Temporary2.ClP_0 = onkeydownEventHandler__play_u2; Temporary2.ClE_0 = null;
window.removeEventListener("keydown", Temporary2);

it would work simply if the following code would be generated:

window.addEventListener("keydown", onkeydownEventHandler__play_u2, false);
window.removeEventListener("keydown", onkeydownEventHandler__play_u2);

perhaps it is good to allow addr someFunction in js backend for workaround. i.e. the following code should produce the above code:

window.addEventListener    "keydown", addr onkeydownEventHandler
window.removeEventListener "keydown", addr onkeydownEventHandler

Additional Information

No response

ringabout commented 2 months ago

workaround

import std/[dom]

proc onkeydownEventHandler(e: Event) =
  echo "hey"

let e1: proc (event: Event) {.closure.} = onkeydownEventHandler
window.addEventListener    "keydown", e1
window.removeEventListener "keydown", e1