autocomplete-trie/demo/add.js

80 lines
1.9 KiB
JavaScript
Raw Normal View History

2015-07-26 08:25:34 +00:00
let data = new Trie();
2015-07-26 07:27:50 +00:00
2015-07-26 08:25:34 +00:00
data.add('go');
data.add('get');
data.add('boo');
data.add('ba');
2015-07-26 07:27:50 +00:00
2015-07-26 08:25:34 +00:00
document.addEventListener('DOMContentLoaded', () => {
2015-07-26 07:27:50 +00:00
draw();
// Form and other stuff
const form = document.querySelector('form');
const input = document.querySelector('input');
const explain = document.querySelector('#explain');
const explainWord = document.querySelector('#explain-word');
const explainIndex = document.querySelector('#explain-index');
form.addEventListener('submit', e => {
e.preventDefault();
let word = input.value;
if (!explain.checked) {
data.add(word);
draw();
return;
}
let separated = `<span>${word.split('').join('</span><span>')}</span>`;
explainWord.innerHTML = separated;
const indexLeft = explainWord.children[0].offsetLeft;
const indexMargin = 20;
const indexWidth = explainWord.children[0].offsetWidth + indexMargin;
let index = 0;
let key = '';
const intv = setInterval(() => {
d3.selectAll('tspan').attr('class', '');
d3.selectAll('#explain-word span').attr('class', '');
d3.selectAll('.node').attr('class', 'node');
let char = word[index];
if (!char) {
clearInterval(intv);
explainIndex.innerHTML = '';
explainWord.innerHTML = '';
return;
}
key += char;
let s = explainWord.children[index];
s.classList.add('highlight');
explainIndex.style.left = `${indexLeft + index * indexWidth}px`;
explainIndex.innerHTML = index;
let node = document.querySelector(`[data-word="${key}"]`);
if (!node) {
data.add(word.slice(0, index + 1));
draw();
node = document.querySelector(`[data-word="${key}"]`);
}
node.classList.add('highlight');
let text = node.querySelector('text');
text.children[index].classList.add('highlight');
index++;
}, 1000);
});
});