[javascript] 단어(구분자) 단위 반응형 줄바꿈

 

얼마전 개발자 오픈채팅방에서

가변적인 너비의 div안에 DB에서 가져온 텍스트들을 넣는데

div의 너비가 바뀔때마다 자동으로 줄바꿈이 되어야 하는걸 만들어야 하는데

잘 모르겠다 라는 질문이 있었다.

간단하게 css로 줄바꾸면 되는거 아닌가 했는데

콤마(,) 로 구분되어진 단어들이고 단어안에 띄어쓰기도 들어가 있다고 한다.

즉 콤마로 구분되어진 단어들이 너비에 따라 자동으로 줄바꿈이 되어야 하며

단어들은 띄어쓰기가 포함되어 있고 폰트의 크기도 가변적으로 변할 수 있다고 한다.

 

재밌어 보여서 대충 구현을 해 보았다.

jsbin으로 구현해 보았으니

 

https://jsbin.com/tomojibaku/1/edit?js,output 

 

JS Bin

Sample of the bin:

jsbin.com

 

이 링크에 가서 확인을 하면 된다.

 

코드는

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div id="textContatiner" class="txt-container">
    
  </div>
</body>
</html>
cs

 

JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
var data = "일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈,육번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈,일번놈, 이번노 오옴, 삼번 노오 오옴, 사번노오오옴, 오번놈, 칠버어언 놈";
setTxt();
 
// 너비가 바뀔때마다 셋팅을 해준다.
$( window ).resize(function() {  
setTxt();
});
 
 
 
function setTxt(){
    // 너비가 변할때마다 div컨테이너를 비워주고 다시 셋팅
  var container = $("#textContatiner");
  container.empty();
 
  var conW = container.width();
  var dataArr = data.split(",");
 
  // 폰트크기도 가변적으로 바뀔수 있기 때문에 1글자의 너비를 구한다.
  container.append($("<span id='test'>한</span>"));
  var oneW = $("#test").width()*2;
  $("#test").remove();
  
  var lineData = "";
  var subData = "";
  var lineNo = 0;
  var spId ="sp"+ lineNo;
  var sp = $("<span id='"+spId+"'></span>");
  container.append(sp);
  
 
  for (var i = 0; i <dataArr.length; i++) {
     subData = lineData;
     lineData = lineData+","+dataArr[i];
    sp.text(lineData);
    var spW = sp.width();
    if(spW > conW - oneW){
      sp.text(subData);
      sp.css("display","block");
      lineNo++;
      i--;
      spId ="sp"+ lineNo;
      sp = $("<span id='"+spId+"'></span>");
      container.append(sp);
      lineData = "";
    }
    console.log(spW);
  };
  
  
  
}
cs

 

폰트가 바뀔수도 있으니 div안에 한글자를 넣어서 너비를 확인하고 클리어 시킨다음

콤마로 구분된것들을 하나씩 추가 하다가 일정 너비 이상이 되면

이전텍스트로 복원을 하고 새로운 span을 생성해 넣는 식이다.

더 깔끔하게 구현하려면 css도 좀 손봐야 하고

첫번째 문장에 들어가는 콤마 지우고 하면 쓸만할 것 같다.

 

VO에서 값을 가져오기 위해 vo.get이름() 이런식으로 가져오는데

getdata1 ~getdata32 이렇게 숫자증가단위로 여러개가 있는 경우

for문을 돌리면서 가져오고 싶을때가 있다.

vo를 for문으로 값을 가져오기 위해 자바 리플렉션을 사용했다.

저렇게 하면 메소드를 문자열로 바꿔서 불러올수가 있다.

 

map형식을 써도 되긴 하지만 애초에 vo형태를 잡아놓은것도 있고 다른데서 쓰고 있기 때문에

리플렉션의 비용이 조금더 들어가더라도 아래와 같은 방법을 사용 했다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    
        for(int count=1; count < 32; count++){
            
            String time = count+"";
            if(time.length()==1){
                time = "0"+count;
            }
            Class<?> c = vo.getClass();
            
            String value = null;
            try {
                Method method = c.getMethod("getT"+time);
                try {
                    value =  (String) method.invoke(vo);
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (NoSuchMethodException | SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            HisDataVO updateVO = new HisDataVO();
        
            if(value.equals("")){
                value = null;
            }
            System.out.println(time+"회 :"+value);
            updateVO.setCOUNT(value);
            updateVO.setRECORD_DAY(vo.getRECORD_MON()+time);
            updateVO.setBUILDING_ID(vo.getBUILDING_ID());
            try {
                 result = goalSettingService.updateHead(updateVO);
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println(e);
                System.out.println("업데이트 실패 "+time+"회");
                msg = "수정 실패 하였습니다";
            }
            
            
        }
        
cs

 

 

안녕하세요 시뮬제작자 입니다.

 

세븐나이츠2 포럼 유저 차단기 [웨일, 크롬 브라우저 확장프로그램] 가 업데이트 되어 안내 드립니다.

 

해당 프로그램은 구글크롬에서 검수 완료된 코드이며 

 

사용자에게 특정 권한을 요구하지 않습니다.

 

또한 수집되어지는 데이터 또한 사용자가 차단하고자 하는 유저의 닉네임 뿐이며

 

이는 각 사용자 브라우저에 쿠키로 저장이 됩니다. 다시말해 개발자는 사용자가 누굴 삭제 하는지

 

어떤 행동을 했는지 전혀 알 방법또한 없습니다.

 

 

04.16  sena2Block (포럼유저 차단기 for 웨일브라우저) 1.4 버전 업데이트 안내

 

1. 성능 최적화 업데이트 ( 1.0 버전 대비 약 70% 상승, 댓글 입력시 렉현상 제거)

2. 대댓글 차단

3. 유저 프로필 알람리스트 차단

 

 

 

다운로드 및 업데이트 링크

웨일 : https://store.whale.naver.com/detail/najbpdigjgdncblddolmebfpgadkcgim

크롬 : https://chrome.google.com/webstore/detail/sena2block/kbhofmnkchmglhifnaaheeefgbkjkooo?hl=ko

 

 

사용 방법

설치 후 새로고침 및 브라우저 재시작

차단 : 포럼 게시판에 차단 하고자 하는 유저 오른쪽 클릭 후 차단 버튼 클릭 

차단 해제 : 아무 유저 오른쪽 클릭후 나타나는 차단 유저중 해제하고 하는 유저 옆 해제 버튼 클릭

 

일부 오류

일부 환경에서 차단 새로고침 후 바로 차단기능이 적용이 안되는 현상이 있습니다.

이런경우 게시판 하단의 1.2.3.4 등의 다른 페이지로 이동후 정상 적용되는 임시 해결 방법이 있으니

참고 하여 주시길 바랍니다.

 

 


 

1. 엣지 브라우저

 

엣지브라우저 사용법은 아래 링크의 블로그를 참고 하여 주십시오

https://psychoria.tistory.com/720

 

https://extrememanual.net/32297

 

 

 

2. 모바일 버전 계획

 

현재 대부분의 모바일 브라우저는 성능상의 문제로 인해 모바일버전에선 확장 프로그램을 지원하지 않고 있습니다.

그러나 키위브라우저의 경우 모바일 버전에서도 크롬스토어의 확장 프로그램을 사용할수 있기에

크롬버전이 정상 등록된 이후에 모바일버전에서의 테스트를 진행할 예정 입니다. 그러나 스토어에 등록된 이후에나

테스트가 가능하기 때문에 테스트 기간이 매우 길어질 것으로 보이며 당분간은 모바일 버전에서의

차단기능은 사용하실수 없다는점 인지 하여 주시길 바랍니다.

 

 

감사합니다.



+ Recent posts