2014-11-07 4 views
0

초보자를위한 질문은 유감이지만 WebKit 문제와 관련이 있습니다. I는 다음 JS 코드를 가지고HTML의 TextArea 요소를 강제로 업데이트하는 방법은 무엇입니까?

var Module = { 
     preRun: [], 
     postRun: [], 
     print: (function() { 
      var element = document.getElementById('output'); 
      if (element) element.value = ''; // clear browser cache 
      return function(text) { 
      text = Array.prototype.slice.call(arguments).join(' '); 
      // These replacements are necessary if you render to raw HTML 
      //text = text.replace(/&/g, "&"); 
      //text = text.replace(/</g, "&lt;"); 
      //text = text.replace(/>/g, "&gt;"); 
      //text = text.replace('\n', '<br>', 'g'); 
      console.log(text); 
      if (element) { 
       element.value += text + "\n"; 
       console.log('updated element.value'); 
       element.scrollTop = element.scrollHeight; // focus on bottom 
      } 
      }; 
     }) 

요소는 텍스트 영역 원소 :

<textarea id="output" rows="8"></textarea> 

I가 그 함수를 사용 PRINTF 코드가 다음에 사용자 이름을 입력하도록 프롬프트를 나타낸다. 그래서 브라우저 콘솔에서 'updated element.value'가 표시되고 프롬프트 대화 상자가 표시되기 전에 textarea에 텍스트가 인쇄 될 것으로 예상됩니다.

변경 후 textarea을 새로 고침하려면 어떻게해야합니까 (element.value += text + "\n")?

크롬/파이어 폭스에서는 예상대로 작동하지만 Safari (WebKit)에서는 실패합니다. 프롬프트가 표시되는 순간에는 출력이 표시되지 않습니다. 대화 상자가 표시됩니다.

답변

1

내게는 할 수없는 것처럼 들리지만, 내가 알지 못하는 Webkit 관련 해킹이있을 수 있습니다. 어쩌면 모든 브라우저가 예상했던 동일한 렌더링주기 동안 두 업데이트를 수행하지만 Safari는 프롬프트를 먼저 표시하고 프롬프트가 닫힐 때까지 나머지 업데이트를 일시 중지합니다.

가장 확실한 해결 방법은 텍스트 영역 업데이트는 메시지 잠금 일 전에 발생하는 것을 보장 할 가능성이

print('lorem ipsum'); 
setTimeout(function(){ 
    var response = prompt('my question here'); 
    //handle the response 
}, 10); 

같은 것입니다.

+0

지연이있는 다른 스레드에서 명령 흐름을 중단하고 동시 실행을 시작하면 바람직하지 않습니다. 배경 (지연 코드)에서 값을 반환하는 방법을 모르겠습니다. – 4ntoine

+0

그래, 쉽게 엉망이되어 최후의 수단이되어야합니다. (지연된 코드에서 실제로 돌아올 수는 없지만 논리를 분할해야합니다. 내가 생각한 "프롬프트 스레드"에서 호출 할 수있는 "이후"청크. –

관련 문제