WordPress.org

Make WordPress Core

Ticket #15481: list-table.dev.js-x7815.diff

File list-table.dev.js-x7815.diff, 1.9 KB (added by edward mindreantre, 4 years ago)

1 second keypress, now with fixed race condition

  • wp-admin/js/list-table.dev.js

     
    214214 
    215215                return false; 
    216216        }); 
     217         
     218        // Keep track of how many times setTimeout has been called. 
     219        var refresh_results_counter = 0; 
    217220 
    218         // searchbox 
    219         function change_search(ev) { 
    220                 if ( 'keypress' == ev.type && 13 != ev.keyCode ) 
     221        function refresh_results(search_text) 
     222        { 
     223                // Decrease the timer only if it is above 0. Otherwise race condition: type 4 characters quickly then press enter... 
     224                if (refresh_results_counter > 0) 
     225                        refresh_results_counter --; 
     226 
     227                // If setTimeout has been called more than once, just ignore the first ones. 
     228                if (refresh_results_counter > 0) 
    221229                        return; 
     230                 
     231                // NOW we can search  
     232                var data = $(search_text).parent('.search-box').find(':input').serializeObject(); 
    222233 
    223                 ev.preventDefault(); 
    224                 ev.stopImmediatePropagation(); 
    225  
    226                 var data = $(this).parent('.search-box').find(':input').serializeObject(); 
    227  
    228234                listTable.update_rows(data, true, function() { 
    229235                        $('h2 .subtitle').remove(); 
    230236 
     
    234240                                )); 
    235241                }); 
    236242        } 
     243 
     244        // searchbox 
     245        function change_search(ev) { 
     246                if ( 'keypress' != ev.type ) 
     247                        return; 
     248                         
     249                if ( 13 == ev.keyCode ) 
     250                { 
     251                        ev.preventDefault(); 
     252                        ev.stopImmediatePropagation(); 
     253                        // Get the results immediately. 
     254                        refresh_results_counter = 1; 
     255                        refresh_results(this); 
     256                } 
     257                else 
     258                { 
     259                        // Set a timeout for one second before fetching the new results. 
     260                        // Increase the counter so that the search always waits one second after the LAST keypress. 
     261                        refresh_results_counter++; 
     262                        // This is a "closure". 
     263                        setTimeout(function(that) { 
     264                                return function() { 
     265                                        refresh_results(that); 
     266                                }; 
     267                        }(this), 1000); 
     268                } 
     269 
     270        } 
    237271        $('.search-box :submit').click(change_search); 
    238272        $('.search-box :text').keypress(change_search); 
    239273