-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathAjaxSearch.js
104 lines (87 loc) · 2.76 KB
/
AjaxSearch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* ajaxSearch - progressive enhanced processwire search */
$(function(){
// config
var minlength = as_config.as_minLength;
var txt_close = as_config.as_close_text;
var search_form = as_config.as_search_form;
var search_input = as_config.as_search_input;
var param_name = as_config.as_query_name;
var search_url = as_config.as_query_url;
var req = null;
// build dom for ajax search results
// event listener on "keydown" to be able to prevent the default scrolling in browsers
$res = $("<div id='ajaxSearch'><div class='ajaxSearch_body'></div></div>").bind("keydown",function(e){
// escape key close results
if(e.which == 27) {
e.preventDefault();
$(this).fadeOut();
}
// arrow down key
if(e.which == 40) {
e.preventDefault();
var $links = $('#ajaxSearch a');
var $focused = $('#ajaxSearch a:focus');
var $next = $links.get($links.index($focused)+1);
if($next) $next.focus();
}
// arrow up key
if(e.which == 38) {
e.preventDefault();
var $links = $('#ajaxSearch a');
var $focused = $('#ajaxSearch a:focus');
var $prev = $links.get($links.index($focused)-1);
if($prev) $prev.focus();
}
});
$closebtn = $("<a class='ajaxSearch_close' href='#'>"+txt_close+"</a>");
$res.prepend($closebtn);
$res.css({'display':'none'});
$res.appendTo($(search_form));
if($(search_input).length != null){
$(search_input).bind("keyup", function(e) {
// escape key close results
if(e.which == 27) {
$('#ajaxSearch').fadeOut();
return;
}
// arrow down key go to first link
if(e.which == 40) {
$('#ajaxSearch a:first').focus();
return;
}
var $this = this;
var value = $(this).val();
// if a request running we abort it
if (req != null) req.abort();
if (value.length >= minlength ) {
// add class to searchfield for loader animation
$(search_input).addClass("ajaxSearch_loader");
req = $.ajax({
type: "GET",
url: search_url.length > 0 ? search_url : $(this).closest("form").attr("action"),
data: param_name+"="+value,
dataType: "html",
success: function(data){
//we need to check if the value is the same
if (value==$($this).val()) {
// insert search result to body
$res.find('.ajaxSearch_body').html(data);
if($res.is(':hidden')) $res.slideDown();
// remove class for loader animation
$(search_input).removeClass("ajaxSearch_loader");
}
}
});
}
})
.attr({'autocomplete':'off'}); // disables autocomplete in certain browsers
$('.ajaxSearch_close')
.on('click',function(){
$(this).closest('#ajaxSearch').fadeOut();
});
}
// close popup on click outside
$(document).click(function(e){
if($(e.target).closest('#ajaxSearch').length == 0) $("#ajaxSearch").fadeOut();
});
});