1//Header search with AJAX script 2(function($) { 3 //Global variables 4 var minCharactersPredictiveSearch = 4; //Minimum number of characters in header search to activate lazy search 5 6 //Document ready - search setup 7 $(function() { 8 prepareHeaderSearch(); 9 }); 10 11 //Search toggle condition on button click 12 $(".header-search-toggle").on("click", function(e) { 13 toggleHeaderSearch(); 14 }); 15 16 //Search toggle condition on keypress 17 $(document).keyup(function(e) { 18 if ((e.key === "Escape") && (isDesktopScreen())) { //Escape key maps to keycode 27 19 toggleHeaderSearch(); 20 } 21 }); 22 23 //Open and close header search panel 24 function toggleHeaderSearch() { 25 $("#header-search").toggleClass("active"); 26 $('#header-search-results').removeActive(); 27 28 if ($("body").hasClass("search-open") == false) { 29 //OPEN top search 30 $("#header-search-input").focus(); //Force focus to the search 31 $("body").addClass("search-open"); 32 33 //Ensure keyboard focus on search features 34 $('#header-search input, #header-search button').attr('tabindex','0'); 35 } 36 else { 37 //CLOSE top search 38 $("body").removeClass("search-open"); 39 40 //Do not want a closed header search to be keyboard focusable 41 $('#header-search input, #header-search button').attr('tabindex','-1'); 42 } 43 } 44 45 //Attach event listener for input on header search so AJAX can fire 46 function prepareHeaderSearch() { 47 $('#header-search-input').one('input', headerSearchTrigger); 48 } 49 50 //Triggers an AJAX search request or prepares listener again 51 var headerSearchTrigger = function() { 52 //If at least x characters entered in search bar, launch AJAX search; if not, reattach event listener 53 if ($('#header-search-input').val().length >= minCharactersPredictiveSearch) 54 { 55 requestSearchResponse(); 56 } 57 else 58 { 59 prepareHeaderSearch(); 60 $('#header-search-results').removeActive(); 61 } 62 } 63 64 //Fires AJAX request that is handled in PHP, result returned via JSON 65 function requestSearchResponse() { 66 jQuery.ajax({ 67 type: 'get', 68 url: $('#header-search-input').attr('data-ajax-action'), //Points to file handling AJAX request 69 data: { 70 action: 'header_search_change', //PHP hears this action and responds 71 keyword: $('#header-search-input').val() //Value sent with GET so PHP can use it 72 }, 73 success: function(response) { 74 $('#header-search-results').html(response); 75 $('#header-search-results').addActive(); 76 77 //If the term searched no longer matches what's in the search input, re-run search 78 if ($('#header-search .search-results-container').attr('data-keyword-searched') != $('#header-search-input').val()) 79 { 80 requestSearchResponse(); 81 } 82 else 83 { 84 //Allow header search to happen again 85 prepareHeaderSearch(); 86 } 87 } 88 }); 89 } 90})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.