2010-11-10 123 views
3

我正在研究一个Django项目。但我的问题是在JQuery上。 我用jquery.formset.js JQuery插件在inline_formsets,formset_factories中动态添加表单。这工作相当不错。它复制第一行元素与其他装饰标签(如div,span,img ..),并将新行添加到表格的底部。所以复制的行可以像原点一样出现。重复的jQuery UI问题

我还在我的表单中使用jquery ui (datepicker, autocomplete..etc)

由于插件尝试不留下任何接口片段,因此复制会复制所有内容,即使是由datepickers和autocompletes附加的htmls也是如此。当它克隆第一行时,所有东西都被克隆,即使事件被克隆。所以当我点击新出现的datepicker输入日历事件工作在第一行的元素。

我在努力寻找决定。这里是什么在我脑海里至今..

  1. 声明jQuery UI的(日期选择器,并自动完成)为现场? 。像

    $( “日期”)生活( '...',函数(){$(本).datepicker();})

    但我不知道哪个事件应该是为此处理。我想这是不可能处理新创建或附加的元素。

  2. 将脚本放在行内?元素之后

    $( “#id_birthday_1”)日期选择器()。

    这似乎是最好的主意,但重复已经复制了额外的元素/ htmls。所以它会重新渲染元素。

  3. 我应该编辑js插件吗?像绑定所有jquery ui的事件声明,除了渲染和附加以及样式。这将是一个巨大的混乱。我不想每次都搞砸了这样的..如果我需要添加一个新的用户界面,我应该编辑不断的js

alt text

每一个想法,将不胜感激:)

+0

我敢打赌,这两个框具有相同的ID – naugtur 2010-11-25 07:17:19

+0

其实没有.. js的插件创建使用表单前缀 – jargalan 2010-12-15 04:48:17

回答

3

时添加的表单集插件可以调用一个函数的新形式,你可以初始化那里新增的字段。该函数应该采用一个参数,row;它会传递一个jQuery对象,包装刚刚添加的表单。

$('#myFormset1Table tbody tr').formset({ 
    added: function(row) { 
     row.find(".date").datepicker(); 
    } 
}); 
4

你的第一个想法是一个很好的想法。

  1. 给所有的datepickers一个类来标识它们。
  2. 克隆它们全部。
  3. 然后,使用jQuery each功能使之成为datepickers:

$(".dates").each(function (i) { 
    $(this).datepicker(); 
} 

所以基本上,复制所有元素,然后再激活日期选择器。 jQuery的each允许您在一个步骤中激活整个元素列表。

编辑:如果您需要动态生成新的克隆,则可以将该行的HTML存储在变量中。当你的用户增加了一排,你可以这样做:

$(".date", $(rowHTML).appendTo($("#my-form-fields"))).datepicker(); 

它增加了一个新的行插入表格,然后初始化该行的日期选择器。

EDIT2:和上面的代码就相当于

$(rowHTML).appendTo($("#my-form-fields")).find(".date").datepicker(); 
+0

耶新的ID,但克隆工作在运行时(动态),我的意思后的文件已经准备就绪。添加底部允许用它们的元素创建一个新行。每个函数仅对默认元素有效,但对新创建(克隆)的元素无效。 – jargalan 2010-11-18 03:50:15

+0

@zomboid我的编辑解释了我将如何去做这件事。 – erjiang 2010-11-21 01:51:50

1

你可以听onSelect或者甚至
$('.dates').focus(index){ $($('.dates')[index]) //etc. }