@@ -65,6 +65,19 @@ const all_registerd_events = new Set();
65
65
/** @type {Set<(events: Array<string>) => void> } */
66
66
const root_event_handles = new Set ( ) ;
67
67
68
+ /**
69
+ * Add the function on the __binds attribute of the element
70
+ * This allow to handle form's reset correctly
71
+ * @param {Element } dom
72
+ * @param {(this:Element)=>void } fn
73
+ */
74
+ function binds ( dom , fn ) {
75
+ // @ts -ignore
76
+ ( dom . __binds ||= [ ] )
77
+ . push ( fn ) ;
78
+ return fn ;
79
+ }
80
+
68
81
/** @returns {Text } */
69
82
export function empty ( ) {
70
83
return document . createTextNode ( '' ) ;
@@ -918,7 +931,7 @@ export function selected(dom) {
918
931
* @returns {void }
919
932
*/
920
933
export function bind_value ( dom , get_value , update ) {
921
- dom . addEventListener ( 'input' , ( ) => {
934
+ dom . addEventListener ( 'input' , binds ( dom , ( ) => {
922
935
// @ts -ignore
923
936
let value = dom . value ;
924
937
// @ts -ignore
@@ -927,7 +940,7 @@ export function bind_value(dom, get_value, update) {
927
940
value = value === '' ? null : + value ;
928
941
}
929
942
update ( value ) ;
930
- } ) ;
943
+ } ) ) ;
931
944
render_effect ( ( ) => {
932
945
const value = get_value ( ) ;
933
946
const coerced_value = value == null ? null : value + '' ;
@@ -946,7 +959,7 @@ export function bind_value(dom, get_value, update) {
946
959
*/
947
960
export function bind_select_value ( dom , get_value , update ) {
948
961
let mounting = true ;
949
- dom . addEventListener ( 'change' , ( ) => {
962
+ dom . addEventListener ( 'change' , binds ( dom , ( ) => {
950
963
/** @type {unknown } */
951
964
let value ;
952
965
if ( dom . multiple ) {
@@ -957,7 +970,7 @@ export function bind_select_value(dom, get_value, update) {
957
970
value = selected_option && get_option_value ( selected_option ) ;
958
971
}
959
972
update ( value ) ;
960
- } ) ;
973
+ } ) ) ;
961
974
// Needs to be an effect, not a render_effect, so that in case of each loops the logic runs after the each block has updated
962
975
effect ( ( ) => {
963
976
let value = get_value ( ) ;
@@ -1048,14 +1061,14 @@ export function bind_group(group, group_index, dom, get_value, update) {
1048
1061
}
1049
1062
}
1050
1063
binding_group . push ( dom ) ;
1051
- dom . addEventListener ( 'change' , ( ) => {
1064
+ dom . addEventListener ( 'change' , binds ( dom , ( ) => {
1052
1065
// @ts -ignore
1053
1066
let value = dom . __value ;
1054
1067
if ( is_checkbox ) {
1055
1068
value = get_binding_group_value ( binding_group , value , dom . checked ) ;
1056
1069
}
1057
1070
update ( value ) ;
1058
- } ) ;
1071
+ } ) ) ;
1059
1072
render_effect ( ( ) => {
1060
1073
let value = get_value ( ) ;
1061
1074
if ( is_checkbox ) {
@@ -1084,10 +1097,10 @@ export function bind_group(group, group_index, dom, get_value, update) {
1084
1097
* @returns {void }
1085
1098
*/
1086
1099
export function bind_checked ( dom , get_value , update ) {
1087
- dom . addEventListener ( 'change' , ( ) => {
1100
+ dom . addEventListener ( 'change' , binds ( dom , ( ) => {
1088
1101
const value = dom . checked ;
1089
1102
update ( value ) ;
1090
- } ) ;
1103
+ } ) ) ;
1091
1104
// eslint-disable-next-line eqeqeq
1092
1105
if ( get_value ( ) == undefined ) {
1093
1106
update ( false ) ;
0 commit comments