Make WordPress Core

Changeset 35593


Ignore:
Timestamp:
11/10/2015 12:43:01 AM (9 years ago)
Author:
afercia
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/js/comment-reply.js

    r26195 r35593  
    11var addComment = {
    2     moveForm : function(commId, parentId, respondId, postId) {
    3         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');
     2    moveForm: function( commId, parentId, respondId, postId ) {
     3        var div, element, node, style, cssHidden,
     4            t           = this,
     5            comm        = t.I( commId ),
     6            respond     = t.I( respondId ),
     7            cancel      = t.I( 'cancel-comment-reply-link' ),
     8            parent      = t.I( 'comment_parent' ),
     9            post        = t.I( 'comment_post_ID' ),
     10            commentForm = respond.getElementsByTagName( 'form' )[0];
    411
    5         if ( ! comm || ! respond || ! cancel || ! parent )
     12        if ( ! comm || ! respond || ! cancel || ! parent || ! commentForm ) {
    613            return;
     14        }
    715
    816        t.respondId = respondId;
    917        postId = postId || false;
    1018
    11         if ( ! t.I('wp-temp-form-div') ) {
    12             div = document.createElement('div');
     19        if ( ! t.I( 'wp-temp-form-div' ) ) {
     20            div = document.createElement( 'div' );
    1321            div.id = 'wp-temp-form-div';
    1422            div.style.display = 'none';
    15             respond.parentNode.insertBefore(div, respond);
     23            respond.parentNode.insertBefore( div, respond );
    1624        }
    1725
    18         comm.parentNode.insertBefore(respond, comm.nextSibling);
    19         if ( post && postId )
     26        comm.parentNode.insertBefore( respond, comm.nextSibling );
     27        if ( post && postId ) {
    2028            post.value = postId;
     29        }
    2130        parent.value = parentId;
    2231        cancel.style.display = '';
    2332
    2433        cancel.onclick = function() {
    25             var t = addComment, temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId);
     34            var t       = addComment,
     35                temp    = t.I( 'wp-temp-form-div' ),
     36                respond = t.I( t.respondId );
    2637
    27             if ( ! temp || ! respond )
     38            if ( ! temp || ! respond ) {
    2839                return;
     40            }
    2941
    30             t.I('comment_parent').value = '0';
    31             temp.parentNode.insertBefore(respond, temp);
    32             temp.parentNode.removeChild(temp);
     42            t.I( 'comment_parent' ).value = '0';
     43            temp.parentNode.insertBefore( respond, temp );
     44            temp.parentNode.removeChild( temp );
    3345            this.style.display = 'none';
    3446            this.onclick = null;
     
    3648        };
    3749
    38         try { t.I('comment').focus(); }
    39         catch(e) {}
     50        // Set initial focus to the first form focusable element.
     51        try {
     52            for ( var i = 0; i < commentForm.elements.length; i++ ) {
     53                element = commentForm.elements[i];
     54
     55                // Skip form elements that are hidden or disabled.
     56                if ( 'hidden' === element.type || element.hasAttribute( 'disabled' ) ) {
     57                    continue;
     58                }
     59
     60                if ( 'getComputedStyle' in window ) {
     61                    node = element;
     62                    cssHidden = false;
     63
     64                    while( node.parentNode ) {
     65                        style = window.getComputedStyle( node );
     66
     67                        if ( style.display === 'none' || style.visibility === 'hidden' ) {
     68                            cssHidden = true;
     69                            break;
     70                        }
     71
     72                        node = node.parentNode;
     73                    }
     74
     75                    if ( cssHidden ) {
     76                        continue;
     77                    }
     78                }
     79
     80                element.focus();
     81                // Stop after the first focusable element.
     82                break;
     83            }
     84        } catch( er ) {}
    4085
    4186        return false;
    4287    },
    4388
    44     I : function(e) {
    45         return document.getElementById(e);
     89    I: function( id ) {
     90        return document.getElementById( id );
    4691    }
    4792};
Note: See TracChangeset for help on using the changeset viewer.