2012-12-09 100 views
0

我在Ruby on Rails上运行JavaScript,当用户单击链接时将表单动态插入到页面中。为什么我的object.children未定义?

它不工作,但有一个特定的错误得到我的山羊:我的表单返回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> 
+2

声音像'form'不是DOM元素。你能告诉我们你如何调用'add_fields'函数(使用哪些值)? – Bergi

+0

你的意思是'childNodes'而不是'children'吗? – alex

+0

也许你的测试浏览器不支持['Element.children'](https://developer.mozilla.org/en-US/docs/DOM/Element.children) – Musa

回答

2

很明显,这是行不通的,因为一个元素不能有一个孩子是als o兄弟姐妹。

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

您的代码想是把formlinklink的兄弟姐妹的一个前一个孩子,这是不可能的。

请记住,.insertBefore必须从调用它被插入。因此,要在link之前插入form,必须从link的父项中调用.insertBefore


因此,也许你想用link.parentNode代替。

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

这会的link第二前一个兄弟之前插入form

+0

y虽然你的输入是有用的,但它并不能解释为什么Javascript根本不能识别我的div。例如,如果我使用标签和文本字段构建一个简单的div,然后将其传递给insertBefore,它将被插入(在您提交的更正后的场景中)。但是,我传递给函数的div没有。我能对你说实话吗?我觉得很沮丧。 – Laurent

+1

@Laurent:'form'是一串HTML? 'console.log(typeof form)'如果您提供了呈现的HTML而不是服务器端应用程序代码,那么当您提出JavaScript问题时,您会有更好的运气。 –

+0

我明白了。我正在传递表单(如您所见)和链接,并尝试将表单放置在链接之前。之前我没有转义javascript。但是,当我输入$(链接),而不是标签正确放置。如果有人对链接和$(链接)之间的区别有一个非常简单的解释,并且想分享它,我会很高兴。 – Laurent