Имеется xul окно, которое содержит в себе элемент - textbox:

Выделить код

Код:

<textbox id="ControlParms" type="autocomplete"/>

Хочу, чтобы однажды введённые данные запомнились, и при следующем вызове окна эти данные находились бы в выпадающем списке. Реально ли это сделать?
Чтобы понятнее было - хочу, чтобы было примерно вот так:translatortools_0.jpeg
Вышеприведённый скрин-шот реализован через HTML-код, как сделать подобное для поля "Управляющие параметры" через XUL-код?

https://developer.mozilla.org/en-US/doc … omplete%29
=> https://developer.mozilla.org/en-US/doc … _component

Я видел эту документацию. Но она мне не помогла, поэтому почувствовал нужду в помощи на русском языке. Например, путем эксперимента я перебрал все опции для атрибута autocompletesearch. Не одна из опций не даёт желаемый результат. Опция history выкидывает список с URL-адресами, которые были когда-то посещены веб-браузером. Мне это не надо. Ближе к моей потребности на первый взгляд представляется опция form-history, но ничего не сохраняется и желаемый список не выпадает. Поэтому и возникает вопрос: а реально ли это вообще сделать?

Michael72
Можно посмотреть пример в расширении Console² – там сделано автодополнение для textbox#TextboxEval.

Пример, autocomplete.xul:

Выделить код

Код:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    title="Autocomplete example">
    <textbox
        type="autocomplete"
        autocompletesearch="form-history"
        autocompletesearchparam="someUniqueId"
        onkeypress="if(event.keyCode == event.DOM_VK_RETURN) addAutocompleteEntry(this);" />
    <script type="application/javascript">
    <![CDATA[
    function addAutocompleteEntry(tb) {
        Components.classes["@mozilla.org/satchel/form-history;1"]
            .getService(Components.interfaces.nsIFormHistory2 || Components.interfaces.nsIFormHistory)
            .addEntry(tb.getAttribute("autocompletesearchparam"), tb.value);
    }
    ]]>
    </script>
</window>

Жаль, нужные привилегии просто так не получить. Для проверки:

скрытый текст

Выделить код

Код:

var data = readFromFile("Z:\\autocomplete.xul");
var uri = "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(data);
openDialog(uri, "", "chrome,all");


function readFromFile(file) {
    if(!(file instanceof (Components.interfaces.nsILocalFile || Components.interfaces.nsIFile)))
        file = getLocalFile(file);
    var fis = Components.classes["@mozilla.org/network/file-input-stream;1"]
        .createInstance(Components.interfaces.nsIFileInputStream);
    try {
        fis.init(file, 0x01, parseInt("0444", 8), 0);
    }
    catch(e) {
        Components.utils.reportError(e);
        fis.close();
        return "";
    }
    var sis = Components.classes["@mozilla.org/scriptableinputstream;1"]
        .createInstance(Components.interfaces.nsIScriptableInputStream);
    sis.init(fis);
    var str = sis.read(fis.available());
    sis.close();
    fis.close();
    return convertToUnicode(str);
}
function convertToUnicode(str) {
    var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    suc.charset = "utf8";
    try {
        return suc.ConvertToUnicode(str);
    }
    catch(e) {
        Components.utils.reportError(e);
    }
    return str;
}
function getLocalFile(path) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile || Components.interfaces.nsIFile);
    file.initWithPath(path);
    return file;
}

Infocatcher пишет

Michael72

Выделить код

Код:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    title="Autocomplete example">
    <textbox
        type="autocomplete"
        autocompletesearch="form-history"
        autocompletesearchparam="someUniqueId"
        onkeypress="if(event.keyCode == event.DOM_VK_RETURN) addAutocompleteEntry(this);" />
    <script type="application/javascript">
    <![CDATA[
    function addAutocompleteEntry(tb) {
        Components.classes["@mozilla.org/satchel/form-history;1"]
            .getService(Components.interfaces.nsIFormHistory2 || Components.interfaces.nsIFormHistory)
            .addEntry(tb.getAttribute("autocompletesearchparam"), tb.value);
    }
    ]]>
    </script>
</window>

Спасибо. Вот это уже намного лучше помогло разобраться. В моём случае пришлось выкинуть обработчик событий onkeypress="if(event.keyCode == event.DOM_VK_RETURN) addAutocompleteEntry(this);". Вместо этого нужную функцию addAutocompleteEntry() привязал к кнопке OK при этом переменную tb заменил на document.getElementById("ControlParms")

На всякий случай: "someUniqueId" тоже надо менять на что-то уникальное типа "%название_расширения%ControlParms", чтобы не совпало случайно с чем-нибудь.

В списке (autocompletesearchparam="someUniqueId") сохраняется очень большое количество элементов. Это неудобно. Как можно ограничить например семью элементами, чтобы новые запоминались, а старые забывались?