【问题标题】:Why is my object.children undefined?为什么我的 object.children 未定义?
【发布时间】:2012-12-09 23:36:41
【问题描述】:

我在 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>

【问题讨论】:

  • 听起来 form 不是 DOM 元素。您能否向我们展示您如何调用add_fields 函数(使用哪些值)?
  • 你的意思是childNodes而不是children
  • 可能你的测试浏览器不支持Element.children
  • " 我的表单(这是一个 div)" 嗯?它是哪一个?表单还是 div?
  • @Bergi:刚刚更新了我的回复,提供了有关 add_field 调用的值的更多详细信息。

标签: javascript ruby ruby-on-rails-3 forms railscasts


【解决方案1】:

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

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

您的代码希望将form 作为link 的孩子并且link 的兄弟姐妹之一之前,这是不可能的。

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


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

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

这将在link 的第二个兄弟之前插入form

【讨论】:

  • y 虽然您的输入很有用,但它并不能解释为什么 Javascript 根本无法识别我的 div。例如,如果我用标签和文本字段构建一个简单的 div,然后将它传递给 insertBefore,它就会被插入(在您提交的更正场景中)。但是,我传递给函数的 div 没有。我能对你说实话吗?我觉得很沮丧。
  • @Laurent:form是一串HTML? console.log(typeof form) 如果您提供了呈现的 HTML 而不是服务器端应用程序代码,那么在询问 JavaScript 问题时您的运气会更好。
  • 我想通了。我正在传递表单(如您所见)和一个链接,并试图将表单放在链接之前。我之前没有转义 javascript。但是当我输入 $(link) 时,标签被正确放置。如果有人对链接和 $(link) 之间的区别有一个非常简单的解释,并且想要分享它,我会很高兴。
  • @Laurent:说实话,我看不出你正在传递form。我所看到的只是您传递了\"#{escape_javascript(tag_field)}\",而我不知道您的服务器使用该语法呈现什么。如果它呈现像"#my_form" 这样的选择器字符串,那么您没有传递表单。您正在传递一个希望指向您的表单的选择器字符串 (think CSS)。所以form 就是那个字符串,$(form) 就是把那个字符串传递给$ 函数,我假设它是指jQuery 库。如果是 jQuery,它将使用该选择器执行 DOM 选择。
  • ...现在在您的情况下,link 正在传递this,这可能是接收事件的元素。当您执行$(this) 时,您正在使用该元素创建一个新的jQuery 对象(再次假设jQuery),这将改变.insertBefore 的含义,因为它将使用jQuery 的insertBefore原生 DOM .insertBefore。所以基本上听起来你需要做一些基础教程,涵盖原生 DOM 方法,然后使用 jQuery 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2017-04-07
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多