Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Взаимодействие с пользователем без сервера (https://javascript.ru/forum/misc/41156-vzaimodejjstvie-s-polzovatelem-bez-servera.html)

alexandr_ftf 02.09.2013 16:14

Взаимодействие с пользователем без сервера
 
Возможно ли реализовать ввод пользователем нескольких переменных сразу (по типу формы)?
prompt и confirm позволяет только последовательный ввод.

Яростный Меч 02.09.2013 16:37

накидать несколько инпутов на страницу.

devote 02.09.2013 18:37

Вот могу дать быстрый вариант, не очень хорошо сделан, но работает:
<script type="text/javascript">
function multiPrompt(options, callback) {
    var wrapper = document.createElement('div');
    wrapper.style.cssText = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%;';
    wrapper.innerHTML = '<div style="position: fixed; width: 100%; height: 100%; background: #000; opacity: 0.05;' +
        'filter: Alpha(opacity=5);"></div><table style="position: relative; margin: auto; height: 100%;"><tr><td>' +
        '<div style="position: relative; background: #FBFBFB; border: 1px solid #BFBFBF; border-radius: 4px;' +
        'box-shadow: 0 2px 3px rgba(0,0,0,0.6); padding: 10px;"><div></div><div style="padding: 10px 0 0 0;' +
        'float: right;"><button style="border: 1px solid #bfbfbf; width: 80px; margin-left: 10px;height: 25px;' +
        '">Ок</button><button style="border: 1px solid #bfbfbf; width: 80px; margin-left: 10px; height: 25px;' +
        '">Отмена</button></div><div style="clear: both;"></div></div></td></tr></table>';

    options = options instanceof Array ? options : [[options]];
    var inputsBox = wrapper.getElementsByTagName('div')[2];
    for(var i = 0; i < options.length; i++) {
        options[i] = options[i] instanceof Array ? options[i] : [options[i]];
        var titleDiv = document.createElement('div');
        titleDiv.innerHTML = typeof options[i][0] === 'undefined' ? '' : options[i][0];
        inputsBox.appendChild(titleDiv);
        var input = document.createElement('input');
        input.style.minWidth = '300px';
        input.style.width = '100%';
        input.type = 'text';
        input.value = typeof options[i][1] === 'undefined' ? '' : options[i][1];
        inputsBox.appendChild(input);
    }
    var buttons = wrapper.getElementsByTagName('button');
    var cancel = function(e) {
        e = e || window.event;
        if (e.type == 'keydown') {
            if (e.keyCode !== 27) {
                return;
            }
        }
        if (document.removeEventListener) {
            document.removeEventListener('keydown', cancel);
        } else {
            document.detachEvent('onkeydown', cancel);
        }
        wrapper.parentNode.removeChild(wrapper);
    }
    buttons[0].onclick = function() {
        var inputs = wrapper.getElementsByTagName('input');
        var results = [];
        for(var i = 0; i < inputs.length; i++) {
            results[results.length] = inputs[i].value;
        }
        cancel({});
        callback && callback(results);
    }
    buttons[1].onclick = cancel;
    if (document.addEventListener) {
        document.addEventListener('keydown', cancel);
    } else {
        document.attachEvent('onkeydown', cancel);
    }

    document.body.appendChild(wrapper);
}
</script>
<button onclick="multiPrompt(['Имя', 'Фамилия', 'Отчество'], function(a){alert(a)})">Показать окно 1</button>

<button onclick="multiPrompt([['Имя', 'Иван'], ['Фамилия', 'Иванов'], ['Отчество', 'Иванович']], function(a){alert(a)})">Показать окно 2</button>

<button onclick="multiPrompt('Введите число', function(a){alert(a)})">Показать окно 3</button>

alexandr_ftf 03.09.2013 01:28

devote
Спасибо, то что надо!)

alexandr_ftf 04.09.2013 14:49

Всё хорошо, только в данном скрипте перенос строки зачем-то заменяется пробелом.(

devote 04.09.2013 15:43

Цитата:

Сообщение от alexandr_ftf
только в данном скрипте перенос строки зачем-то заменяется пробелом.(

теперь не будет

alexandr_ftf 04.09.2013 16:33

Ничего не изменилось.

devote 04.09.2013 16:34

Цитата:

Сообщение от alexandr_ftf
Ничего не изменилось.

ну значит я не понял что ты имеешь ввиду, у меня нигде пробелы не подставляются, по крайней мере теперь.. Изучи код, и посмотри что там и намека о подставленных пробелах нету.

devote 04.09.2013 16:37

если ты пытаешься делать так:
multiPrompt('Введите \n число', function(a){alert(a)})
то это бесполезно, нужно писать именно тег BR:
multiPrompt('Введите <br />число', function(a){alert(a)})

alexandr_ftf 04.09.2013 16:43

Так это не критика кода ни в коей мере). Просто сам промпт при копировании туда многострочного текста работает как надо.
В самом промпт символа перевода строки нет, но если делать перемещение между символами стрелочками увидим, что он там есть, только невидим. В твоём скрипте он заменяется пробелом.
Для меня это ключевой момент, так как вводится будет скопированный текст.


Часовой пояс GMT +3, время: 05:33.