Автоматический конструктор форм javascript

Обновлено: 27.03.2024

Как и многие веб-разработчики, я посвящаю много времени тестированию пользовательского интерфейса сайтов, над которыми работаю.

Автоматизированное тестирование, конечно, является хорошей помощью в этом процессе, но « болевые точки » в интерфейсе зачастую невозможно выявить иным способом, кроме как использовать сайт. Ещё и ещё раз. Этот процесс может очень быстро надоедать. Особенно заполнение форм.

Я сам попал в такую ситуацию пару месяцев назад, когда мы добавляли британский фунт к поддерживаемым валютам при расчёте в Wufoo .

Для проверки необходимо было заполнить множество полей с именами, адресами, номерами кредиток и всего прочего, что подразумевается в процессе расчёта. Разумеется, значительная часть этих данных не должна была повторяться:

В конце концов, я сделал букмарклет для быстрого заполнения форм тестовыми данными. ( Bookmarklet – программа на JavaScript , выполненная в виде закладки в браузере, гибрид английских слов « bookmark » – закладка и « applet » – маленькое приложение. – Прим. перев.)

Я выбрал форму букмарклета, потому что:

  • его легко передать пользователю;
  • его легко обновить без участия пользователя;
  • он запускается на любой платформе без изменений.

Вы можете легко сделать букмарклет, создав новый « загончик » на CodePen и поместив в HTML что-то вроде:

Пользователю достаточно перетащить получившуюся ссылку в область закладок своего браузера. Клик по закладке запустит код на текущей странице.

В этом проекте я полагался на jQuery для придания коду максимальной удобочитаемости и кроссбраузерности. Если кому-то нужна версия на чистом JavaScript , напишите мне комментарий – я постараюсь что-нибудь сообразить.

Для создания случайных данных я использовал замечательную библиотеку Faker . Её JavaScript -реализацию можно взять здесь .

Основа букмарклета

Мы можем поместить весь код прямо в ссылку. Но такой вариант будет неудобно читать и сопровождать. Кроме того, мне хотелось иметь возможность вносить исправления в код, не заставляя пользователей обновлять закладку. Так что лучше оставить в букмарклете ссылку на внешний файл.

Сам букмарклет выглядит так:

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

Заполнение полей

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

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

Поэтому мы обернём его в самозапускающуюся анонимную функцию . Это соответствующим образом ограничит область видимости наших функций и переменных:

Мне очень нравится функция генератора псевдослучайных чисел, приведённая Крисом Койлером в этой статье . Воспользуемся ей по мере необходимости:

Теперь загрузим FakerJS . Поскольку наш скрипт зависит от jQuery , мы можем использовать его механизм отложенной загрузки при помощи функции $.getScript :

Теперь, когда доступ к Faker нам обещан , мы можем использовать его методы для генерации разнообразных правдоподобных имён, мест, адресов и других тестовых данных.

Повторное использование сгенерированных данных обеспечит нам следующий конструктор:

Неплохо было бы протестировать также чекбоксы и радиокнопки на нашем сайте, выбирая их в случайном порядке. Для этого нам придётся несколько расширить функциональность нашего конструктора:

И наконец, нам нужно сопоставить генерируемые данные с различными полями тестируемых форм. Мы извлечём из нашей страницы все поля форм и заполним их данными в соответствии с их типом и CS S-классом.

В таком виде наш скрипт прекрасно реализует разделение между механизмом генерации данных и механизмом их использования:

Заключение

Таким образом, мной был написан простой и быстрый заполнитель форм в виде букмарклета для тестирования одного проекта. Определённо, существует множество способов его улучшить. Однако в условиях нехватки времени этот инструмент был использован как есть, и вполне справился со своей работой.

Если хотите, можете рассмотреть также Inline Copy Editor – ещё один мой букмарклет, код которого я открыл для команды дизайнеров SurveyMonkey .

Надеюсь, моя статья была вам полезна. Дайте знать, если появятся вопросы.

Сейчас мы поговорим о различных приемах работы сценариев JavaScript с HTML-формами.

Если в HTML-документе определена форма, то она доступна сценарию JavaScript как объект, входящий в объект document с именем, заданным атрибутом NAME тега FORM .

Свойства форм

Форма имеет два набора свойств, состав одного из которых фиксированный, а состав другого зависит от того, какие элементы определены в форме.

Свойства первого набора

  • action. Значение атрибута ACTION тега FORM .
  • encoding. Значение атрибута ENCTYPE тега FORM .
  • method. Значение атрибута METHOD тега FORM .
  • target. Значение атрибута TARGET тега FORM .
  • elements. Массив всех элементов формы.
  • length. Размер массива elements.

Большинство свойств первого набора просто отражает значение соответствующих атрибутов тега FORM . Что же касается массива elements , то в нем находятся объекты, соответствующие элементам, определенным в форме. Эти объекты образуют второй набор свойств формы. Адресоваться к этим объектам можно как к элементам массива elements , причем первому элементу формы будет соответствовать элемент с индексом 0, второму - с индексом 1 и т.д. Однако удобнее обращаться к элементам формы по их именам, заданным атрибутом NAME .

Элементы форм

Кнопки (BUTTON, RESET, SUBMIT)

Свойства

  • name. Имя объекта.
  • value. Надпись на кнопке.

Метод

  • click( ). Вызов этого метода тождественен щелчку мышкой по кнопке.

Пример

Нажатие кнопки

Флажок (CHECKBOX)

Свойства

  • name. Имя объекта.
  • value. Надпись на кнопке.
  • checked. Состояние флажка: true - флажок установлен, false - флажок не установлен.
  • defaultChecked. Отражает наличие атрибута CHECKED : true - есть, false - нет.

Метод

  • click( ). Вызов этого метода меняет состояние флажка.

Пример

Метод click флажка

Переключатель (RADIO)

Свойства

  • name. Имя объекта.
  • value. Надпись на кнопке.
  • length. Количество переключателей в группе.
  • checked. Состояние переключателя: true - переключатель включен, false - выключен.
  • defaultChecked. Отражает наличие атрибута CHECKED : true - есть, false - нет.

Метод

  • click( ). Вызов этого метода включает переключатель.

Так как группа переключателей имеет одно имя NAME , то к переключателям надо адресоваться как к элементам массива.

Пример

Метод click группы переключателей

Список (SELECT)

Свойства

  • name. Имя объекта.
  • selectedIndex. Номер выбранного элемента или первого среди выбранных (если указан атрибут MULTIPLE ).
  • length. Количество элементов (строк) в списке.
  • options. Массив элементов списка, заданных тегами OPTION .
  • value. Значение атрибута VALUE .
  • text. Текст, указанный после тега OPTION .
  • index. Индекс элемента списка.
  • selected. Присвоив этому свойству значение true , можно выбрать данный элемент.
  • defaultSelected. Отражает наличие атрибута SELECTED : true - есть, false - нет.

Методы

  • focus( ). Передает списку фокус ввода.
  • blur( ). Отбирает у списка фокус ввода.

Пример

Работа с готовым списком

Кроме работы с готовыми списками JavaScript может заполнять список динамически. Для записи нового элемента списка используется конструктор Option c четырьмя параметрами, первый из которых задает текст, отображаемый в списке, второй - значение элемента списка, соответствующее значению атрибута VALUE , третий соответствует свойству defaultSelected , четвертый - свойству selected .

Пример

Динамическое заполнение списка

Поле ввода (TEXT)

Свойства

  • name. Имя объекта.
  • defaultValue. Начальное содержимое поля.
  • value. Текущее содержимое поля.

Методы

  • focus( ). Передает полю фокус ввода.
  • blur( ). Отбирает у поля фокус ввода.
  • select( ). Выделяет содержимое поля.

Пример

Заполните анкету

Обратите внимание на то, что символы фамилии и имени при потере фокуса соответствующими полями преобразуются в прописные. Для этого используется метод toUpperCase , определенный во встроенном классе строк.

Текстовая область (TEXTAREA)

Свойства

  • name. Имя объекта.
  • defaultValue. Начальное содержимое области.
  • value. Текущее содержимое области.

Методы

  • focus( ). Передает области фокус ввода.
  • blur( ). Отбирает у области фокус ввода.
  • select( ). Выделяет содержимое области.

Пример

Отправьте телеграмму

Для установки курсора в определенное место textarea-области используйте следующую кросбраузерную функцию:

Поле ввода пароля (PASSWORD)

Свойства

  • name. Имя объекта.
  • defaultValue. Начальное содержимое поля.
  • value. Текущее содержимое поля.

Методы

  • focus( ). Передает полю фокус ввода.
  • blur( ). Отбирает у поля фокус ввода.
  • select( ). Выделяет содержимое поля.

Пример

Как я могу использовать select box как навигационное меню?

При использовании простого JavaScript, вы можете использовать select box для передвижения по сайту. Рассмотрите этот пример: Просто сохраните URL различных страниц в option value. Обработчик события OnChange вызовет перенаправление расположения, когда значение в поле изменено.

Вы могли бы использовать этот код, чтобы изменить расположение другого фрейма изменением 'self.location =' на 'top.framename.location ='

Как я могу использовать картинку для кнопки submit?

Часто возникает вопрос: "Как инициировать форму по картинке, а не по кнопке submit?" Решение столь же просто, как этот пример: Когда нажимается любая кнопка, форма инициируется и координаты x/y щелчка мыши на кнопке загружаются в объект запроса. Например, если пользователь выбрал Cancel!, объект запроса будет содержать переменные cancel.x и cancel.y. Точно так же щелчок на Continue привел бы к переменным continue.x и continue.y.

Здесь важно отметить, что элементы .x и .y - не переменные объектов continue или cancel, а фактически часть имени "continue.x". Следовательно, нельзя использовать типичный метод для определения существования одного из дочерних объектов запроса: Тем не менее рассмотрите это: Благодаря названным массивам JavaScript, можно проверить какая картинка инициировала форму.

Для некоторых приложений, полезно знать координаты курсора на нажатой картинке. Эта информация, конечно, содержится в парах image_element.x и image_element.y. Следующий серверный JavaScript мог бы использоваться для этого:

Передача данных между формами на различных страницах

В качестве простого примера, предположите, что ваша "домашняя" страница запрашивает имя пользователя, затем использует это имя, чтобы обратиться к пользователю на следующих страницах. Вы можете взять имя, используя форму, затем использовать JavaScript для передачи имени пользователя в следующую страницу, используя URL. Последующая страница могла бы затем анализировать имя пользователя из URL, используя информацию в document.search.

home.html
next.html

Почему document.formName.selectObject.value не отражает значение выбранного пункта в списке?

Потому что объект работает не таким образом. Правильный и полный синтаксис для доступа к VALUE только что выбранным полем в списке - это: Для доступак тексту элемента используйте свойство text:

Как мне получить значение выбранной в данный момент radio button в radio group или группе checkboxes?

Существует свойство, созданное в объекте form для каждой radio buttons или checkboxes с тем же самым именем. Например, следующий HTML код: приводит к созданию 3-х элементов массива, вызываемых с помощью document.theForm.gender. Чтобы определить значение выбранной кнопки (или checkbox'а), вам нужно проверить свойство checked каждого из элементов. Например:

Для получения и установки значения radio button value на javascript можно использовать следующие функции:

Как мне получить форму, чтобы инициировать процесс запуска клавишей Enter?

Форма отправляется, если нажата клавиша enter, в то время как единственный входной текстовый элемент формы имеет фокус. Вы можете вызывать подобное поведение в форме, имеющей более одного элемента, разбивая форму на ряд отдельных форм, так, чтобы каждая форма имела только один текстовый элемент. Используйте обработчик события onSubmit (или action ) для накопления данных из других форм в вашей странице и инициируйте их все сразу.

Как я могу отключить поле текстового ввода?

Используйте обработчик onfocus для вызова функции blur(): Если вы хотите динамически отключать/включать поле, используйте функцию skip (e)

Как сделать загрузку страницы при выборе флажка?

Используйте обработчик OnChange для вызова функции submit():

Сохранение данных в локальное хранилище браузера:

sessionStorage — запоминает результат пока открыт сайт во вкладке(окне), можно свободно перемещаться по сайту, обновлять страницы, но не закрывать окно браузера(вкладку).

localStorage — запоминает результат на очень долгое время, пока пользователь не очистит локальное хранилище браузера. Можно через несколько дней зайти на сайт и увидеть ранее заполненную форму.

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.

We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.

Closed 7 years ago .

I'm looking to integrate a form builder into a site I'm using, but I'm hoping to find a library that has some or most of the functionality I'm looking for.

I'm looking for a library that will give me a nice GUI for building the form, and a JSON (or XML, or similar) output that I can play with in the django backend. I'm planning to use django to output the finished form.

I tried running this through Google, but that only yields companies who make a business out of creating and hosting the forms online. But nothing in the form of a library.

12 Answers 12

I have the same requirement,

I will update this answer over time but bootstrap form builder ( PHP ) seems nice

This solution is only for bootstrap 2. It seems they've never updated the project to use bootstrap 3. It's just too dated to use anymore.

If you dont mind spending a bit of cash you can look at:

The form builder itself is entirely client side JS, so you would just need to post the output (which is JSON) to django instead of their php script.

Thanks for the great suggestion, Matt. I'm waiting for a reply on how this would work with licensing and the like, but I think you were dead on with what I was looking for. These guys need some SEO. =-]

you could also look at:

I would recommend the awesome ExtJS framework to build such kind of application. Here's an example.

Add a form panel, then drop a textbox and so on. dead simple. Ext JS 2.2 and 3.0 (not yet ready) are LGPL and GPL licensed, you have also commercial subscriptions available, I think it worth to have a look at it.

SpiffForm is similar to Appnitro, but free (AGPL), perhaps it fits your needs.

Patches welcome :-). (I am the author.)

Thanks for posting your answer! Please be sure to read the FAQ on Self-Promotion carefully. Also note that it is required that you post a disclaimer every time you link to your own site/product.

There was a google Summer Of Code project last year that built a drag and drop form editor using the Dojo JavaScript toolkit. It's not 100% complete in terms of the functionality I'm guessing you would want.

It does dump a javascript object representing the form which you can convert to JSON to send over the wire.

Depending on your JavaScript skill set it should give you a head start on the problem.

I don't think there is anything exactly like what you want out there; probably the closest would be a rich text editor such as FCKEditor or TinyMCE. These libraries are a bit like the UI you used to write your question in StackOverflow, except that they have toolbar buttons for the different FORM elements (or if they don't, you can easily add them yourselves).

A user faced with one of these editors (assuming you'd configured it to have buttons for FORM elements) would be able to lay out a form with basically no technical knowledge.

However, if a rich text editor doesn't work for you, then you're basically stuck with using something like the jQuery UI library (I'm thinking mainly of the Draggable sub-library) to build your own solution.

It depends on if you're ready to program it yourself. How dynamic do you want it? A simple form builder shouldn't be too hard to program using GWT, Dojo or your-favorite-js-library if you want to go that route. I'd recommend GWT because it's really fun, simple to use and takes care of the incompatibilities between browsers.

Here are some thoughts for possible inputs to each form/question:

  • Single line (for names etc)
  • RichTextArea (similar to FCKEditor)
  • Calendar date/time
  • Multiple choices (checkbox)
  • Single choices (list selector)

Each input needs a corresponding question, or a label. These need to be handled in your Model in Django, and represented as such in the forms view (and the editor).

JS, или JavaScript язык сценариев, которые выполняются на стороне клиента и не требует перезагрузки страницы. JavaScript был разработан компанией Netscape в 1995 году.

Основы JS

Код JavaScript вставляется между тегами

Если в коде содержаться функции, то эти функции должны быть размещены в тегах между тегов и .

Если JavaScript код вынесен в отдельный файл с расширением .js, то подключить такой файл к HTML-коду можно, указав имя файла в качестве параметра src тега

Таким образом, мы подключили к HTML файлу файл с JavaScript.

Использовать JavaScript можно, например, в качестве обработчика определенных событий. Например, при нажатии мышкой на какой-нибудь элемент управления, возникает событие OnClick.

Для того, чтобы браузер «понял», что нужно выполнить скрипт, написанный на JS, мы указываем псевдопротокол javascript:

Функция alert(string s) выводит на экран окно с текстом s и одной кнопкой “OK”.

В данном примере при нажатии на кнопку «Показать» выведется окно с текстом «Вы нажали на кнопку» и одной кнопкой «ОК».

Формы

Доступ к элементам формы можно получить, через следующую конструкцию:

Для элементов ввода информации ( и ) для доступа к самой введенной или не введенной информации доступно свойство value.

В данном примере после нажатия на кнопку “Press me” в текстовом поле ввода появиться текст “This is Edit”. Так же в функции такого рода можно добавлять еще один параметр – объект в который нужно записать текст. Например, у нас есть два поле ввода текстовой информации и две кнопки. При нажатии на первую кнопку мы запишем некоторый текст в первое поле ввода, а при нажатии на вторую кнопку – текст во второе поле. Для этого нам не обязательно писать две функции, достаточно написать одну функцию, указав в ее параметрах дополнительно к тексту, который мы хотим добавить, объект, в который этот текст нужно добавить.

Вот и вся функция, необходимая для изменения любого текста в любом элементе ввода текстовой информации. Давайте сохраним эту функцию в отдельном файле с именем addtext.js

А вот и html страничка:

Без использования JavaScript эту задачу можно решить двумя путями:

  1. Ограничить количество полей ввода каким-либо максимально разумным числом. Например, количество людей, у которых число детей больше 5, относительно невелико. Однако этот способ несколько некрасивый - во-первых, мы изначально загромождаем форму большим числом полей ввода, причём, большинству пользователей понадобятся от силы два - три первых, а во-вторых, мы всё-таки ограничиваем пользователя в возможности указать полную информацию о себе - так, если форму пожелает заполнить человек, у которого 10 сыновей, то некоторыми из них ему придётся пожертвовать.
  2. Осуществлять ввод информации поэтапно. Например, на первом этапе предложить пользователю ввести количество фотографий, которые он желает загрузить на сервер, а на втором этапе при помощи скрипта на сервере сформировать форму с нужным количеством полей ввода.

Однако, используя JavaScript, мы можем облегчить пользователю ввод информации о себе. Сделать это можно, например, следующим образом:

Пусть, для определённости, пользователю необходимо ввести информацию о детях, а для упрощения примера - только имя и дату рождения. Со стороны пользователя нам понадобится браузер, понимающий тэг и регулярные выражения, поддерживающий функцию getElementById объекта document, а также понимающий свойство innerHTML, например, Internet Explorer 5.5

В итоге у нас должно получиться что-то вроде следующего HTML-кода:

Чтобы вся эта конструкция заработала, необходимо еще написать две функции на JavaScript: добавление новой строки и удаление ошибочно добавленной строки. Причём, в данном примере предполагается, что количество строк с данными может быть и нулевым, кроме того, у данной реализации динамической формы есть недостаток: если удалить все строки, то добавить строки уже будет нельзя.

Таким образом, мы обнаружили, что использование регулярных выражений в JavaScript+DHTML открывает нам много новых возможностей для создания удобного пользовательского интерфейса. В частности, данный приём используется автором этих строк в интерфейсе администратора своего сайта для добавления нескольких картинок к странице в одной форме.

Читайте также: