From 62c7da871004255bfb998eb60be5aab91dc070dc Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Tue, 10 Nov 2015 00:43:01 +0000 Subject: [PATCH] Comments: in `comment_form()` when replying to a comment ensure to set focus on the first focusable form element, regardless of what that form element is. Props azaozz. See #29974. git-svn-id: https://develop.svn.wordpress.org/trunk@35593 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/js/comment-reply.js | 79 ++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/src/wp-includes/js/comment-reply.js b/src/wp-includes/js/comment-reply.js index 2f2e3b34e4..bb76a1052c 100644 --- a/src/wp-includes/js/comment-reply.js +++ b/src/wp-includes/js/comment-reply.js @@ -1,47 +1,92 @@ var addComment = { - moveForm : function(commId, parentId, respondId, postId) { - var t = this, div, comm = t.I(commId), respond = t.I(respondId), cancel = t.I('cancel-comment-reply-link'), parent = t.I('comment_parent'), post = t.I('comment_post_ID'); + moveForm: function( commId, parentId, respondId, postId ) { + var div, element, node, style, cssHidden, + t = this, + comm = t.I( commId ), + respond = t.I( respondId ), + cancel = t.I( 'cancel-comment-reply-link' ), + parent = t.I( 'comment_parent' ), + post = t.I( 'comment_post_ID' ), + commentForm = respond.getElementsByTagName( 'form' )[0]; - if ( ! comm || ! respond || ! cancel || ! parent ) + if ( ! comm || ! respond || ! cancel || ! parent || ! commentForm ) { return; + } t.respondId = respondId; postId = postId || false; - if ( ! t.I('wp-temp-form-div') ) { - div = document.createElement('div'); + if ( ! t.I( 'wp-temp-form-div' ) ) { + div = document.createElement( 'div' ); div.id = 'wp-temp-form-div'; div.style.display = 'none'; - respond.parentNode.insertBefore(div, respond); + respond.parentNode.insertBefore( div, respond ); } - comm.parentNode.insertBefore(respond, comm.nextSibling); - if ( post && postId ) + comm.parentNode.insertBefore( respond, comm.nextSibling ); + if ( post && postId ) { post.value = postId; + } parent.value = parentId; cancel.style.display = ''; cancel.onclick = function() { - var t = addComment, temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId); + var t = addComment, + temp = t.I( 'wp-temp-form-div' ), + respond = t.I( t.respondId ); - if ( ! temp || ! respond ) + if ( ! temp || ! respond ) { return; + } - t.I('comment_parent').value = '0'; - temp.parentNode.insertBefore(respond, temp); - temp.parentNode.removeChild(temp); + t.I( 'comment_parent' ).value = '0'; + temp.parentNode.insertBefore( respond, temp ); + temp.parentNode.removeChild( temp ); this.style.display = 'none'; this.onclick = null; return false; }; - try { t.I('comment').focus(); } - catch(e) {} + // Set initial focus to the first form focusable element. + try { + for ( var i = 0; i < commentForm.elements.length; i++ ) { + element = commentForm.elements[i]; + + // Skip form elements that are hidden or disabled. + if ( 'hidden' === element.type || element.hasAttribute( 'disabled' ) ) { + continue; + } + + if ( 'getComputedStyle' in window ) { + node = element; + cssHidden = false; + + while( node.parentNode ) { + style = window.getComputedStyle( node ); + + if ( style.display === 'none' || style.visibility === 'hidden' ) { + cssHidden = true; + break; + } + + node = node.parentNode; + } + + if ( cssHidden ) { + continue; + } + } + + element.focus(); + // Stop after the first focusable element. + break; + } + } catch( er ) {} return false; }, - I : function(e) { - return document.getElementById(e); + I: function( id ) { + return document.getElementById( id ); } };