2012-05-08 3 views
1

Firefox/Chrome/Safari 확장 프로그램을 사용하여 웹 페이지에서 콘텐츠를 추출하려고합니다. 캡처는 정상적으로 작동하지만 전체 웹 페이지를 캡처하면 오랜 시간이 걸리고 UI가 차단됩니다. 캡처/DOM 구문 분석 코드를 다른 스레드 (웹 작업자)로 이동하려고합니다. 그러나 웹 작업자는 DOM에 액세스 할 수 없습니다. 이 문제를 해결할 수있는 방법이 있습니까? 나는 웹 페이지에 스크립트를 삽입하려면 다음 코드를 사용하고웹 작업자의 HTML DOM 구문 분석

:

function executeScript(script, messageKey, callback) { 
     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); 
     var mainWindow = wm.getMostRecentWindow("navigator:browser"); 
     mainWindow.gBrowser.selectedBrowser.messageManager.loadFrameScript(script, true); 
     mainWindow.gBrowser.selectedBrowser.messageManager.addMessageListener(messageKey, callback); 
    } 

executeScript("chrome://extension/content/contentscript.js", "onSelectionReceived", onSelection); 

모든 DOM 처리가이 스크립트 내부에서 일어나고있는 'contentscript.js'

+0

여기에 "추출"무엇을 의미합니까 : 여기

는 배열 처리의 기본 예입니다? –

+0

현재 탭에서 열려있는 웹 페이지에서 html 데이터를 가져 오려고합니다. 파이어 폭스에서 다음 api를 사용하여 웹 페이지에 스크립트를 주입하고 있습니다. http://pastebin.com/bzMnrnJ2 –

+0

데이터가 파싱 되었으면 어떻게 보이시겠습니까? – Jake

답변

1

작업은 당신이 시도하는 경우 DOM과 상호 작용할 필요성을 수행하고 오랜 시간이 걸리며 리팩토링 할 수 없으므로 은 DOM과 상호 작용하기 위해이 필요하다. 그러면 WebWorkers를 사용하지 않는 방법이있다. (당신이 발견으로, WebWorkers는 DOM에 액세스 할 수 없기 때문에)

는 배열 처리를 사용하는 것이 좋습니다. 기본 아이디어는해야 할 일을 여러 청크로 나눠서 작업 청크가 끝나면 주기적으로 Timer를 사용하여 DOM (UI Thread)에 제어권을 돌려 주면됩니다.

function saveDocument(id){ 
    var tasks = [openDocument,writeText,closeDocument,updateUI] 

    setTimeout(function(){ 

     //execute the next task 
     var task = tasks.shift(); 
     task(id); 

     //determine if there's more 
     if (tasks.length > 0) { 
      setTimeout(arguments.calee, 25); 
     } 
    }, 25); 
} 
+0

'Array Processing'이라는 용어는이 접근법과 아무 관련이 없습니다. 이 솔루션의 핵심은 '비동기 실행'을 사용하고 있기 때문입니다. –

+1

@ WillemD'haeseleer 기술적으로 올바른 용어 일 수 있습니다. 하지만 나는 머리카락을 쪼개는 것처럼 느낀다. 매번 작업 한 후에 시간 제한을 사용하여 DOM을 다시 제어 할 수 있다는 것을 평신도의 용어로 설명했기 때문이다. – 7wp

+0

귀하의 솔루션 자체에 괜찮습니다, 내 요점은 당신이 존재하지 않는 용어를 소개해서는 안됩니다. 이 피드백을 사용하여 질문을 개선하고 심지어 업보를 얻을 수도 있습니다. –