jQuery автозаполнение путь Баш стиль
Я разрабатываю приложение с использованием PHP и jQuery, в котором входные данные должны принимать путь к файлу на сервере. Путь не тривиален, и там может быть много записей, поэтому я хотел бы реализовать поле автозаполнения, которое ведет себя как bash, т. е. каталоги списка предложений для текущего уровня.
Допустим, у меня есть эти каталоги
/a/001 /a/002 /a/003 /b/020 /b/021 /c/002
Для начала автозавершение должно предполагать a, b и c. Затем после ввода a/ он должен предложить 001, 002 и 003 ...
Я думаю, что сервер должен построить дерево всех доступных каталогов, записать его как объект js, затем функция автозаполнения должна проанализировать входные данные, маркировать на слешах / и найти доступные подкаталоги в соответствующем узле, и когда выбор сделан, добавить его к текущему пути.
Обновить
Я почти там, используяавтозаполнение jQuery с несколькими значениями , но мне не нравится, как он себя ведет. Я желаю поисков действие заполнит текст до следующей неясности из того, что доступно, точно так же, как это делает автозаполнение bash.
Вот что у меня есть прямо сейчас ссылка на pastbin
2 ответа:
Наконец-то получил его, как я и предполагал. Сервер строит дерево json, которое динамически анализируется исходной функцией и с помощью 2 полей ввода заполняет предложение для завершения вкладки.
Поставьте рабочий пример на jsfiddle
function acSource(request, response) { var path = split(request.term); var depth = path.length; var node = paths; var avail = new Array(); // descent into the path tree to get a list of suggestions for (var n = 1; n < depth && typeof node !== "undefined"; n++) { var cur = path[n - 1]; node = node[cur]; } // build a regex with the last directory entry being typed var last = path.pop(); var re = new RegExp("^" + last + ".*", "i"); // filter suggestions by matching with the regex for (var k in node) { if (k.match(re)) avail.push(k); } // build a new suggestion path.push(sharedStart(avail)); if (avail.length == 1) path.push(""); // set suggestion for autocomplete var sugg = $(this.element).siblings(".pathSuggest"); $(sugg).val(path.join("/")); // delegate back to autocomplete, but extract the last term response($.ui.autocomplete.filter(avail, last)); }
Если вы согласны со следующим, это решение будет работать для вас. Это слишком просто
- покажите предложения в виде полных путей. т. е. если пользователь набирает /a / затем покажите предложения для /a / 001, /a/002 и /a/003 вместо 001, 002 и 003
В этом случае вы можете создать автозаполнение jQuery с удаленным источником данных
$("#birds").autocomplete({ source: "search.php", minLength: 2, select: function(event, ui) { log(ui.item ? "Selected: " + ui.item.value + " aka " + ui.item.id : "Nothing selected, input was " + this.value); } });
Затем в
search.php
можно сгенерировать требуемые значения в виде массива json.В противном случае вы можете создать пользовательское автоматическое завершение, которое показывает только частичные пути на сервере.