BIMviewer

Форк
0
/
search.js 
117 строк · 3.5 Кб
1
(function(){
2
  var searchIndex = window.esdocSearchIndex;
3
  var searchBox = document.querySelector('.search-box');
4
  var input = document.querySelector('.search-input');
5
  var result = document.querySelector('.search-result');
6
  var selectedIndex = -1;
7
  var prevText;
8

9
  // active search box and focus when mouse enter on search box.
10
  searchBox.addEventListener('mouseenter', function(){
11
    searchBox.classList.add('active');
12
    input.focus();
13
  });
14

15
  // search with text when key is upped.
16
  input.addEventListener('keyup', function(ev){
17
    var text = ev.target.value.toLowerCase();
18
    if (!text) {
19
      result.style.display = 'none';
20
      result.innerHTML = '';
21
      return;
22
    }
23

24
    if (text === prevText) return;
25
    prevText = text;
26

27
    var html = {class: [], method: [], member: [], function: [], variable: [], typedef: [], external: [], file: [], test: [], testFile: []};
28
    var len = searchIndex.length;
29
    var kind;
30
    for (var i = 0; i < len; i++) {
31
      var pair = searchIndex[i];
32
      if (pair[0].indexOf(text) !== -1) {
33
        kind = pair[3];
34
        html[kind].push('<li><a href="' + pair[1] + '">' + pair[2] + '</a></li>');
35
      }
36
    }
37

38
    var innerHTML = '';
39
    for (kind in html) {
40
      var list = html[kind];
41
      if (!list.length) continue;
42
      innerHTML += '<li class="search-separator">' + kind + '</li>\n' + list.join('\n');
43
    }
44
    result.innerHTML = innerHTML;
45
    if (innerHTML) result.style.display = 'block';
46
    selectedIndex = -1;
47
  });
48

49
  // down, up and enter key are pressed, select search result.
50
  input.addEventListener('keydown', function(ev){
51
    if (ev.keyCode === 40) {
52
      // arrow down
53
      var current = result.children[selectedIndex];
54
      var selected = result.children[selectedIndex + 1];
55
      if (selected && selected.classList.contains('search-separator')) {
56
        var selected = result.children[selectedIndex + 2];
57
        selectedIndex++;
58
      }
59

60
      if (selected) {
61
        if (current) current.classList.remove('selected');
62
        selectedIndex++;
63
        selected.classList.add('selected');
64
      }
65
    } else if (ev.keyCode === 38) {
66
      // arrow up
67
      var current = result.children[selectedIndex];
68
      var selected = result.children[selectedIndex - 1];
69
      if (selected && selected.classList.contains('search-separator')) {
70
        var selected = result.children[selectedIndex - 2];
71
        selectedIndex--;
72
      }
73

74
      if (selected) {
75
        if (current) current.classList.remove('selected');
76
        selectedIndex--;
77
        selected.classList.add('selected');
78
      }
79
    } else if (ev.keyCode === 13) {
80
      // enter
81
      var current = result.children[selectedIndex];
82
      if (current) {
83
        var link = current.querySelector('a');
84
        if (link) location.href = link.href;
85
      }
86
    } else {
87
      return;
88
    }
89

90
    ev.preventDefault();
91
  });
92

93
  // select search result when search result is mouse over.
94
  result.addEventListener('mousemove', function(ev){
95
    var current = result.children[selectedIndex];
96
    if (current) current.classList.remove('selected');
97

98
    var li = ev.target;
99
    while (li) {
100
      if (li.nodeName === 'LI') break;
101
      li = li.parentElement;
102
    }
103

104
    if (li) {
105
      selectedIndex = Array.prototype.indexOf.call(result.children, li);
106
      li.classList.add('selected');
107
    }
108
  });
109

110
  // clear search result when body is clicked.
111
  document.body.addEventListener('click', function(ev){
112
    selectedIndex = -1;
113
    result.style.display = 'none';
114
    result.innerHTML = '';
115
  });
116

117
})();
118

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.