Взаимодействие с пользователем без сервера
Возможно ли реализовать ввод пользователем нескольких переменных сразу (по типу формы)?
prompt и confirm позволяет только последовательный ввод. |
накидать несколько инпутов на страницу.
|
Вот могу дать быстрый вариант, не очень хорошо сделан, но работает:
<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> |
devote
Спасибо, то что надо!) |
Всё хорошо, только в данном скрипте перенос строки зачем-то заменяется пробелом.(
|
Цитата:
|
Ничего не изменилось.
|
Цитата:
|
если ты пытаешься делать так:
multiPrompt('Введите \n число', function(a){alert(a)})то это бесполезно, нужно писать именно тег BR: multiPrompt('Введите <br />число', function(a){alert(a)}) |
Так это не критика кода ни в коей мере). Просто сам промпт при копировании туда многострочного текста работает как надо.
В самом промпт символа перевода строки нет, но если делать перемещение между символами стрелочками увидим, что он там есть, только невидим. В твоём скрипте он заменяется пробелом. Для меня это ключевой момент, так как вводится будет скопированный текст. |
alexandr_ftf,
понятно, ну это уже браузер так работает с полем input, можно конечно переделать на textarea например: <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('textarea'); input.style.cssText = 'min-width:300px;width:100%;height:21px;resize:none;padding: 0px;' + 'white-space:nowrap;overflow:hidden;padding:0;font-size:14px;font-family:Arial;'; input.value = typeof options[i][1] === 'undefined' ? '' : options[i][1]; input.onkeydown = function(e) { e = e || window.event; if (e.keyCode == 13) { if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } } } 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('textarea'); 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> |
Вопрос решился просто заменой input на textarea
|
Да, спасибо
|
Часовой пояс GMT +3, время: 00:15. |