2012-12-09 3 views
0

사용자가 링크를 클릭 할 때 페이지에 동적으로 양식을 삽입하기 위해 Ruby on Rails에서 javascript를 실행 중입니다.왜 내 object.children이 정의되지 않습니까?

작동하지 않지만 한 가지 특정 버그가 염소를 가져옵니다. 즉, 내 양식은 form.children을 디버깅 콘솔에서 반환하지 않습니다. 여기

는 (레일로) 형태 :

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

application.js 그리고 여기에서 자바 스크립트이고;

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

나는 앱이 텍스트 등을 출력하여 실제로 자바 스크립트를 호출하는지 여부를 테스트했으며 작동합니다. 문제는 내 양식에 분명합니다.

마지막으로, 콘솔 출력 : 그런데

<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를 구현하기 위해 노력하고 있으며 재해되었습니다!

--edit --- 여기

내가 필드 요소 빌드 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

'children' 대신'childNodes'를 사용합니까? – alex

+0

테스트 브라우저가 ['Element.children'] (https://developer.mozilla.org/en-US/docs/DOM/Element.children) – Musa

답변

2

분명히 엘리먼트에 als 인 자식을 가질 수 없기 때문에 이것은 작동하지 않습니다. 형제. 귀하의 코드를 원하는

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

는 불가능하다 link의 형제 자매 중 하나 전에 link의 자식으로 form을 넣어이다.

.insertBefore부모에서 삽입되어야 함을 기억하십시오. 따라서 link 앞에 form을 삽입하려면 .insertBeforelink 부모에서 호출해야합니다.


어쩌면 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을 제공했다면 자바 스크립트 질문을 할 때 더 운이 좋을 것입니다. –

+0

나는 그것을 이해했다. 내가 볼 수 있듯이 양식과 링크를 전달하고 링크 앞에 양식을 배치하려고했습니다. 나는 전에 자바 스크립트를 탈출하지 못했습니다. 하지만 대신 $ (link)를 입력하면 태그가 제대로 배치되었습니다. 누구나 링크와 $ (링크)의 차이점을 간단하게 설명하고 공유하고 싶다면 기쁘게 생각합니다. – Laurent