2010-03-10 4 views
5

HTML로 트리 브라우저를 구현하고 있습니다. 노드를 클릭 할 때 노드의 자식 요소를 추가하는 함수를 호출합니다. 여태까지는 그런대로 잘됐다. 이제이를 확장하기 위해 자식 요소 중 하나의 클릭 핸들러를 즉시 호출하려고합니다. 내 문제는 jQuery 그냥 방금 추가 된 자식 요소를 찾을 수 없습니다. 디버거를 단계별로 실행하면 브라우저에서 새 요소를 렌더링하기 전에 요소를 찾기위한 코드가 호출됩니다.jQuery를 사용하여 동적으로 추가 된 HTML 요소를 찾을 수 없습니다.

새로 추가 된 HTML이 표시 될 때까지 기다릴 수있는 이벤트가 있습니까 (onload 어쩌면 유사)? 또는 이전에 강제로 렌더링을 호출 할 수있는 방법은 무엇입니까? 어떤 제안이라도 환영받을 것입니다.

참고 : 이후로 문제는 브라우저 또는 jQuery가 아니라 내 잘못이라고 깨달았습니다. 내 대답은 아래를 참조하십시오.

+0

일부 코드가 도움이 될 것입니다에 대한

$(document).on("click","#Cancel" , function(){ //do something }); 

, 방문 http://api.jquery.com/on/을 사용되지 않습니다. –

+0

좀 더 구체적인 해결책을 제공하는 데 문제가되는 코드를 추가 할 수 있습니까? – deceze

답변

1

새로운 요소가 렌더링 될 때까지 setTimeout()을 사용하여 코드를 지연시킴으로써 문제가 발생했습니다. 이상적인 솔루션은 아니지만, 내가 선택한 제한 시간은 상당히 임의적입니다.

나는 그것의 바닥에있다. HTML에 콜백을 통해 비동기 적으로 추가하는 기능을 호출했습니다. 그래서 새로운 HTML 요소를 찾으려고 할 때, 실제로는 아직 존재하지 않았습니다. 콜백이 새로 추가 된 요소를 처리하는 책임이 있으므로 콜백을 변경 했으므로 콜백이 제공 될 것임을 보장합니다. JQuery와 1.7+ 그래서이 시도 이후

10

이 같은 단지 .click()의 대신에 .live() for this, 장비 사용자의 클릭 핸들러를 사용할 수 있습니다

$(document).ready(function() { 
    //instead of $(".myTreeNode").click(.... 
    $(".myTreeNode").live('click', function() { 
    //Do stuff 
    }); 
}); 

.click()은 '그래서 새로운 요소는 돈, 그것은 실행될 때이 을 발견 한 요소에 이벤트 처리기를 바인딩 핸들러가 없습니다. .live() 대신 DOM 수준에서 클릭 소리가 들리기 때문에 대기합니다. 따라서 지금 또는 나중에 추가되는지는 중요하지 않습니다. 많은 요소가있는 경우에는 모든 요소에 대해 1 대신 이벤트 처리기를 사용하고, 몇 가지 요소를 수행 한 후에는 이벤트 처리기를 사용하는 것이 더 효율적입니다.

+0

나는 그것을 시도했지만 그것을 고치지 않았다. 문제는 새로 추가 된 HTML은 렌더링되기 전까지는 jQuery에서 액세스 할 수없는 것처럼 보이며 여전히 미래에 있다는 점입니다. –

+0

@Charles - 클릭 이벤트 바인딩 이외에 뭔가를하고 있습니까? 좀 더 지역적으로 원할 경우 클릭은'live()'또는'.delegate()'에 의해 처리되어야합니다. –

2

"라이브"는 당신을 돕기 위해 자세한 내용

관련 문제