Skip to content

Commit 3757e75

Browse files
authoredAug 13, 2017
Merge pull request #766 from sveltejs/gh-740
bind to change events for range inputs, as well as input events
2 parents 2b41b83 + da6b08c commit 3757e75

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed
 

‎src/generators/dom/visitors/Element/Binding.ts

+20-7
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,26 @@ export default function visitBinding(
156156
}
157157
`);
158158

159-
block.builders.hydrate.addBlock(
160-
`@addListener( ${state.parentNode}, '${eventName}', ${handler} );`
161-
);
159+
if (node.name === 'input' && type === 'range') {
160+
// need to bind to `input` and `change`, for the benefit of IE
161+
block.builders.hydrate.addBlock(deindent`
162+
@addListener( ${state.parentNode}, 'input', ${handler} );
163+
@addListener( ${state.parentNode}, 'change', ${handler} );
164+
`);
165+
166+
block.builders.destroy.addBlock(deindent`
167+
@removeListener( ${state.parentNode}, 'input', ${handler} );
168+
@removeListener( ${state.parentNode}, 'change', ${handler} );
169+
`);
170+
} else {
171+
block.builders.hydrate.addLine(
172+
`@addListener( ${state.parentNode}, '${eventName}', ${handler} );`
173+
);
174+
175+
block.builders.destroy.addLine(
176+
`@removeListener( ${state.parentNode}, '${eventName}', ${handler} );`
177+
);
178+
}
162179

163180
if (node.name !== 'audio' && node.name !== 'video') {
164181
node.initialUpdate = updateElement;
@@ -174,10 +191,6 @@ export default function visitBinding(
174191
`);
175192
}
176193

177-
block.builders.destroy.addLine(
178-
`@removeListener( ${state.parentNode}, '${eventName}', ${handler} );`
179-
);
180-
181194
if (attribute.name === 'paused') {
182195
block.builders.create.addLine(
183196
`@addListener( ${state.parentNode}, 'play', ${handler} );`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export default {
2+
data: {
3+
count: 42
4+
},
5+
6+
html: `
7+
<input type='range'>
8+
<p>number 42</p>
9+
`,
10+
11+
test ( assert, component, target, window ) {
12+
const input = target.querySelector( 'input' );
13+
assert.equal( input.value, '42' );
14+
15+
const event = new window.Event( 'change' );
16+
17+
input.value = '43';
18+
input.dispatchEvent( event );
19+
20+
assert.equal( component.get( 'count' ), 43 );
21+
assert.htmlEqual( target.innerHTML, `
22+
<input type='range'>
23+
<p>number 43</p>
24+
` );
25+
26+
component.set({ count: 44 });
27+
assert.equal( input.value, '44' );
28+
assert.htmlEqual( target.innerHTML, `
29+
<input type='range'>
30+
<p>number 44</p>
31+
` );
32+
}
33+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input type='range' bind:value='count'>
2+
<p>{{typeof count}} {{count}}</p>

0 commit comments

Comments
 (0)