Skip to content

Commit 874285e

Browse files
author
Gabriel Schulhof
committed
Panel: Do not close in response to a default-prevented swipe event
Fixes jquery-archivegh-6925 Closes jquery-archivegh-6947
1 parent 02d2503 commit 874285e

File tree

3 files changed

+54
-15
lines changed

3 files changed

+54
-15
lines changed

js/widgets/panel.js

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -233,21 +233,19 @@ $.widget( "mobile.panel", {
233233
}
234234
},
235235

236+
_handleSwipe: function( event ) {
237+
if ( !event.isDefaultPrevented() ) {
238+
this.close();
239+
}
240+
},
241+
236242
_bindSwipeEvents: function() {
237-
var self = this,
238-
area = self._modal ? self.element.add( self._modal ) : self.element;
243+
var handler = {};
239244

240-
// on swipe, close the panel
241-
if ( !!self.options.swipeClose ) {
242-
if ( self.options.position === "left" ) {
243-
area.on( "swipeleft.panel", function(/* e */) {
244-
self.close();
245-
});
246-
} else {
247-
area.on( "swiperight.panel", function(/* e */) {
248-
self.close();
249-
});
250-
}
245+
// Close the panel on swipe if the swipe event's default is not prevented
246+
if ( this.options.swipeClose ) {
247+
handler[ "swipe" + this.options.position ] = "_handleSwipe";
248+
this._on( ( this._modal ? this.element.add( this._modal ) : this.element ), handler );
251249
}
252250
},
253251

@@ -487,7 +485,6 @@ $.widget( "mobile.panel", {
487485

488486
this.element
489487
.removeClass( [ this._getPanelClasses(), o.classes.panelOpen, o.classes.animate ].join( " " ) )
490-
.off( "swipeleft.panel swiperight.panel" )
491488
.off( "panelbeforeopen" )
492489
.off( "panelhide" )
493490
.off( "keyup.panel" )

tests/unit/panel/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<p>Contents of a panel.</p>
5656
</div>
5757
<div data-nstest-role="panel" id="panel-test-dismiss">
58+
<input id="dismiss-input"></input>
5859
<p>Contents of a panel.</p>
5960
</div>
6061
<div data-nstest-role="panel" id="panel-test-destroy">

tests/unit/panel/panel_core.js

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,48 @@
264264

265265
});
266266

267-
asyncTest( "swipe on dismissable modal closes panel", function() {
267+
asyncTest( "swipe on dismissible panel does not close panel if the default is prevented",
268+
function() {
269+
var panel = $( "#panel-test-dismiss" ),
270+
eventNs = ".swipeDoesNotClosePanel",
271+
input = $( "#dismiss-input" ).one( "swipeleft", function( event ) {
272+
event.preventDefault();
273+
});
274+
275+
expect( 1 );
276+
277+
$.testHelper.detailedEventCascade([
278+
function() {
279+
panel.panel( "open" );
280+
},
281+
282+
{
283+
panelopen: { src: panel, event: "panelopen" + eventNs + "1" }
284+
},
285+
286+
function() {
287+
input.trigger( "swipeleft" );
288+
},
289+
290+
{
291+
panelclose: { src: panel, event: "panelclose" + eventNs + "2" }
292+
},
293+
294+
function( result ) {
295+
deepEqual( result.panelclose.timedOut, true,
296+
"panelclose event did not happen in response to swipe on child input" );
297+
panel.panel( "close" );
298+
},
299+
300+
{
301+
panelclose: { src: panel, event: "panelclose" + eventNs + "3" }
302+
},
303+
304+
start
305+
]);
306+
});
307+
308+
asyncTest( "swipe on dismissible modal closes panel", function() {
268309

269310
expect( 1 );
270311

0 commit comments

Comments
 (0)