From e6e449682289f47ac5dab53b5cc07e884b17ee0b Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Tue, 10 Nov 2015 00:43:26 +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. Built from https://develop.svn.wordpress.org/trunk@35593 git-svn-id: http://core.svn.wordpress.org/trunk@35557 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/js/comment-reply.js | 79 ++++++++++++++++++++++------- wp-includes/js/comment-reply.min.js | 2 +- wp-includes/version.php | 2 +- 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/wp-includes/js/comment-reply.js b/wp-includes/js/comment-reply.js index 2f2e3b34e4..bb76a1052c 100644 --- a/wp-includes/js/comment-reply.js +++ b/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 ); } }; diff --git a/wp-includes/js/comment-reply.min.js b/wp-includes/js/comment-reply.min.js index 11af308f3b..6c6c4593e3 100644 --- a/wp-includes/js/comment-reply.min.js +++ b/wp-includes/js/comment-reply.min.js @@ -1 +1 @@ -var addComment={moveForm:function(a,b,c,d){var e,f=this,g=f.I(a),h=f.I(c),i=f.I("cancel-comment-reply-link"),j=f.I("comment_parent"),k=f.I("comment_post_ID");if(g&&h&&i&&j){f.respondId=c,d=d||!1,f.I("wp-temp-form-div")||(e=document.createElement("div"),e.id="wp-temp-form-div",e.style.display="none",h.parentNode.insertBefore(e,h)),g.parentNode.insertBefore(h,g.nextSibling),k&&d&&(k.value=d),j.value=b,i.style.display="",i.onclick=function(){var a=addComment,b=a.I("wp-temp-form-div"),c=a.I(a.respondId);if(b&&c)return a.I("comment_parent").value="0",b.parentNode.insertBefore(c,b),b.parentNode.removeChild(b),this.style.display="none",this.onclick=null,!1};try{f.I("comment").focus()}catch(l){}return!1}},I:function(a){return document.getElementById(a)}}; \ No newline at end of file +var addComment={moveForm:function(a,b,c,d){var e,f,g,h,i,j=this,k=j.I(a),l=j.I(c),m=j.I("cancel-comment-reply-link"),n=j.I("comment_parent"),o=j.I("comment_post_ID"),p=l.getElementsByTagName("form")[0];if(k&&l&&m&&n&&p){j.respondId=c,d=d||!1,j.I("wp-temp-form-div")||(e=document.createElement("div"),e.id="wp-temp-form-div",e.style.display="none",l.parentNode.insertBefore(e,l)),k.parentNode.insertBefore(l,k.nextSibling),o&&d&&(o.value=d),n.value=b,m.style.display="",m.onclick=function(){var a=addComment,b=a.I("wp-temp-form-div"),c=a.I(a.respondId);if(b&&c)return a.I("comment_parent").value="0",b.parentNode.insertBefore(c,b),b.parentNode.removeChild(b),this.style.display="none",this.onclick=null,!1};try{for(var q=0;q