Как вы используете Javascript для дублирования полей формы? - PullRequest
1 голос
/ 22 сентября 2009

Например, я хочу иметь HTML-форму, которая выглядит следующим образом:

<table>
  <tr>
     <td>Field A:</td>
     <td><input type='text' name='fielda[1]'></td>
     <td>Field B:</td>
     <td><textarea name='fieldb[1]'></textarea></td>
  </tr>
</table>

Я хочу добавить кнопку, которая дублирует всю мою вышеупомянутую форму, но меняет 1 на 2 для всех полей. Не только одно поле, но и весь раздел кода, включая таблицу. Также будет больше / других полей, чем те, которые я опубликовал.

Я уже пробовал это решение, которое делает именно то, что мне нужно:

http://www.quirksmode.org/dom/domform.html

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

Ответы [ 5 ]

6 голосов
/ 22 сентября 2009

Существует методика, называемая supplant , которая делает это. Я не писал это, я думаю, что Дуглас Крокфорд написал. Но я процитирую это:

Теперь, когда ваша программа JavaScript получила данные, что она может с ними сделать? Одна из самых простых вещей - генерация HTML на стороне клиента.

var template = '<table border="{border}"><tr><th>Last</th><td>{last}</td></tr>' +
   '<tr><th>First</th><td>{first}</td></tr></table>';

Обратите внимание, что у нас есть шаблон HTML с тремя переменными. Затем мы получим объект JSON, содержащий члены, соответствующие переменным.

var data = { 
    "first": "Carl", 
    "last": "Hollywood",    
    "border": 2 
};

Затем мы можем использовать метод вытеснения, чтобы заполнить шаблон данными.

mydiv.innerHTML = template.supplant(data);

Строки JavaScript не поставляются с методом вытеснения, но это нормально, поскольку JavaScript позволяет нам расширять встроенные типы, предоставляя им необходимые нам функции.

String.prototype.supplant = function (o) { 
    return this.replace(/{([^{}]*)}/g, 
        function (a, b) {  
            var r = o[b];
            return typeof r === 'string' ? 
                r : a; 
        }
    ); 
};

С http://www.json.org/fatfree.html

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

<script id="rowTemplate" type="text/html">
  <tr>
     <td>Field A:</td>
     <td><input type='text' name='fielda[{id}]'></td>
     <td>Field B:</td>
     <td><textarea name='fieldb[{id}]'></textarea></td>
  </tr>
</script>

Это позволит вам писать намного более красивый код, так как вы можете ссылаться на него с помощью getElementById.

Так что в вашем случае, вместо того, чтобы заполнять его объектом JSON, вы просто просматриваете сколько бы строк вы не добавили и не заменили идентификаторы.

4 голосов
/ 22 сентября 2009

Пример, на который вы ссылаетесь, имеет скрытую версию формы, которая используется в качестве шаблона. Этот шаблон имеет идентификатор (readroot), который позволяет легко его выбрать (getElementById), затем клонировать (node.cloneNode()) и вставить в DOM выше (node.insertBefore()) второй маркер в источнике (writeroot).

Количество дубликатов учитывается в переменной counter. Его содержимое обновляется (увеличивается) при каждом клонировании, а затем его значение добавляется ко всем именам полей в клонированном узле. (Поля исходного узла шаблона не имеют числового суффикса.)

Это действительно очень просто, просто изучите javascript в заголовке веб-страницы. Найдите в Google части, которые вы не можете понять, и вы добьетесь того, что искали, и узнаете некоторые из них в процессе. Прибыль!

3 голосов
/ 22 сентября 2009
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript">

    (function($){
          $countForms = 1;
          $.fn.addForms = function(){
                var myform = "<table>"+
                 "  <tr>"+
                 "     <td>Field A ("+$countForms+"):</td>"+
                 "     <td><input type='text' name='fielda["+$countForms+"]'></td>"+
                 "     <td>Field B ("+$countForms+"):</td>"+
                 "     <td><textarea name='fieldb["+$countForms+"]'></textarea></td>"+
                 "     <td><button>remove</button></td>"+
                 "  </tr>"+
                 "</table>";

                 myform = $("<div>"+myform+"</div>");
                 $("button", $(myform)).click(function(){ $(this).parent().parent().remove(); });

                 $(this).append(myform);
                 $countForms++;
          };
    })(jQuery);     

    $(function(){
        $("#mybutton").bind("click", function(){
            $("#container").addForms();
        });
    });

</script>
</head>
<body>
<button id="mybutton">add form</button>
<div id="container"></div>
</body>
</html>
0 голосов
/ 23 сентября 2009

Я думаю, что вы должны использовать какую-то библиотеку, такую ​​как jQuery, как предлагали некоторые. Это окупится.

Что касается создания шаблона и клонирования его в javascript, при использовании IE возникают некоторые проблемы (насколько я знаю, все версии). IE будет игнорировать любые программные изменения свойства name при дублировании, например. переключатели в форме. Поэтому, если вы не создадите пользовательские обработчики событий для переключателей, они не будут работать должным образом при копировании их по разделам (например, проверка кнопки в одном разделе приведет к тому, что кнопка в другом разделе будет не отмечена).

0 голосов
/ 22 сентября 2009

Упс, прочитал ваш вопрос неправильно. Это лучше:

function duplicate(frm) {
  newfrm = $(frm).clone();
  $(newfrm).each(function(i,o) {
     if (o.name != null) { // or if ($(o).attr("name"))
       o.name = replaceIndex(o.name);
     }
  });
  $(frm).parent().append(newfrm);
}

Не уверен насчет фактического синтаксиса. Например. как вы проверяете наличие атрибута. Легко найти в Google, хотя. Здесь replaceIndex (string) использует lastIndexOf (), чтобы найти last [x] и заменить его на [x + 1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...