0

我在 Ruby on Rails 上运行 javascript 以在用户单击链接时将表单动态插入页面。

它不工作,但一个特殊的错误让我的山羊:我的表单在调试控制台中返回 form.children UNDEFINED。

这是表格(在 Rails 中):

<div class="field">
<%= f.label :name, 'Tag:' %>
<%= f.text_field :name %>   
</div>

这是application.js中的javascript;

function add_fields(link, association, form) {
console.log(form);
console.log(form.children);
link.insertBefore(form, link.previousSibling.previousSibling);
}

我已经测试了该应用程序是否通过输出文本等实际调用了javascript并且它可以工作。问题显然出在我的表格上。

最后,控制台输出:

<div class="field">
<label for="post_tags_attributes_4_name">Tag:</label>
<input id="post_tags_attributes_4_name" name="post[tags_attributes][4][name]" size="30" type="text" />  
</div> application.js:21
undefined application.js:22
Uncaught Error: NOT_FOUND_ERR: DOM Exception 8 

顺便说一句,我正在尝试在动态插入的嵌套表单上实现 railscast #197,这是一场灾难!

- 编辑 - -

下面是我如何调用构建字段元素的 add_fields 函数:

红宝石功能:

module TagsHelper
    def link_to_add_fields(name, post_form, association)
        new_object = post_form.object.class.reflect_on_association(association).klass.new
        tag_field = post_form.fields_for :tags, new_object do|tag_form|
            render("tag_field", :f=>tag_form)
        end
        #debugger
        link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(tag_field)}\")")
    end
end

这是 tag_field html:

<div class="field">
    <%= f.label :name, 'Tag:' %>
    <%= f.text_field :name %>   
</div>
4

1 回答 1

2

显然这行不通,因为一个元素不能有一个也是兄弟的孩子。

link.insertBefore(form, link.previousSibling.previousSibling);

您的代码想要作为 ' 兄弟姐妹之一的form孩子link link之前,这是不可能的。

请记住,.insertBefore必须从它被插入的父级调用。所以要在form之前插入link.insertBefore必须从 的父级调用link


所以也许你打算link.parentNode改用。

link.parentNode.insertBefore(form, link.previousSibling.previousSibling);

这将插入formlink.

于 2012-12-09T23:52:00.257 回答