Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions src/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -557,16 +557,11 @@ jQuery.event = {
},

beforeunload: {
setup: function( data, namespaces, eventHandle ) {
// We only want to do this special case on windows
if ( jQuery.isWindow( this ) ) {
this.onbeforeunload = eventHandle;
}
},
postDispatch: function( event ) {

teardown: function( namespaces, eventHandle ) {
if ( this.onbeforeunload === eventHandle ) {
this.onbeforeunload = null;
// Even when returnValue equals to undefined Firefox will still show alert
if ( event.result !== undefined ) {
event.originalEvent.returnValue = event.result;
}
}
}
Expand Down
61 changes: 52 additions & 9 deletions test/unit/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -1391,20 +1391,63 @@ test("Submit event can be stopped (#11049)", function() {
form.remove();
});

test("on(beforeunload) creates/deletes window property instead of adding/removing event listener", function() {
expect(3);
// Test beforeunload event only if it supported (i.e. not Opera)
if ( window.onbeforeunload === null ) {
asyncTest("on(beforeunload)", 4, function() {
var doc,
forIE6 = 0,
iframe = jQuery('<iframe src="data/iframe.html" />');

iframe.appendTo("#qunit-fixture").one( "load", function() {
doc = iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument;

jQuery( doc ).on( "beforeunload", function() {
ok( true, "beforeunload event is fired" );
});

strictEqual( doc.onbeforeunload, null, "onbeforeunload property on window object still equals null" );

jQuery( doc ).on( "beforeunload", function() {

// On iframe in IE6 beforeunload event will not fire if event is binded through window object,
// nevertheless, test should continue
window.setTimeout(function() {
if ( !forIE6 ) {
checker();
}
});
});

doc.onbeforeunload = function() {
if ( !forIE6 ) {
forIE6++;
checker();
}
};

equal( window.onbeforeunload, null, "window property is null/undefined up until now" );
function checker() {
ok( true, "window.onbeforeunload handler is called" );
iframe = jQuery('<iframe src="data/iframe.html" />');

var handle = function () {};
jQuery(window).on( "beforeunload", handle );
iframe.appendTo("#qunit-fixture").one( "load", function() {
doc = iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument;

equal( typeof window.onbeforeunload, "function", "window property is set to a function");
jQuery( doc ).on( "beforeunload", function() {
strictEqual( doc.onbeforeunload, null, "Event handler is fired, even when onbeforeunload property on window is nulled" );

jQuery(window).off( "beforeunload", handle );
start();
});

equal( window.onbeforeunload, null, "window property has been unset to null/undefined" );
});
doc.onbeforeunload = null;

doc.location.reload();
});
}

doc.location.reload();
});
});
}

test("jQuery.Event( type, props )", function() {

Expand Down