2012-07-19 1 views
1

사용자가 콘텐츠를 작성할 수있는 CMS 코드가 있습니다. 해당 텍스트 영역에 입력 된 텍스트에 대한 미리보기를 표시하려고합니다 (여기서는 스테이크 오버 플로우와 비슷합니다). 페이지가 처음로드되면 텍스트 영역이 이미 채워지고 JavaScript가 미리보기를 업데이트하는 데 사용됩니다. 미리보기 섹션의 DOM이 완전히 업데이트되면 미리보기 섹션에서 추가 후 처리가 수행됩니다.추가 처리 전에 동적 DOM 업데이트 대기

관심있는 질문이 jQuery/Javascript - How to wait for manipulated DOM to update before proceeding with function인데, 실행하기 전에 잠깐 멈추려는 시간이 명확하지 않아서 문제가되는 setTimeout()에 의존합니다.

DOM의 업데이트가 완료되지 않았기 때문에 약 50 %의 시간 동안 내 후 처리가 조기에 중단되었습니다. 문제를 해결하기 위해 jQuery의 Callbacks 큐 메커니즘을 사용해 보았습니다.

후 처리를 시작하기 전에 동적으로 수정 된 DOM을 먼저로드하는 가장 좋은 방법은 무엇입니까?

예를 들면,

// using the provided source content, update the DOM indicated by 
// the destination css selector string 
function updatePreview(cssSelectorDst, content){ 
    $(cssSelectorDst).html(content); 
    console.log("preview updated"); 
} 

// if a <ul> appears at the beginning of the content, designate it 
// as a keypoints section 
function updateKeypoints(cssSelectorDst){ 
    ... 
    console.log("keypoints updated"); 
} 

// update preview section using content from iframe (using tinyMCE) 
function updateFromIframe(iframeSelector, cssSelectorSrc, cssSelectorDst){ 

    // gather source data 
    var iframe = $(iframeSelector); 
    var content = $(iframe).contents().find(cssSelectorSrc).html(); 

    // set up callbacks to ensure proper order and completion of actions 
    var callbacks = $.Callbacks(); 
    callbacks.add(updatePreview); 
    callbacks.add(updateKeypoints); 
    callbacks.fire(cssSelectorDst, content); 
} 

답변

2

.html가 동기, 그것은 HTML을 추가 완료 될 때까지 실행을 시작하지 않습니다 후 코드입니다.

여기서 $.Callbacks() 또는 모든 대기열 시스템을 사용할 필요가 없습니다.

// Update Preview 
updatePreview(); 
updateKeypoints(); 

당신이이 .html()이 아직 완료되지 않았기 때문에 그렇지 않은 작동하지 않는 것을 발견하면

이 문제는 다른 곳에있다.

+0

케빈, html() 동기 부여에 대한 설명에 감사드립니다. 그게 알아두면 좋다! –

0

Kevin B가 제안한 것처럼 문제는 html()에 대한 호출이이 메서드가 호출 될 때 항상 데이터가있는 것은 아니라는 것이 었습니다. 결국 폴링이 설정되므로 (예, setTimeout() 사용); 블록 (오히려 익명의 함수)에 대해 선량에게 감사해라. 그렇지 않으면 거의 우아하지 않을 것이다.

function updateFromIframe(iframeSelector, cssSelectorSrc, cssSelectorDst){ 
    var iframe = $(iframeSelector); 
    var content = $(iframe).contents().find(cssSelectorSrc).html(); 

    if(content == null){ 
    console.log("content not yet available; trying again..."); 
    return setTimeout(function(){updateFromIframe(iframeSelector, cssSelectorSrc, cssSelectorDst)}, 50); 
    } 

    updatePreview(cssSelectorDst, content); 
    updateKeypoints(cssSelectorDst, content); 
} 

브라우저 콘솔을 확인하면이 상황을 잘 처리합니다. 처음에는 폴링이 필요하지 않아야한다는 사실에 신경 쓰지 마십시오!

content not yet available; trying again... 
content not yet available; trying again... 
content not yet available; trying again... 
content not yet available; trying again... 
content not yet available; trying again... 

content: <ul><li>condimentum rhon ... nunc, <br><br></p> 
preview updated 

keypoints updated