개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.
ScrollPosInfo 나 MovePos 혹은 MoveToFieldEx 를 이용해서 화면 전환 한 뒤에
VertPos 를 추출하려고 하면 제대로 값을 못가져오는 경우가 다반사입니다.
비동기 형식으로 구현한 것도 아닌데 해당 값이 제대로 동작하지 않는 이유와 해결법을 알고 싶습니다.
function scrollSetBefore(idx, start){
if(message.HwpCtrl.ScrollPosInfo.Item("VertPos") != 0 && !start){
message.ScrollPosInfo(0,0);
setTimeout(() => scrollSetBefore(idx), 10);
return;
}
if(end == null)
message.HwpCtrl.MovePos(3);
end = message.HwpCtrl.ScrollPosInfo.Item("VertPos");
if(end == 0){
setTimeout(() => scrollSetBefore(idx, true), 10);
}else{
endScroll = end;
message.MoveToFieldEx("headcampaign{{" + idx + "}}");
setTimeout(() => scrollSet(idx), 10);
end = null;
}
}
var before = 0;
function scrollSet(idx){
var next = message.HwpCtrl.ScrollPosInfo.Item("VertPos");
if(before == next || next == endScroll){
setTimeout(() => scrollSet(idx), 10);
return;
}
scrollPos[idx] = next;
before = next;
if(++idx == an.options.length){
if(pos)
message.HwpCtrl.SetPos(pos.list, pos.para, pos.pos);
else
message.ScrollPosInfo(0,0);
pos = null;
before = 0;
}else{
message.HwpCtrl.MovePos(3);
message.MoveToFieldEx("headcampaign{{" + idx + "}}");
setTimeout(() => scrollSet(idx), 30);
}
}
HwpCtrl.Open 에서 콜백 함수로 위의 메서드를 호출하는데요. 나름 비동기식으로 구현해서 scroll 값을 가져오려고 무던히 노력하는데도 스크롤 값이 간헐적으로 다르게 나옵니다.
Open 콜백 함수에서 동작하는데도 본문이 제대로 다 표출이 안된 경우가 있는건가요? 아니면 어떤 경우일까요. 확인 부탁드립니다.
아니죠… 해당 문제는 프론트에서 일어나는 일인데 어째서 서버 사양을 말씀하시는건지 모르겠네요.
이미 말씀 드렸듯이 해당 현상이 상시 발생하는게 아니라 간헐적으로 발생한다고 말씀드렸습니다.
해당 테스트를 어떤 방식으로 하셨는지 알고싶습니다.
개발자 툴로 디버깅 모드로 확인하면서 진행하면 아마 동일한 값을 반환할 테지만
실행 후에 각 페이지의 scroll 값을 일정 변수에 담아두고 (위의 scrollPos Array 처럼)
완료 시 해당 변수에 담겨있는 값을 확인해보시면 간헐적으로 다른 값이 표출될겁니다.
화면업데이트가 비동기 식으로 일어난다고 하셨는데 그게 단계적으로 스크롤 값이 다르게 나올수도 있나요?
비동기 상황을 고려하여 scroll 값 변동이 일어나는 시점을 이전 위치, 문서끝이 아닌 경우가 확인 되고 나서야 진행하는 식으로 코드를 짰는데요.
또한 클라이언트 피씨 사양에 따라서 발생하는 오류라면 그렇지 않도록 개발해야하지 않나요?
테스트 하는데 어려울건 없겠습니다만…
어차피 setTimeout을 하게되면 그전의 모든 동작과 별개로 동작하는데 중복으로 적용 하는것은 시간을 330으로 주는것과 다를바가 없어보이는데요.
말씀하시는게 어떤 효과를 보기 위함인지 알고 싶습니다.
그리고 테스트시 330이라는 시간이 제법 긴 시간이라 검색하는 부분 갯수에 따라 로딩 시간이 유의미하게 길어질거 같은데요.
HwpCtrl.Open 에서 콜백 함수가 실행되는 시점은 문서가 모두 로딩된 시점이 아닌 백엔드에서 문서 변환이 끝난 시점입니다.
따라서, 올려주신 코드를 실행했을 때 간헐적으로 다른 값을 가져오는 이유는 문서 로딩이 끝나기 전에 vertPos 값을 추출하려고 해서 입니다.
웹한글기안기의 Properties 중에 문서의 페이지수를 가져오는 HwpCtrl.PageCount 가 있습니다.
이 Properties를 얻기 위해서 웹한글 기안기는 내부적으로 문서의 페이지수를 계산하기 위해 Pagination을 진행하게 됩니다.
해당 Properties를 사용하여, 문서의 pagination을 유도하고, 올려주신 코드로 테스트 해보시기 바랍니다.
아직 로딩이 되지 않은것이 본문이 제대로 표출되지 않았다는 의미가 아니었나요?
로딩이 완료된 시점을 알수 있는 방법은 없나요?
말씀하신 페이지네이션 값은 스크롤 값의 일관성을 보장해주지 않았습니다.
scroll 값을 저장하는 각 시점에 페이지네이션 값을 console로 찍어서 테스트한 결과 스크롤 값이 다르게 찍혀도 페이지네이션 값은 일정했습니다.
여러가지로 혼란을 드린 것 같아 지금까지의 답변을 정리해서 말씀드립니다.
올려주신 코드 내부에서 사용 중이신 MovePos, MoveToField와 같은 본문 내의 이동이 있는 API 들을 사용하였을 때 본문의 스크롤 관련된 정보들을 비동기로 업데이트 하는 로직을 수행하게 됩니다.
스크롤 관련 정보 업데이트가 끝나지 않은 상태일 때 VertPos 값을 추출하려고 하면 다른 값이 나올 수 있습니다.
원하시는 답변을 드리고자 작성자님의 의도를 파악하고, 테스트 후에 가이드 드리고 있지만 올려주신 코드만으로는 상세한 의도를 파악하기에 어려움이 있습니다.
구현하고자 하시는 로직이나 방향을 상세히 설명해주시면 사용하시는 API가 아닌 다른 방법으로 구현할 수 있다면 내부적으로 검토 후에 답변 드리겠습니다.
우선 MoveToField에서는 스크롤 이동이 생기지 않습니다.
MoveToFieldEx 말씀하시는 것 같은데
최초 질문에서 말씀 드렸듯이 HwpCtrl.Open 콜백에서는 화면이 전부 로딩된 상태가 아니다보니
필드명으로 이동했을때 간헐적으로 스크롤 값이 다른 현상이 발생합니다.
스크롤이 다른것이 MoveToFieldEx를 했을때 캐럿이 스크롤 최상단에 위치하는 경우도 생기고
중간에 위치하는 경우도 생깁니다.
또한 주신 코드대로 구현해본 결과 4회 이동한 후에 최종적으로 1회 더 스크롤이 이동되는 경우가 발생합니다.
더 아래쪽에 있다가 위로 올라가는 식으로요.