"JQuery 버튼 수행시간동안 disabled"의 두 판 사이의 차이

잔글 (봇: 자동으로 텍스트 교체 (-</source> +</syntaxhighlight>, -<source +<syntaxhighlight ))
 
(다른 사용자 한 명의 중간 판 12개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개요==
==개요==
;jQuery 버튼 수행시간동안 disabled
;jQuery 버튼 수행시간동안 disabled
* 버튼 클릭시 어떤 작업을 하는 동안 버튼을 disabled로 하고 싶다.
* 또 작업이 끝나면 버튼을 enabled로 하고 싶다.
* 자바스크립트는 단일스레드로 처리되므로 onclick시에 'disabled 적용 → 작업 → enabled 적용'으로 구현하더라도 onclick 전체가 끝나기 전까지 화면에 반영(렌더링)되지 않는다.
* 그래서 여기서는 onclick에서는 disabled 적용·렌더링만 수행하고, 실제 작업은 setTimeout()을 이용해 별개의 흐름을 만들어 분리시켰다.


<source lang='html'>
<syntaxhighlight lang='html'>
<style>
<style>
  button {
button { width: 300px; height: 50px; }
    width: 300px;
button:disabled { background: #fee; border: 0 }
    height: 50px;
  }
 
  button:disabled {
    background: #fee;
    border: 0
  }
 
</style>
</style>


20번째 줄: 16번째 줄:
<script src="//code.jquery.com/jquery.min.js"></script>
<script src="//code.jquery.com/jquery.min.js"></script>
<script>
<script>
   function process(num) {
   function process() {
     $('#my-progress').attr('max', num);
     // 실제 작업 처리
     for (var i = 1; i <= num; i++) {
     console.log('data processing job takes 2 seconds...');
      console.log('processing ' + i);
    ts1 = new Date().getTime() + 2000;
      // sleep 1 sec
    do { ts2 = new Date().getTime(); } while (ts2 < ts1);
      ts1 = new Date().getTime() + 100;
     // 버튼 활성화
      do ts2 = new Date().getTime(); while (ts2 < ts1);
     }
  }
 
  function async_job() {
    process(30);
     $('#my-btn').prop('disabled', false);
     $('#my-btn').prop('disabled', false);
   }
   }
37번째 줄: 27번째 줄:
   $(function() {
   $(function() {
     $('#my-btn').click(function() {
     $('#my-btn').click(function() {
      // 버튼 비활성화
       $('#my-btn').prop('disabled', true);
       $('#my-btn').prop('disabled', true);
       setTimeout(async_job, 0);
      // 작업을 타이머에게 부탁하고 끝냄
       setTimeout(process, 0);
     });
     });
   });
   });
</script>
</syntaxhighlight>
<jsfiddle>a5gpptjq</jsfiddle>


</script>
==같이 보기==
</source>
* [[jQuery 버튼 비활성화]]
<jsfiddle height='180'>a5gpptjq</jsfiddle>
* [[HTML input 태그 disabled 속성]]


[[분류: jQuery]]
[[분류: jQuery]]

2020년 11월 2일 (월) 02:53 기준 최신판

1 개요[ | ]

jQuery 버튼 수행시간동안 disabled
  • 버튼 클릭시 어떤 작업을 하는 동안 버튼을 disabled로 하고 싶다.
  • 또 작업이 끝나면 버튼을 enabled로 하고 싶다.
  • 자바스크립트는 단일스레드로 처리되므로 onclick시에 'disabled 적용 → 작업 → enabled 적용'으로 구현하더라도 onclick 전체가 끝나기 전까지 화면에 반영(렌더링)되지 않는다.
  • 그래서 여기서는 onclick에서는 disabled 적용·렌더링만 수행하고, 실제 작업은 setTimeout()을 이용해 별개의 흐름을 만들어 분리시켰다.
<style>
button { width: 300px; height: 50px; }
button:disabled { background: #fee; border: 0 }
</style>

<button id='my-btn'>수행</button>

<script src="//code.jquery.com/jquery.min.js"></script>
<script>
  function process() {
    // 실제 작업 처리
    console.log('data processing job takes 2 seconds...');
    ts1 = new Date().getTime() + 2000;
    do { ts2 = new Date().getTime(); } while (ts2 < ts1);
    // 버튼 활성화
    $('#my-btn').prop('disabled', false);
  }

  $(function() {
    $('#my-btn').click(function() {
      // 버튼 비활성화
      $('#my-btn').prop('disabled', true);
      // 작업을 타이머에게 부탁하고 끝냄
      setTimeout(process, 0);
    });
  });
</script>

2 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}