ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프론트엔드 개발자를 위한 JS - 2장
    Java Script/프론트앤드 개발자를 위한 자바스크립트 2020. 4. 24. 18:44
    반응형

    2장. HTML속의 자바스크립트

     <script>요소

     ○ JS를 HTML 페이지에 삽입하는 일차적인 방법

    1. async 
    - Optional, 외부 스크립트 파일을 불러올 때만 유효. 스크립트를 즉시 내려받지만 자원을 받거나 다른 스크립트를 불러오는 등 다른 페이지 작업을 방해해서는 안됨.

    2. charset 
    - Optional, src 속성으로 명시한 코드의 문자셋을 지정. 브라우저가 이 속성값을 무시하는 경우가 많아 잘 안씀.

    3. src 
    - Optional, 실행할 코드를 포함한
     외부 파일의 위치를 지정.

    4. defer 
    - Optional, 외부 스크립트 파일을 불러올 때만 유효. 문서의 콘텐츠를 완전히 파싱하고 표시할 때까지  
    스크립트 실행을 지연해도 안전함을 나타냄.

    5. type 
    - Optional, language 속성을 대체하기 위해 만들어짐. 스크립트 언어의 콘텐츠 타입(마임 타입)을 지정. 
    default 값은 "text/javascript", 따라서 생략해도 괜찮음. 
    JS 파일은 "application/x-javascript" 마임 타입으로 전송됨 ~> type 속성을 명시적으로 지정하면 script가 무시될 가능성이 있음. 
    인터넷 익스플로러를 제외한 브라우저는 "application/javascript"와 "application/ecmascript"도 인식함.

    6. language - 폐기, 대부분 브라우저에서 이 속성을 무시, 쓰면 안됨.

     ○ 인라인 JS 코드 (Inline Javascript) - 태그 내에 직접 js 명령어를 작성하는 방법

    <h1 onclick="alert('ok!')">인라인 방식 자바스크립트</h1>
      <h1>내부 자바스크립트</h1>

     

     ○ 내부 JS 코드 (Internal Javascript) - 페이지에서 직접 작성

      <script type="text/javascript">
          function sayHi(){ 
              alert("Hi!");
          }
      </script>

    코드는 위에서부터 차례로 순차해석, 함수 정의가 먼저 해석되어 인터프리터 환경 내부에 저장됨.

    <script> 코드 전체를 평가하기 전에는 페이지의 나머지 콘텐츠를 불러오거나 표시하지 않는다.

    또한, JS 코드 사용할 때는 문자열"</script>"를 쓸 수 없음.

     

    <script type="text/javascript">
       function sayScript(){ 
        alert ("</script>"); 
      } 
      </script>

    문자열"</script>"는 script를 닫는 태그로 인식돼서 error 발생. 이러한 경우 "/" 를 앞에 붙여 이스케이프해서 사용.

     

    <script type="text/javascript">
       function sayScript(){ 
        alert ("<\/script>"); 
      } 
      </script>

    ▲ 코드 정상 작동

     

     ○ 외부 JS 코드 (External Javascript) - 작성되어있는 js파일 불러옴.

    <script type="text/javascript" src="example.js"></script>

    ※ Internal JS와 External JS를 동시에 사용하면, 브라우저는 Script 파일을 내려받아 실행하며 Internal 코드는 무시함.

     

     ○ defer와 async를 제외하고는 script 요소는 페이지에 나타난 순서대로 실행.

     

     ○ <script>태그는 <head>태그 안에 작성하는 것이 일반적이지만, 불러오는 JS파일이 많아지면 JS코드를 전부 내려받고 -> 파싱하고 -> 해석을 끝날 때까지 페이지 렌더링이 멈추게 된다. 브라우저는 <body>태그를 만나면서 페이지 렌더링을 시작하기 때문이다. 이런 이유로 최신 웹 애플리케이션에서는 <body>요소 안에, 페이지 콘텐츠 마지막에 쓴다.

    <!DOCTYPE html>
       <html>
        <head>
         <title>Example HTML Page</title>
        </head>
        <body>
         < !— 페 이 지 콘 덴 츠 -->
         <script type="text/javascript" src="ex1.js"></script>
         <script type="text/javascript" src="ex2.js"></script>
        </body> 
       </html>

     

     ○ defer를 이용해서 페이지 전체를 파싱한 후에 스크립트를 실행. (코드는 즉시 내려받음)

    <!DOCTYPE html> 
     <html> 
      <head> 
       <title>Example KTNL Page</title>
        <script type="text/javascript" defer src="ex1.js"></script>
        <script type="text/javascript" defer src="ex2.js"></script>
      </head> 
      <body> 
       < !— 페 이 지 콘 텐 츠 --> 
      </body>
     </html>

    ▲ </html> 태그를 만난 후 <script> 태그 실행, defer는 외부 스크립트를 불러올 때만 유효. 하지만, 모든 브라우저가 호환되는게 아니기 때문에, body 마지막에서 script를 불러오는게 좋음.

    1. 비동기 스크립트 - async는 defer와 비슷하게 브라우저에게 파일을 즉시 내려받으라고 지시하지만,
                               마크업 순서대로 실행된다는 보장이 없다는 점이 다르다.
                               ~> Random으로 Script를 읽는다고 생각하면 편함
                               따라서, js파일 사이에 의존성이 있으면 안된다.
                               (ex Library와 이를 이용하는 script file)

                               ▶ DOM을 조작하는 스크립트는 Async로 불러오지 않는편이 좋다.

    2. XHTML - 하이퍼텍스트 마크업 언어 = HTML에 XML을 적용한 것
    <script type="text/javascript" >
     function compare(a, b) {
      if (a < b) {
       alert ("A is less than B")
      else if( a > b) {
       alert ("A is greater than B")
      } else {
       alert ("A is equal to B")
      }
    </script>
    ▲ HTML에서 쓸 수 있는 문법이지만, XHTML에서는 a < b 에서 <를 태그의 시작으로 간주하기 때문에 쓸 수 없다. 따라서, XHTML에서는 해당 기호를 \&lt; 로 바꾸거나 CDATA 섹션으로 감싸서 사용할 수 있다. XML을 Parsing할 때 코드나 기호를 전달하고자 CDATA를 쓰기는 하지만, script 자체에서 쓰는 것은 좋은 코드가 아니라고 생각하기 때문에 여기서는 알고만 넘어가자.

     ○ 인라인 코드와 외부 파일

    External JS의 장점

    1. 관리하기 쉽다.

    2. 캐싱 - 서로 다른 페이지에서 같은 파일을 사용한다면 한 번만 내려받아도 된다. 따라서 페이지를 불러오는 시간이 짧아진다.

    3. 안정성 - CDATA 섹션이나 주석 편법 등 인라인 코드 작성법이 달라지는데 반해, 외부에서 script를 불러오는 방법이 변하지 않는한 안전함

     ○ 문서 모드

    ◎ IE 5.5는 독타입 스위칭(Doctype Switching)을 통해 문서 모드라는 개념을 도입
       1. 쿽스 모드 - IE 버전 5인 것처럼 행동하여 여러 비표준 기능 사용
       2. 표준 모드 - 표준에 가까운 방식으로 동작
      ▲ 콘텐츠 렌더링의 차이지만, JS에도 영향을 미침
       3. 거의 표준 모드 - 표준 모드의 대부분의 기능 지원하지만, 엄격X

    ◎ 문서의 시작 부분에 Doctype을 쓰지 않으면 모든 브라우저에서 쿽스 모드를 사용한다. 이는 브라우저 사이에 일관성을 깨뜨림.

        ◎ 표준모드 적용

    <!-- HTML 4.01 Stric  -->
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    
    <!-- XHTML 1.0 Strict  -->
    <!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
    
    <!-- HTML5  -->
    <!DOCTYPE html>

        ◎ 거의 표준 모드 적용 (Transitional 이나 Frameset 에서 사용)

    <!-- HTML 4.01 Transitional --> 
    <!DOCTYPE HTML PUBLIC
    "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    
    <!-- HTML 4.01 Frameset -->
    <!DOCTYPE HTML PUBLIC
    "-//W3C//DTD HTML 4.01 Frameset//EN"
    "http://www.w3.org/TR/html4/frameset.dtd">
    
    <!-- XHTML 1.0 Transitional -->
    <!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <!-- XHTML 1.0 Frameset -->
    <!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.0 Frameset//EN"
    "http://www.w3.0rg/TR/xhtml1/DTD/xhtml1-frameset.dtd">

     

     ○ <noscript> 요소

      ◎ 브라우저가 스크립트를 지원X or 지원이 꺼져 있을 때 표시

    <!DOCTYPE html>
     <html>
      <head>
       <title>Example HTML Page</title>
          <script type="text/javascript" defer="defer" src="ex1.js"></script>
          <script type = "text/java script" defer="defer" src= "ex2.js"></script>
      </head>
      <body>
          <noscript>
              <p>This page
          </noscript>
      </body>
     </html> 

    ▲ script를 사용할 수 없을 때, 사용자에게 메세지를 표시하는 코드

    반응형

    댓글

Designed by Tistory.