Editor: Fix improper triggering of the "Are you sure" prompt when navigating away from the old, "classic" Edit Post screen and there are no changes. Was triggered when there is an instance of TinyMCE in the Excerpt postbox.

Props rodrigosprimo, jonathanstegall, kevin940726, azaozz.
Fixes #52038.

git-svn-id: https://develop.svn.wordpress.org/trunk@49807 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Andrew Ozz 2020-12-16 15:23:35 +00:00
parent 2ea3033c0d
commit 3f12f0e77c
2 changed files with 60 additions and 10 deletions

View File

@ -488,12 +488,20 @@ jQuery(document).ready( function($) {
* When the user is trying to load another page, or reloads current page
* show a confirmation dialog when there are unsaved changes.
*/
$(window).on( 'beforeunload.edit-post', function() {
var editor = typeof tinymce !== 'undefined' && tinymce.get('content');
$( window ).on( 'beforeunload.edit-post', function( event ) {
var editor = window.tinymce && window.tinymce.get( 'content' );
var changed = false;
if ( ( editor && ! editor.isHidden() && editor.isDirty() ) ||
( wp.autosave && wp.autosave.server.postChanged() ) ) {
if ( wp.autosave ) {
changed = wp.autosave.server.postChanged();
} else if ( editor ) {
changed = ( ! editor.isHidden() && editor.isDirty() );
}
if ( changed ) {
event.preventDefault();
// The return string is needed for browser compat.
// See https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event.
return __( 'The changes you made will be lost if you navigate away from this page.' );
}
}).on( 'unload.edit-post', function( event ) {

View File

@ -36,8 +36,24 @@ window.autosave = function() {
*/
function autosave() {
var initialCompareString,
lastTriggerSave = 0,
$document = $(document);
initialCompareData = {},
lastTriggerSave = 0,
$document = $( document );
/**
* Sets the initial compare data.
*
* @since 5.6.1
*/
function setInitialCompare() {
initialCompareData = {
post_title: $( '#title' ).val() || '',
content: $( '#content' ).val() || '',
excerpt: $( '#excerpt' ).val() || ''
};
initialCompareString = getCompareString( initialCompareData );
}
/**
* Returns the data saved in both local and remote autosave.
@ -686,6 +702,32 @@ window.autosave = function() {
* @return {boolean} True if the post has been changed.
*/
function postChanged() {
var changed = false;
// If there are TinyMCE instances, loop through them.
if ( window.tinymce ) {
window.tinymce.each( [ 'content', 'excerpt' ], function( field ) {
var editor = window.tinymce.get( field );
if ( ! editor || editor.isHidden() ) {
if ( $( '#' + field ).val() !== initialCompareData[ field ] ) {
changed = true;
// Break.
return false;
}
} else if ( editor.isDirty() ) {
changed = true;
return false;
}
} );
if ( $( '#title' ).val() !== initialCompareData.post_title ) {
changed = true;
}
return changed;
}
return getCompareString() !== initialCompareString;
}
@ -832,16 +874,16 @@ window.autosave = function() {
* @return {void}
*/
$document.on( 'tinymce-editor-init.autosave', function( event, editor ) {
if ( editor.id === 'content' ) {
// Reset the initialCompare data after the TinyMCE instances have been initialized.
if ( 'content' === editor.id || 'excerpt' === editor.id ) {
window.setTimeout( function() {
editor.save();
initialCompareString = getCompareString();
setInitialCompare();
}, 1000 );
}
}).ready( function() {
// Set the initial compare string in case TinyMCE is not used or not loaded first.
initialCompareString = getCompareString();
setInitialCompare();
});
return {