wp/wp-includes/js/comment-reply.js
changeset 7 cf61fcea0001
parent 5 5e2f62d02dcd
child 9 177826044cd9
--- a/wp/wp-includes/js/comment-reply.js	Tue Jun 09 11:14:17 2015 +0000
+++ b/wp/wp-includes/js/comment-reply.js	Mon Oct 14 17:39:30 2019 +0200
@@ -1,47 +1,127 @@
+/**
+ * @summary Handles the addition of the comment form.
+ *
+ * @since 2.7.0
+ *
+ * @type {Object}
+ */
 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');
+	/**
+	 * @summary Retrieves the elements corresponding to the given IDs.
+	 *
+	 * @since 2.7.0
+	 *
+	 * @param {string} commId The comment ID.
+	 * @param {string} parentId The parent ID.
+	 * @param {string} respondId The respond ID.
+	 * @param {string} postId The post ID.
+	 * @returns {boolean} Always returns false.
+	 */
+	moveForm: function( commId, parentId, respondId, postId ) {
+		var div, element, 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 = '';
 
+		/**
+		 * @summary Puts back the comment, hides the cancel button and removes the onclick event.
+		 *
+		 * @returns {boolean} Always returns false.
+		 */
 		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) {}
+		/*
+		 * Sets initial focus to the first form focusable element.
+		 * Uses try/catch just to avoid errors in IE 7- which return visibility
+		 * 'inherit' when the visibility value is inherited from an ancestor.
+		 */
+		try {
+			for ( var i = 0; i < commentForm.elements.length; i++ ) {
+				element = commentForm.elements[i];
+				cssHidden = false;
+
+				// Modern browsers.
+				if ( 'getComputedStyle' in window ) {
+					style = window.getComputedStyle( element );
+				// IE 8.
+				} else if ( document.documentElement.currentStyle ) {
+					style = element.currentStyle;
+				}
+
+				/*
+				 * For display none, do the same thing jQuery does. For visibility,
+				 * check the element computed style since browsers are already doing
+				 * the job for us. In fact, the visibility computed style is the actual
+				 * computed value and already takes into account the element ancestors.
+				 */
+				if ( ( element.offsetWidth <= 0 && element.offsetHeight <= 0 ) || style.visibility === 'hidden' ) {
+					cssHidden = true;
+				}
+
+				// Skip form elements that are hidden or disabled.
+				if ( 'hidden' === element.type || element.disabled || cssHidden ) {
+					continue;
+				}
+
+				element.focus();
+				// Stop after the first focusable element.
+				break;
+			}
+
+		} catch( er ) {}
 
 		return false;
 	},
 
-	I : function(e) {
-		return document.getElementById(e);
+	/**
+	 * @summary Returns the object corresponding to the given ID.
+	 *
+	 * @since 2.7.0
+	 *
+	 * @param {string} id The ID.
+	 * @returns {Element} The element belonging to the ID.
+	 */
+	I: function( id ) {
+		return document.getElementById( id );
 	}
 };