bind mouseenter/leave events on <svelte:window> to document (#1484)

pull/1506/head
Conduitry 7 years ago
parent 54799736b8
commit d901d70edc

@ -33,6 +33,11 @@ const readonly = new Set([
'online', 'online',
]); ]);
const specialEventTargets = new Map([
['mouseenter', 'document'],
['mouseleave', 'document'],
]);
export default class Window extends Node { export default class Window extends Node {
type: 'Window'; type: 'Window';
handlers: EventHandler[]; handlers: EventHandler[];
@ -93,15 +98,17 @@ export default class Window extends Node {
${handlerName}.destroy(); ${handlerName}.destroy();
`); `);
} else { } else {
const target = specialEventTargets.get(handler.name) || 'window';
block.builders.init.addBlock(deindent` block.builders.init.addBlock(deindent`
function ${handlerName}(event) { function ${handlerName}(event) {
${handlerBody} ${handlerBody}
} }
window.addEventListener("${handler.name}", ${handlerName}); ${target}.addEventListener("${handler.name}", ${handlerName});
`); `);
block.builders.destroy.addBlock(deindent` block.builders.destroy.addBlock(deindent`
window.removeEventListener("${handler.name}", ${handlerName}); ${target}.removeEventListener("${handler.name}", ${handlerName});
`); `);
} }
}); });

@ -0,0 +1,11 @@
export default {
test(assert, component, target, window) {
assert.equal(component.get().events.toString(), '');
const event1 = new window.Event('mouseenter');
window.document.dispatchEvent(event1);
assert.equal(component.get().events.toString(), 'enter');
const event2 = new window.Event('mouseleave');
window.document.dispatchEvent(event2);
assert.equal(component.get().events.toString(), 'enter,leave');
},
};

@ -0,0 +1,12 @@
<svelte:window on:mouseenter='log("enter")' on:mouseleave='log("leave")'/>
<script>
export default {
data: () => ({ events: [] }),
methods: {
log(event) {
this.set({ events: this.get().events.concat(event) });
},
},
};
</script>
Loading…
Cancel
Save