반응형
반응형
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
<!DOCTYPE html>
<html>
<head>
<style>
.ancestors * { 
  display: block;
  border: 2px solid lightgrey;
  color: lightgrey;
  padding: 5px;
  margin: 15px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
 
  $("input[name=a]").parent('td').parent('tr').css({"color""blue""border""2px solid blue"});
  $("input[name=a]").closest("tr").children('td').css({"color""red""border""2px solid red"});
  $("input[name=a]").closest("tr").children('td').eq(1).css({"color""brown""border""2px solid brown"});
  $("input[name=a]").closest("tr").children('td').eq(1).next('td').css({"color""yellow""border""2px solid yellow"});
  $("input[name=d]").closest("tr").find('td').eq(0).css({"color""green""border""2px solid green"});
  $("input[name=d]").closest("tr").children('td').next('td').css({"color""black""border""2px solid black"});
    
});
  
</script>
</head>
 
<body class="ancestors">
  <div>
      <table>
        <tr>
            <td><input type="text" name="a"/></td>
            <td><input type="text" name="b"/></td>
            <td><input type="text" name="c"/></td>
        </tr>
        <tr>
            <td><input type="text" name="d"/></td>
            <td><input type="text" name="e"/></td>
            <td><input type="text" name="f"/></td>
        </tr>
    </table>
  </div>
</body>
 
</html>
 
cs



결과





설명 참고


 셀렉터(Selector)사용예 선택된 요소 
 *$("*") 모든 요소
 #id$("#elementId") id='elementId'인 요소
 .class$('.className') class='className'인 요소
 element$("element") 요소이름(tagName)이 "element"인 모든 요소
 .class,  .class$(".intro, .demo") class가 intro 및 demo인 모든 요소 
 :first$("element:first") element로 선택되는 요소중 첫번째 요소
 :last$("element:last") element로 선택되는 요소중 마지막 요소
 :even$("element:even")element로 선택되는 요소중 짝수번째 요소 
 :odd$("element:odd") element로 선택되는 요소중 홀수번째 요소 
 :eq(index)$("element:eq(index)") element로 선택되는 요소중 index+1번째 요소 
 :gt(index)$("element:gt(index)") 
Ex) $("ul li:gt(3)")
element로 선택되는 요소중 index보다 큰 순번의 요소목록(list) 
 :lt(index)$("element:lt(index)")
Ex) $("ul li:lt(3"") 
element로 선택되는 요소중 index보다 작은 순번의 요소목록(list) 
 :empty$("element:empty") 
Ex) $("div:empty)
element로 선택되는 요소중 내용이 없는 요소
element:not(selector) $("div:not(:empty)") element로 선택되는 요소중 내용이 비어 있지 않은 요소
 :header$(":header");  H1, H2.. 와 같은 헤더 요소
 :animated$(":animated") 모든 animated 요소 
 element :contains('text')$("body :contains('영역')")body내에 "영역"이라는 문자열을 포함하는 모든 요소.
body가 빠지면, HTML, HEAD, SCRIPT등 모든 태그가 포함됨. 
 element :hidden$("#div1 :hidden")
element에 포함된 hidden속성을 갖는 요소 
 element:visible$("#div1 :visible") element에 포함된  
 s1, s2, s3#("th, td") s1이거나 s2이거나 s3에 해당하는 모든 요소
s1,s2,s3는 태그, ID, Class지정이 모두 가능함. 
 element[attribute]$("#div1 a[href]")element중 속성('attribute')을 갖는 모든 요소
 element[attribute=value]$("#div1 a[href=#]") element중 속성이 value인 모든 요소
 element[attribute!=value]$("#div1 a[href!=#]") element중 속성이 value가 아닌 모든 요소 
element중 속성이 없는 것도 포함됨.
 element[attribute$=value]$("#div1 a[href$=com]")element중 value로 끝나는 속성(attribute)를 갖는 요소
 element[attribute^=value]$("#div1 a[href^=www]")element중 value로 시작하는  속성(attribute)를 갖는 요소
 element :text$("#div1 :text") element에 포함된 요소중 type이 'text'인 모든 요소 
 element :password$("#div1 :password") element에 포함된 요소중 type이 'password'인 모든 요소 
 element :radio$("#div1 :radio") element에 포함된 요소중 type이 'radio'인 모든 요소 
 element :checkbox$("#div1 :checkbox") element에 포함된 요소중 type이 "checkbox"인 모든 요소 
 element :submit $("#div1 :submit")element에 포함된 요소중 type이 'submit'인 모든 요소 
 element :reset $("#div1 :reset") element에 포함된 요소중 type이 'reset'인 모든 요소 
 element :button$("#div1 :button") element에 포함된 요소중 type이 'button'인 모든 요소 
 element :image$("#div1 :image") element에 포함된 요소중 type이'image'인 모든 요소 
 element :file$("#div1 :file")element에 포함된 요소중 type이 'file'인 모든 요소
 element :enalbed$("#div1 :enabled") element에 포함된 요소중 상태가 enabled인 모든 요소 
 element :disabled$("#div1 :disabled") element에 포함된 요소중 상태가 disabled인 모든 요소 
 element :selected$("#div1 :selected")element에 포함된 요소중 selected속성이 true인 모든 요소 
 element :checked$("#div1 :checked") element에 포함된 요소중 checked속성이 true인 모든 요소 



출처: http://hjzzin.tistory.com/120 [말랑말랑하게 살아요.]

반응형
반응형

질문글중에 이런코드가 있었다


-HTML 단

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<tr>
  <td id="title">
      <input class="input" type="text" id="nameEdit4" name="nameEdit4" value="123">
      <input xlass="input" type="hidden" id="fileData1" name="fileData" value="170620_검토중.xlsx">
      <input class="input" type="hidden" id="fileData2" name="fileData" value="error.txt">
      <input class="input" type="hidden" id="fileData3" name="fileData" value="">
      <input class="input" type="hidden" id="fileData4" name="fileData" value="">
      <input class="input" type="hidden" id="fileData5" name="fileData" value="">
      <span class="value" value="">123</span>
  </td>
  <td>
    <div class="tools">
      <a class="modal detail-btn" href="#" data-modal-index="1"  >
      <i class="icon popup icon-22px lightblue" id="icon4" onclick="myFunction(this)"></i></a
    </div>
  </td>
</tr>
cs

-Script 단
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function myFunction(x) {
 
    var count = x.closest("tr").rowIndex;
 
    var fileValue = $("#icon"+count).closest("tr").find("input[type=hidden][value!='']").length;
 
    alert(fileValue);
 
    for(var b=1; b<fileValue+1; b++){
 
         var fileData = new Array();
 
         fileData[b] = document.getElementById("fileData"+ b).value;
 
    }
 
}
cs


대충보면 hidden name이 fileData인 값을 value값을 가져오고 싶어하는거같은데 몇가지 문제점을 보면


-Input ID의 하드코딩

-1부터 시작하는 아이디로 for문에서의 난잡함

-Array를 for문 안에서 생성함


이곳에서 file data의 값을 가져오고 싶다는거였는데 대충봐도 난잡하고 fileData가 1부터 시작해서 for문도 수정해야하고 대체적으로 수정이 필요해보였다


그래서 수정을 이렇게 해보았다


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
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
 
<script>
function myFunction(x) {
 
    var fileValue = $("input[name='fileData']").length;
    var fileData = new Array(fileValue);
    for(var i=0; i<fileValue; i++){                          
         fileData[i] = $("input[name='fileData']")[i].value;
    }
}
 
 
</script>
</head>
<body>
 
<tr>
  <td id="title">
      <input class="input" type="text" id="nameEdit4" name="nameEdit4" value="123">
      <input class="input" type="hidden" name="fileData" value="170620_검토중.xlsx">
      <input class="input" type="hidden" name="fileData" value="error.txt">
      <input class="input" type="hidden" name="fileData" value="1">
      <input class="input" type="hidden" name="fileData" value="2">
      <input class="input" type="hidden" name="fileData" value="3">
      <span class="value" value="">123</span>
  </td>
  <td>
    <div class="tools">
      <a class="modal detail-btn" href="#" data-modal-index="1"  >      
      <input type="button" value="클릭" onclick="myFunction()"/>
    </div>
  </td>
</tr>
 
</body>
</html>
cs


이런식으로 하면 유동적이게 fileData를 불러와서 배열순으로 값을 넣어서 보여줄수가있다

fileData 라는 name이 다른부분에도 있다면 그부분의 name을 다르게 주거나 유니크하게 셀렉트할수있도록 수정해야할것같다

반응형
반응형

출처:https://code.i-harness.com/ko/q/60f0


누구든지 jQuery의 문자열에서 HTML을 쉽게 벗어날 수있는 방법을 알고 있습니까? 

임의의 문자열을 전달하고 HTML 페이지 (JavaScript / HTML 삽입 공격 방지)에 표시되도록 적절하게 

이스케이프 처리해야합니다. 이 작업을 수행하기 위해 jQuery를 확장 할 수 있다고 확신하지만

이 작업을 수행하는 데 필요한 프레임 워크에 대해 충분히 알지 못합니다.

 Answers


jQuery를 사용하기 때문에 요소의 text 속성을 설정할 수 있습니다.

// before:
// <div class="someClass">text</div>
var someHtmlString = "<script>alert('hi!');</script>";

// set a DIV's text:
$("div.someClass").text(someHtmlString);
// after: 
// <div class="someClass">&lt;script&gt;alert('hi!');&lt;/script&gt;</div>

// get the text in a string:
var escaped = $("<div>").text(someHtmlString).html();
// value: 
// &lt;script&gt;alert('hi!');&lt;/script&gt;

mustache.js의 솔루션 도 있습니다 .

var entityMap = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#39;',
  '/': '&#x2F;',
  '`': '&#x60;',
  '=': '&#x3D;'
};

function escapeHtml (string) {
  return String(string).replace(/[&<>"'`=\/]/g, function (s) {
    return entityMap[s];
  });
}

HTML로 탈출했다면 정말 필요한 것이라고 생각할 수있는 것은 세 가지뿐입니다.

html.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");

사용 사례에 따라 " to &quot; 와 같은 작업을 수행해야 할 수도 있습니다. 목록이 충분히 크면 배열을 사용합니다.

var escaped = html;
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g, "&gt;"], [/"/g, "&quot;"]]
for(var item in findReplace)
    escaped = escaped.replace(findReplace[item][0], findReplace[item][1]);

encodeURIComponent() 는 URL이 아닌 HTML 만 이스케이프 처리합니다.

나는 이것을하는 작은 기능을 썼다. 그것은 " , & , < 그리고 > 만 이스케이프합니다. (대개 필요한 것은 모두 필요합니다.

 .replace() 모든 변환 작업을 수행하기 위해 .replace() 를 사용한다는 점에서 이전 제안 된 솔루션보다 약간 더 우아합니다. 

EDIT 2 : 코드 복잡성이 줄어들어 원래 코드에 대해 궁금한 점이 있다면 함수를 더 작고 깔끔하게 만듭니다.이 답변의 끝 부분을 참조하십시오.)

function escapeHtml(text) {
    'use strict';
    return text.replace(/[\"&<>]/g, function (a) {
        return { '"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' }[a];
    });
}

이것은 일반 Javascript이며 jQuery는 사용되지 않습니다.

탈출구 ' 와 ' 도

mklement 의 코멘트에 대한 응답으로 편집하십시오.

위의 기능은 모든 문자를 포함하도록 쉽게 확장 될 수 있습니다. 이스케이프 할 문자를 더 지정하려면 

정규 표현식의 문자 클래스 (예 : /[...]/g )와 chr 객체의 항목으로 모두 삽입하기 만하면됩니다. 

EDIT 2 : 같은 방식으로이 기능을 짧게합니다.)

function escapeHtml(text) {
    'use strict';
    return text.replace(/[\"&'\/<>]/g, function (a) {
        return {
            '"': '&quot;', '&': '&amp;', "'": '&#39;',
            '/': '&#47;',  '<': '&lt;',  '>': '&gt;'
        }[a];
    });
}

위의 &#39; 아포스트로피 (상징적 인 엔티티가 대신 사용될 수도 있음 - XML로 정의되었지만 원래 HTML 스펙에 포함되지 않았기 때문에

 모든 브라우저에서 지원되지 않을 수도 있음 참조 : HTML 문자 인코딩에 관한 Wikipedia 기사 ). 

또한 십진법 엔티티를 사용하는 것이 16 진수를 사용하는 것보다 더 광범위하게 지원된다는 것을 기억하지만, 지금은 소스를 찾을 수없는 것 같습니다.

 (그리고 16 진법 엔티티를 지원하지 않는 많은 브라우저가있을 수 없습니다.)

참고 : 이스케이프 된 문자 목록에 / 와 ' 를 추가하는 것은 HTML에서 특별한 의미가 없으므로 유용하지 않습니다. 이스케이프 처리 할 필요 가 없습니다.

원래 escapeHtml 함수

편집 2 : 원래 함수는 변수 ( chr )를 사용하여 .replace() 콜백에 필요한 객체를 저장합니다. 

이 변수는 범위를 지정하기 위해 익명의 추가 함수가 필요하기 때문에 함수가 불필요하게 커지고 복잡해졌습니다.

var escapeHtml = (function () {
    'use strict';
    var chr = { '"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' };
    return function (text) {
        return text.replace(/[\"&<>]/g, function (a) { return chr[a]; });
    };
}());

두 버전 중 어느 버전이 더 빠르는지는 테스트하지 않았습니다. 그럴 경우 여기에서 정보와 링크를 자유롭게 추가하십시오.

쉽게 밑줄을 사용할 수 있습니다.

_.escape(string) 

Underscore 는 네이티브 j가 제공하지 않는 많은 기능을 제공하는 유틸리티 라이브러리입니다. 

밑줄과 같은 API이지만 성능이 좋도록 다시 작성된 lodash 도 있습니다.

내가이 파티에 얼마나 늦었는지 알지만, jQuery를 필요로하지 않는 아주 쉬운 해결책이있다.

escaped = new Option(unescaped).innerHTML;

편집 :이 따옴표를 이스케이프하지 않습니다. 따옴표를 이스케이프해야하는 유일한 경우는

 내용이 HTML 문자열 내의 속성에 인라인으로 붙여 넣기 될 경우입니다. 

이 일을하는 것이 좋은 디자인이라고 상상하는 것이 어렵습니다.

편집 2 : 성능이 중요한 경우 최고 성능 솔루션 (약 50 %까지)은 여전히 ​​일련의 정규식 대체품입니다. 

최신 브라우저는 정규 표현식에 연산자가없고 문자열 만 포함하고 모두를 단일 작업으로 축소한다는 사실을 감지합니다.

깨끗하고 명확한 JavaScript 함수가 여기에 있습니다. 그것은 "몇 개의 <많은"과 같은 텍스트를 "소수의 <많은>"문자로 이스케이프합니다.

function escapeHtmlEntities (str) {
  if (typeof jQuery !== 'undefined') {
    // Create an empty div to use as a container,
    // then put the raw text in and get the HTML
    // equivalent out.
    return jQuery('<div/>').text(str).html();
  }

  // No jQuery, so use string replace.
  return str
    .replace(/&/g, '&amp;')
    .replace(/>/g, '&gt;')
    .replace(/</g, '&lt;')
    .replace(/"/g, '&quot;');
}

Underscore.string lib를 사용해보십시오. jQuery와 함께 작동합니다.

_.str.escapeHTML('<div>Blah blah blah</div>')

산출:

'&lt;div&gt;Blah blah blah&lt;/div&gt;'

마지막 테스트 후 가장 빠르고 완벽하게 크로스 브라우저 호환 원시 자바 스크립트 (DOM) 솔루션을 추천 할 수 있습니다 :

function HTMLescape(html){
    return document.createElement('div')
        .appendChild(document.createTextNode(html))
        .parentNode
        .innerHTML
}

여러 번 반복하면 준비된 변수를 사용하여 수행 할 수 있습니다.

//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);

//main work for each case
function HTMLescape(html){
  DOMtext.nodeValue = html;
  return DOMnative.innerHTML
}

내 최종 실적 비교 ( 스택 질문 )를보십시오.

나는 문자열 객체에 escapeHTML() 메소드를 추가하는 콧수염 escapeHTML() 예제를 개선했습니다.

var __entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
};

String.prototype.escapeHTML = function() {
    return String(this).replace(/[&<>"'\/]/g, function (s) {
        return __entityMap[s];
    });
}

그렇게하면 "Some <text>, more Text&Text".escapeHTML() 를 사용하는 것이 매우 쉽습니다. "Some <text>, more Text&Text".escapeHTML()

escape() 및 unescape() 는 HTML이 아닌 URL의 문자열을 인코딩 / 디코딩하기위한 것입니다.

사실, 나는 프레임 워크를 필요로하지 않는 트릭을하기 위해 다음 스 니펫을 사용한다.

var escapedHtml = html.replace(/&/g, '&amp;')
                      .replace(/>/g, '&gt;')
                      .replace(/</g, '&lt;')
                      .replace(/"/g, '&quot;')
                      .replace(/'/g, '&apos;');

underscore.js가 있으면 _.escape 사용 _.escape (위에 게시 된 jQuery 메서드보다 효율적입니다).

_.escape('Curly, Larry & Moe'); // returns: Curly, Larry &amp; Moe

위의 tghw의 예에서 오류가 발생했습니다.

<!-- WON'T WORK -  item[0] is an index, not an item -->

var escaped = html; 
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g,"&gt;"], [/"/g,
"&quot;"]]

for(var item in findReplace) {
     escaped = escaped.replace(item[0], item[1]);   
}


<!-- WORKS - findReplace[item[]] correctly references contents -->

var escaped = html;
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g, "&gt;"], [/"/g, "&quot;"]]

for(var item in findReplace) {
     escaped = escaped.replace(findReplace[item[0]], findReplace[item[1]]);
}

이것은 좋은 안전한 예입니다 ...

function escapeHtml(str) {
    if (typeof(str) == "string"){
        try{
            var newStr = "";
            var nextCode = 0;
            for (var i = 0;i < str.length;i++){
                nextCode = str.charCodeAt(i);
                if (nextCode > 0 && nextCode < 128){
                    newStr += "&#"+nextCode+";";
                }
                else{
                    newStr += "?";
                }
             }
             return newStr;
        }
        catch(err){
        }
    }
    else{
        return str;
    }
}
(function(undefined){
    var charsToReplace = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;'
    };

    var replaceReg = new RegExp("[" + Object.keys(charsToReplace).join("") + "]", "g");
    var replaceFn = function(tag){ return charsToReplace[tag] || tag; };

    var replaceRegF = function(replaceMap) {
        return (new RegExp("[" + Object.keys(charsToReplace).concat(Object.keys(replaceMap)).join("") + "]", "gi"));
    };
    var replaceFnF = function(replaceMap) {
        return function(tag){ return replaceMap[tag] || charsToReplace[tag] || tag; };
    };

    String.prototype.htmlEscape = function(replaceMap) {
        if (replaceMap === undefined) return this.replace(replaceReg, replaceFn);
        return this.replace(replaceRegF(replaceMap), replaceFnF(replaceMap));
    };
})();

전역 변수, 일부 메모리 최적화가 없습니다. 용법:

"some<tag>and&symbol©".htmlEscape({'©': '&copy;'})

결과는 다음과 같습니다.

"some&lt;tag&gt;and&amp;symbol&copy;"

바닐라 js로 쉽게 할 수 있습니다.

단순히 텍스트 노드를 문서에 추가하십시오. 그것은 브라우저에 의해 이스케이프됩니다.

var escaped = document.createTextNode("<HTML TO/ESCAPE/>")
document.getElementById("[PARENT_NODE]").appendChild(escaped)
function htmlEscape(str) {
    var stringval="";
    $.each(str, function (i, element) {
        alert(element);
        stringval += element
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(' ', '-')
            .replace('?', '-')
            .replace(':', '-')
            .replace('|', '-')
            .replace('.', '-');
    });
    alert(stringval);
    return String(stringval);
}

NO JQUERY가 필요없는 2 가지 간단한 메소드 ...

다음과 같이 문자열의 모든 문자 를 인코딩 할 수 있습니다.

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}

또는 & , 줄 바꿈, < , > , " 및 ' 대해 걱정할 주요 문자 를 대상으로 지정하십시오 .

function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}

var myString='Encode HTML entities!\n"Safe" escape <script></'+'script> & other tags!';

test.value=encode(myString);

testing.innerHTML=encode(myString);

/*************
* \x26 is &ampersand (it has to be first),
* \x0A is newline,
*************/
<p><b>What JavaScript Generated:</b></p>

<textarea id=test rows="3" cols="55"></textarea>

<p><b>What It Renders Too In HTML:</b></p>

<div id="testing">www.WHAK.com</div>

function htmlDecode(t){
   if (t) return $('<div />').html(t).text();
}

매력처럼 작동합니다.

이 답변 은 jQuery와 일반 JS 메소드를 제공하지만 DOM을 사용하지 않으면이 메소드가 가장 짧습니다.

unescape(escape("It's > 20% less complicated this way."))

이스케이프 된 문자열 : It%27s%20%3E%2020%25%20less%20complicated%20this%20way.

이스케이프 된 공간에서 문제가 발생하면 시도해보십시오.

unescape(escape("It's > 20% less complicated this way.").replace(/%20/g, " "))

이스케이프 처리 된 문자열 : It%27s %3E 20%25 less complicated this way.

유감스럽게도 JavaScript 버전 1.5 에서는 escape() 함수가 사용되지 않습니다 . 

encodeURI() 또는 encodeURIComponent() 는 대안이지만 무시하므로 ' , 마지막 코드 행은 다음과 같이 바뀝니다.

decodeURI(encodeURI("It's > 20% less complicated this way.").replace(/%20/g, " ").replace("'", '%27'))

모든 주요 브라우저는 여전히 짧은 코드를 지원하며 이전 웹 사이트의 수를 감안할 때 곧 변경 될 것입니다.

일반 자바 스크립트 이스케이프 예 :

function escapeHtml(text) {
    var div = document.createElement('div');
    div.innerText = text;
    return div.innerHTML;
}

escapeHtml("<script>alert('hi!');</script>")
// "&lt;script&gt;alert('hi!');&lt;/script&gt;"

이 정보를 데이터베이스 에 저장하는 경우 클라이언트 측 스크립트를 사용하여

HTML을 이스케이프 처리하는 것은 잘못된 것으로 서버 에서 수행해야 합니다 . 

그렇지 않으면 XSS 보호를 우회하기 쉽습니다.

내 요점을 분명히하기 위해 다음 답변 중 하나를 사용하는 예제가 있습니다.

말하자면 escapeHtml 함수를 사용하여 블로그의 주석에서 Html을 이스케이프 처리 한 다음 서버에 게시합니다.

var entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
  };

  function escapeHtml(string) {
    return String(string).replace(/[&<>"'\/]/g, function (s) {
      return entityMap[s];
    });
  }

사용자는 다음을 수행 할 수 있습니다.

  • POST 요청 매개 변수를 편집하고 주석을 javascript 코드로 바꿉니다.
  • 브라우저 콘솔을 사용하여 escapeHtml 함수를 덮어 씁니다.

사용자가이 스 니펫을 콘솔에 붙여 넣으면 XSS 유효성 검사를 건너 뜁니다.

function escapeHtml(string){
   return string
}

당신이 재 탈출을 방지하지 않으면 모든 솔루션은 쓸모가 없습니다. 예를 들어, 대부분의 솔루션은 이스케이프 & &amp; .

escapeHtml = function (s) {
    return s ? s.replace(
        /[&<>'"]/g,
        function (c, offset, str) {
            if (c === "&") {
                var substr = str.substring(offset, offset + 6);
                if (/&(amp|lt|gt|apos|quot);/.test(substr)) {
                    // already escaped, do not re-escape
                    return c;
                }
            }
            return "&" + {
                "&": "amp",
                "<": "lt",
                ">": "gt",
                "'": "apos",
                '"': "quot"
            }[c] + ";";
        }
    ) : "";
};


반응형
반응형

원글 : https://okky.kr/article/432665


실무 개발중 Javascript 와 JSTL의 사용법을 헷갈려 해서 도움을 청하신분에게 답변을 해드렸습니다

잘못된 코드를 먼저 보겠습니다


-잘못된 코드1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$.each(data.list, function(key, value){
       if( key == data.list.length-1)
         {
            var rankWeek = value.RANK_WEEK;
            var rankItem = value.RANK_ITEM;
 
            $("#RANK_WEEK").val(rankWeek);
            $("#RANK_ITEM").val(rankItem);
            
            str  =         
                "<tr style='background-color:#ffef96;'>"                 +  
                        "<th> 구분      </th>"                                         +
                        "<th> 세부분류   </th>"                                          +
                            "<c:forEach var='i' begin='1' end='4' step='1'>"     +
                                "<th>${i}주</th>"                                  +
                            "</c:forEach>"                                          +
                        "<th>총계</th>"                                              +
                        "<th>" + value.RANK_WEEK + "</th>"                        +
                        "</tr>"     ;
         }    
});
cs


여기서보면 $.each() 내부에서 <c:forEach> 를 사용하는 부분이 보입니다

개발을하다보면 당연히 혼동될수있는 부분입니다

이건 웹 의 동작방식을 알아야하는데


JAVA>JSTL>HTML>Javascript 


로 기본적으로 이렇게만 알아두시면 될거같습니다

이 작동시점을 알고 확인해보면

보여야할 부분이 Jquery 를 반복문의 시작으로 두고 JSTL을 이중반복문의 시작으로 두고있다

이부분을 확인하실수있습니다

작동순서를 1,2,3,4 순서대로의 숫자로 본다면

4(Jquery)를 먼저두고 2(JSTL)를 그다음에둬서

1,4,2,3 의 순서로 실행시키는거죠 


두번째 잘못된 코드를 확인해보겠습니다

-잘못된 코드2


1
2
3
4
5
6
7
8
9
+ 추가질문
 
input type hidden에 rankWeek 값을 저장하였습니다. 
 
<c:forEach end='4'> 대신 RANK_WEEK값을 넣어야하는데..;
다음과 작성 작성하니
"<c:forEach var='i' end='$('#RANK_WEEK').val()' >"
 
에러가 발생하네요......  어떻게 수정해야하나요... 초보라서 간단한 것도 응용이 잘 안되네요...
cs


이부분도 마찬가지로 Jquery 값 $('#RANK_WEEK').val() 을 사용한 동작 순서의 에러로 이해하시면되고

단정적으로 외워버리자면


- JSTL에선 Javascript 값을 받을수없다.

- Javascript 에선 JSTL 값을 받을수있다.



이전에 혼용사용의 포스팅을 읽어보신분이라면 두번째 문장은 이해가 가실겁니다


-올바른 사용예제

1
2
3
4
5
6
7
8
<c:forEach items="${map_list.email}" var="item2">
    list.push("${item2}");
</c:forEach>
 
 
<c:forEach var="code" items="${loc_type}">
    if(retObj.LOC_TYPE == "${code.cd_id}")        loc_type="${code.cd_nm}";
</c:forEach>
cs


Javascript와 JSTL 을 혼재해서 사용할수있는 예제입니다 참고하시면 되겠습니다

두가지에 모두 사용될수있는 el태그를 적절히 활용하는것이 중요합니다 

el태그는 ${} 이런 형식의 서버데이터 태그를 말합니다


아래는 추가 정보를 가져왔습니다


출처:

http://defacto-standard.tistory.com/entry/java-jstl-html-javascript-%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A1%9C%EB%94%A9-%EC%88%9C%EC%84%9C-JSTL%EA%B3%BC-EL-%EA%B0%99%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0



간혹 가다가 웹 페이지가 예상대로 돌아가지 않을 떄가 있다.


예를 들면, JQuery를 사용해서 태그를 숨겼는데 그대로 보이는 경우이다.


이는 페이지가 로드되면서 실행되는 순서가 다르기 때문이다.

<html>
    <head>
        <script src="jquery.js" type="text/javascript"></script>
        <script src="abc.js" type="text/javascript"></script>
        <link rel="stylesheets" type="text/css" href="abc.css"></link>
        <style>h2{font-wight:bold;}</style>
        <script>
            $(document).ready(function(){
                $("#img").attr("src", "kkk.png");
            });
        </script>
    </head>
 
    <body>
        <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
        <script src="kkk.js" type="text/javascript"></script>
    </body>
</html>

 

위와 같은 소스에서 실행 순서는 다음과 같다.


1. HTML 문서 다운로드

2. HTML 문서 파싱 시작

3. HTML 파싱이 3번 라인에 도달

4. jquery.js 가 다운로드 되고 파싱된다.

5. HTML 파싱이 4번 라인에 도달

6. abc.js가 다운로드되고 파싱되고 실행된다.

7. HTML 파싱이 5번 라인에 도달

8. abc.css가 다운로드 되고 파싱된다.

9. HTML 파싱이 6번 라인에 도달

10. <style>태그 내부 CSS 규칙이 파싱되고 정의된다.

11. HTML 파싱이 7번 라인에 도달

12. 내부 Javascript다 파싱되고 실행된다.

13. HTML 파싱이 15번 라인에 도달

14. abc.jpg가 다운로드 되고 보여진다.

15. HTML 파싱이 16번 라인에 도달

16. kkk.js가 다운로드 되고 파싱된 후 실행된다.

17. 페이지 로딩이 끝났으므로 kkk.png그림이 보인다.

18. 끝


* onload함수는 페이지 로딩이 끝나는 이후 바로 실행


* Java, JSLT, HTML, Javascript가 모두 섞여있을 경우, 보기 순서대로 실행된다.

이때, 먼저 실행되는 쪽에서 뒤쪽에서 실행되는 쪽의 값을 읽을 수 없다. 준비가 안됐기 때문.


* 하나의 jsp파일 내에 작성된 소스라 하더라도,

Scriptlet이나 jstl, el 등은 서버단에서 실행되며

Javascript는 브라우저에서 실행되기 때문에 두 언어 간 변수를 직접 주고받을 수 없다.


예를 들어, 다음과 같은 방법으로 직접적으로 변수를 쓸 수 없다. 

var list = new Array();
 
list = "${TestList}";
 
alert( list[0].name );

 

쓰려면 다음과 같이 해야한다.

var list = new Array(); 

<c:foreach items="${TestList}" var="item">
list.push("${item.name}");
</c:foreach>

 

*Expression Language

${식} 과 같은 방법으로 표현한다.

JSP의 스크립트 요소(스크립틀릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용할 수 있다.


반응형

'IT > Jsp|JSTL' 카테고리의 다른 글

jstl split,startsWith,endsWith 사용법  (0) 2018.01.26
JSP 에서 LinkedList 받기  (0) 2018.01.02
Javascript 에서 JSTL 사용하기 와 주의사항  (2) 2018.01.02
반응형

개발을하다보면 ajax 방식의

동기 처리가 필요할 때가있다

동기 비동기에 대해서 간단히 짚고 넘어가자면

동기방식은 간단하게 생각하자면 JAVA 코드처럼 수행방식이 

위에서 아래로 순서적으로 코드 한줄 한줄을 읽어 나가는 방식이다

예시를 들 필요가 없는게 비동기방식이 예시때문에 헷갈린적이있었다

비동기 방식은 수행방식이 한줄 한줄 읽어 가는것은 맞지만 시간이 걸리는 코드는 기다려주지않고 

건너 뛰어서 다음 코드를 하나씩 수행하게된다

동기와 비동기의 중간에 3초가 걸리는 test() 함수가 하나있다고 생각해보면


-동기방식은 3초 test함수를 실행한 뒤에 다음 코드를 수행하지만


-비동기방식은 3초 test함수를 기다리지않고 다음코드를 계속 실행하게된다


스크립트 예시를 들어보면


- <img> 태그를 name 순서로 만들어주는 함수 A()

- 이미지 태그안에 링크를 붙여주는 함수 B()

가 있다고 가정해보자

코드 순서는

A();

B();

로 했다고 보면

자바스크립트에선 A() 함수가 시간이 걸린다면 건너뛰어버리고 간헐적으로

B() 함수가 먼저 실행되어 이미지가 깨져버리거나 에러가 발생한다



서버단의 로직을 태워오는 ajax 가 이런 문제가 종종 발생하게되는데

이걸 방지할수있는 promise 코드가 있다 

패턴 예제가 다양하지만 직접 사용해 보았던 패턴만 확인해볼 예정이다


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
//ajax + promise 예제
    var jsonData = {"STATUS":"A","MATRL":"A0000001","main":['a','b','c','d'],"stringObj":"{\"이름\":\"덩치\",\"거주지\":\"서울\"}"};
    
    var promise = $.ajax({  
        type: "POST",
        url: "/test/go",
        dataType: "json",    
        traditional: true,//배열 객체 보낼때
        data: jsonData });
    
    promise.done(successFunction);//프로미스 패턴 => 해당 ajax를 태운다음에 동작하는 function(동기방식)
    promise.fail(failFunction);
    
    function successFunction(data){
        if(data.result ==='success')
            var a = "함수호출 success";    
        
        return alert(a);
    }
    
    function failFunction(data){
        if(data.result !='success')
            var a = "함수호출 fail";    
        return alert(a);
    }
cs


successFunction 에 다음 작업을 넣어주면 임시적으로 동기처리를 할수있게된다


when 이라는 함수도 사용할수있다

여러가지 함수를 실행시킬수있는 방법으로 done 전에 실행된다 


1
2
3
$.when(A(), B()).done(function(result1, result2) {
  console.log(result1, result2);
});
cs



구글링을 해보면 나오는 async: false 옵션을 주는 방법은

jquery 1.8 버전부터 막혀서 권장되지않는 방법이다.




기존에 promise 패턴이 아닌 callback 방식의 경우에는 아래와 같이 코딩을 하였습니다.

$.ajax({
  url: "/ServerResource.txt",
  success: successFunction,
  error: errorFunction
});


대부분 함수의 파라미터 객체에 function 을 설정하여 결과에 대한 처리를 했습니다. 이러한 경우 callback 이 중첩되어 소스의 가독성도 떨어질 뿐더러 관리가 안되는 단점이 있었습니다.



jQuery 1.5 버전 이후부터는 아래와 같이 done()fail()always() 를 이용하여 결과에 대한 처리를 지정합니다.

var promise = $.ajax({
  url: "/ServerResource.txt"
});
  
promise.done(successFunction);
promise.fail(errorFunction);
promise.always(alwaysFunction);


jQuery.ajax() 는 jQuery XMLhttpRequest(jqXHR) 을 반환하기 때문에 아래와 같은 방식으로도 구현이 가능합니다.

$.ajax( "example.php" )    
    .done(function() { alert("success"); })    
    .fail(function() { alert("error"); })    
    .always(function() { alert("complete"); }); 


체인 방식이 아니더라도 jqXHR 객체에 직접 지정도 가능합니다.

var jqxhr = $.ajax( "example.php" )    
    .done(function() { alert("success"); })    
    .fail(function() { alert("error"); })    
    .always(function() { alert("complete"); }); 
     
    // perform some work here ... 
     
    // Set another completion function for the request above
    jqxhr.always(function() { alert("another complete"); });



jQuery 1.8 버전 이후부터는 then() 함수를 사용하여 Promise 패턴을 적용할 수 있습니다.

then() 의 첫번째 인자는 성공에 대한 액션, 두번째 인자에는 실패에 대한 액션을 지정할 수 있습니다.

$.ajax({url: "/ServerResource.txt"}).then([successFunction1, successFunction2, successFunction3], 
                                          [errorFunction1, errorFunction2]);
 
//same as
 
var jqxhr = $.ajax({
  url: "/ServerResource.txt"
});
  
jqxhr.done(successFunction1);
jqxhr.done(successFunction2);
jqxhr.done(successFunction3);
jqxhr.fail(errorFunction1);
jqxhr.fail(errorFunction2);
var promise = $.ajax({
  url: "/ServerResource.txt"
});
  
promise.then(successFunction, errorFunction);
var promise = $.ajax({
  url: "/ServerResource.txt"
});
 
promise.then(successFunction); //no handler for the fail() event




Deferred 객체를 직접 만들어서 사용할 수 있는데, 그 방법은 아래와 같습니다.


var timer;
$('#result').html('waiting…');
  
var promise = process();
promise.done(function() {
  $('#result').html('done.');
});
promise.progress(function() {
  $('#result').html($('#result').html() + '.');
});
 
function process() {
  var deferred = $.Deferred();
 
  timer = setInterval(function() {
    deferred.notify();
  }, 1000);
   
  setTimeout(function() {
     clearInterval(timer);
     deferred.resolve();
  }, 10000);
   
  return deferred.promise();
}




Promise 에 등록된 callback 들을 Deferred 가 각 상황에 맞게 호출해주는 방식입니다.


then() 함수를 이용하면 아래와 같이 구현할 수 있습니다.

var timer;
 
(function process() {
  $('#result').html('waiting…');
  var deferred = $.Deferred();
     
  timer = setInterval(function() {
    deferred.notify();
  }, 1000);
   
  setTimeout(function() {
     clearInterval(timer);
     deferred.resolve();
  }, 10000);
   
  return deferred.promise();
})().then(function() { $('#result').html('done.'); },
          null,
          function() { $('#result').html($('#result').html() + '.'); });



References

http://www.htmlgoodies.com/beyond/javascript/making-promises-with-jquery-deferred.html

https://api.jquery.com/category/deferred-object/



출처: http://uwostudy.tistory.com/54 [UWO스터디]

반응형

'IT > Javascript|Jquery' 카테고리의 다른 글

javascript 셀렉트박스(SelectBox) 바로실행  (2) 2018.01.04
ajax 로딩시 새로고침 문제  (6) 2018.01.03
ajax 배열전송  (0) 2018.01.02
모바일/PC 코딩하기  (0) 2018.01.02
Jquery 셀렉터(Selector) 사용하기  (0) 2018.01.02
반응형

Jquery 셀렉터로 특정 단어로 시작해서 특정 단어로 끝나는

(ex: a-xxxx-b)

값을 지정할수있다


예제


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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!DOCTYPE html>
 
<html>
 
<head>
 
<style>
 
.siblings * { 
 
    display: block;
 
    border: 2px solid lightgrey;
 
    color: lightgrey;
 
    padding: 5px;
 
    margin: 15px;
 
}
 
</style>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
 
<script>
 
$(document).ready(function(){
 
   
 
    $( "li[id^='start-'][id$='-end']" ).css({"color""red""border""2px solid red"});
 
});
 
</script>
 
</head>
 
<body>
 
 
 
<div style="width:500px;" class="siblings">
 
  <ul>ul (parent)  
 
    <li>li (sibling)</li>
 
    <li>li (sibling)</li>
 
    <li id="start-test-end">li (sibling with class name "start")</li>
 
    <li>li (the next sibling of li with class name "start")</li>
 
    <li>li (the next sibling of li with class name "start")</li>
 
    <li id="start-test2-end">li (the next sibling of li with class name "start")</li>
 
    <li id="start-test2-endd">li (sibling with class name "stop")</li>
 
  </ul>   
 
</div>
 
 
 
<p>In this example, we return all next sibling elements between the 
li element with class name "start" and the li element with class name "stop".</p>
 
 
 
</body>
 
</html>
cs



추가로 자주 사용하는 셀렉터를 정리해 보았다


1
2
3
4
5
6
$("div[id!='a']")// div 에 id가 a가 아닌 태그들 선택
$("div[id^='a']")// div 에 id가 a로 시작하는 태그들 선택
$("div[id$='a']")// div 에 id가 a로 끝나는 태그들 선택
$("div[id*='a']")// div 에 id가 a가 포함된 태그들 선택
 
 
cs


1
2
3
4
 $( "li[id^='start-'][id$='-end']" ) //and 개념
 $( "li[id^='start-'],li[id$='-end']" ) //or 개념
 
 
cs


===============================================================================================================

안녕하세요. 문학청년입니다. 정말 오랜만에 이렇게 글을 쓰는 것 같네요. 스터디 준비하랴.. 대회 준비하랴.. 요세 조금 바빠서 글 쓰는 것에 너무 소홀해버렸네요. 그럼 앞으로 다시 분발하여 열심히 쓰도록 하겠습니다.

잡설이 너무 길었네요. 오늘은 다름이 아니라 제가 처음이 연재 기획했던 것과는 달리 오늘은 기본 내용을 간략하게 정리해볼까 합니다. 물론 정리된 내용만 보면 재미가 없겠지요. 그래서 여러분들을 위해서 간단하게 할 수 있는 셀렉터 예제를 만들어봤습니다. 이 예제는 jQuery 오프라인 스터디에서도 사용을 했었는데요. 반응이 좋아서 이렇게 연재 강좌에도 예제로 사용해봤습니다.

한가지 팁을 드리자면 아래 정리된 내용을 출력하여 필요할 때마다 보는 것도 좋을 것 같구요.
아래 정리된 내용들을 살펴 본 뒤에 예제 페이지로 가서 직접 실습해보시면 이해하시는데 도움이 될 것입니다.

예제 페이지 이동하기



(1) Javascript 문법 스타일

기존의 프로그래밍 언어의 엄격한 문법 스타일에 적용되어 있는 사용자라면 분명히 자바스크립트의 자유 분방한 문법 스타일을 보고 적지않게 당황한적이 있을 것이다. 이러한 스타일은 단점이 될 수도 있으나 매우 유연하기 때문에 때에 따라서 매우 강력한 기능을 발휘한다. 그렇다면 가장 많이 사용되는 자바스크립트의 함수와 관련된 문법 스타일에 대해서 알아보도록 하자.

1. 함수를 변수에 설정할 수 있다.
1
2
3
var func = function() {
     alert("안녕");
};


2. 변수에 설정한 함수를 매개 변수로 사용하여 호출 할 수 있다.
1
showAlert(func);


3. 위와 같이 변수에 담지 않고 바로 함수를 매개 변수로 바로 설정 할 수 있다.
1
2
3
4
5
6
showAlert(function() {
     alert("안녕");
});

// 아래와 같이 한 줄로 사용하는 경우도 있다.
showAlert(function() { alert("안녕"); });


3번의 경우 조금 어렵게 생각할 수도 있는데 자세히 보면 그냥 함수 파라메터 값에 변수가 아닌 함수 그 자체가 들어가 있다고 간단하게 생각하면 된다. 이러한 표현식은 jQuery에서 상당히 많이 쓰이기 때문에 이러한 문법 스타일에 최대한 빨리 익숙해져야 한다.


(2) 셀렉터 요약 정리

셀렉터는 jQuery의 가장 강력한 기능이다. 간단하게 설명을 하자면, HTML 문서 안에는 다양한 엘리먼트들이 포함되어 있는데, 이를 컨트롤하기란 결코 간단한 일이 아니다. 일반적으로 자바스크립트에서 엘리먼트를 얻기 위해 많이 쓰이는 방법은document.getElementById("엘리먼트 ID 속성 값") 함수를 사용하면 되지만, 일단 소스 코드가 길어지고 얻을 수 있는 엘리먼트들도 매우 한정적이다.

하지만 jQuery에서는 $("셀렉터 문법") 함수를 사용하여 매우 간단하고 다양한 스타일의 엘리먼트들을 쉽게 얻을 수 있다. 셀렉터로 얻은 엘리먼트들을 확장 집합이라 하는데, 특수한 배열 형태의 객체로 반환이 된다. 이렇게 반환된 객체들은 jQuery가 지원하는 매우 다양한 함수들을 사용할 수 있다.

아래 표에 나와 있는 자식/에트리뷰트/컨테이너 셀렉터는 가장 많이 사용되는 셀렉터 문법이다.

셀렉터 문법
문법 설명
*
모든 엘리먼트
E
태그 명이 E인 모든 엘리먼트
E F
E의 자손이면서 태그명이 F인 모든 엘리먼트
E>F
E의 바로 아래 자식이면서 태그 명이 F인 모든 엘리먼트
E+F
E의 형제 엘리먼트로 바로 다음에 오는 엘리먼트 F
E~F
E의 형제 엘리먼트로 다음에 나오는 모든 엘리먼트 F
E:has(F)
태그 명이 F인 자손을 하나 이상 가지는 태그 명이 E인 모든 엘리먼트
E.C
클래스 명 C를 가지는 태그 명이 E인 모든 엘리먼트. E의 생략은 *.C와 동일함
E#I
아이디가 I인 태그 명이 E인 엘리먼트. E의 생략은 *#I와 동일
E[A=V]
값이 V인 에트리뷰트 A를 가지는 태그 명이 E인 엘리먼트
E[A=V]
값이 V로 시작하는 에트리뷰트 A를 가지는 태그 명이 E인 엘리먼트
E[A$=V]
값이 V로 끝나는 에트리뷰트 A를 가지는 태그 명이 E인 엘리먼트
E[A*=V]
값이 V를 포함하는 에트리뷰트 A를 가지는 태그 명이 E인 엘리먼트
E[A]
에트리뷰트 A를 가지는 태그 명이 E인 모든 엘리먼트
[자식/에트리뷰트/컨테이너 셀렉터]

아래 표는 jQuery가 지원하는 고급 위치 기반 셀렉터이며, DOM에서 위치를 기반으로 엘리먼트를 선택하며 첫 번째 링크나 홀수 번째, 짝수 번째와 같이 엘리먼트의 위치나 다른 엘리먼트와 관계를 기반으로 엘리먼트를 선택해야 하는 경우에 사용하면 된다.

셀렉터 문법
문법 설명
E:first
모든 엘리먼트 E 중에서 첫 번째인 엘리먼트
E:last
모든 엘리먼트 E 중에서 마지막인 엘리먼트
E:first-child
엘리먼트 E의 자식 엘리먼트 중에서 첫 번째인 엘리먼트
E:last-child
엘리먼트 E의 자식 엘리먼트 중에서 마지막인 엘리먼트
E:only-child
엘리먼트 E의 자식 엘리먼트 중에서 형제가 없는 엘리먼트
E:nth-child(n)
엘리먼트 E의 n번째 자식 엘리먼트
E:nth-child(even or odd)
엘리먼트 E의 홀수 or 짝수 자식 엘리먼트
E:even or E:odd
페이지 전체의 짝수 or 홀수 엘리먼트
E:eq(n)
태그 값이 E인 모든 엘리먼트 중에서 n번째로 일치하는 엘리먼트
E:gt(n)
태그 값이 E인 모든 엘리먼트 중에서 n번째 엘리먼트(포함 X) 이후의 엘리먼트
E:lt(n)
태그 값이 E인 모든 엘리먼트 중에서 n번째 엘리먼트 이전의 엘리먼트
[위치 셀렉터]

CSS 명세만으로는 표현할 수 없는 특성이 있는 엘리먼트를 선택해야 하는 경우 아래 표에 나와 있는 셀렉터를 사용하면 된다.

셀렉터 문법
문법 설명
:animated
현재 애니매이션이 적용되고 있는 엘리먼트 선택
:button
모든 버튼 선택
:checkbox
체크 박스 엘리먼트만 선택 (input[type=checkbox])
:checked
선택된 체크 박스나 라디오 버튼만을 선택
:contains(foo)
텍스트 foo를 포함하는 엘리먼트만 선택
:disabled
인터페이스에서 비활성화 상태인 모든 폼 엘리먼트를 선택
:enabled
인터페이스에서 활성화 상태인 모든 폼 엘리먼트를 선택
:file
모든 파일 엘리먼트를 선택 (input[type=file])
:header
헤더 엘리먼트 선택 (<h1>~<h6>)
:hidden
감춰진 엘리먼트만 선택
:image
폼 이미지만 선택 (input[type=image])
:input
폼 엘리먼트만 선택 (input, select, textarea, button)
:not(filter)
필터의 값을 반대로 변경함.
:parent
빈 엘리먼트를 제외하고, 텍스트도 포함해서 자식 엘리먼트를 가지는 엘리먼트
:password
패스워드 엘리먼트 선택 (input[type=password])
:radio
라디오 엘리먼트 선택 (input[type=radio])
:reset
리셋 버튼을 선택 (input[type=reset] or button[type=reset])
:selected
선택된 엘리먼트만 선택
:submit
전송 버튼을 선택 (input[type=submit] or button[type=submit])
:text
텍스트 엘리먼트만 선택 (input[type=text])
:visible
보이는 엘리먼트만 선택 
[jquery 정의 셀렉터]



(3) 자주 사용되는 함수 정리

$.유틸리티 함수, Event 관련 함수, Ajax 관련 함수는 이번 장에서 다루지 않을 것이다.


 
함수 명
함수 설명
엘리먼트 조작
each(Function)
선택된 엘리먼트가 다수일 경우에 each 함수를 사용하여 차례대로 엘리먼트를 선택한다.
에트리뷰트 조작
attr(name, value)
선택된 엘리먼트의 name 에트리뷰트의 값을 value로 설정
 
attr(name)
선택된 엘리먼트의 name 에트리뷰트의 값을 얻어옴.
 
attr(Attributes)
선택된 엘리먼트를 프로퍼티(json)형태로 설정할 수 있음
 
val()
엘리먼트의 value 에트리뷰트 값을 얻어옴. attr("value")와 동일함.
 
val(content)
엘리먼트의 value 에트리뷰트 값을 content로 설정함.
에트리뷰트 제거
removeAttr(name)
해당 어트리뷰트의 값이 초기화 된다.
스타일 변경
addClass(names)
선택된 엘리먼트에 CSS Class를 적용함. 만약에 다수의 Class를 적용하려면 공백으로 구분하여 할당하면 됨.
 
removeClass(names)
선택된 엘리먼트들을 제거함.
 
toggleClass(names)
특정 Class를 적용하지 않은 상태면 적용하고, 적용한 상태면 제거함.
스타일 얻고 설정
css(name, value)
선택된 엘리먼트의 name 에트리뷰트 값을 value로 설정함.
 
css(properties)
{"name1:" value1", "name2": "value2", } 와 같은 형태로 설정함.
 
css(name)
특정 name의 프로퍼티의 스타일 값을 얻을 수 있음.
 
width(value)
선택된 엘리먼트의 width 값을 설정함.
 
height(value)
선택된 엘리먼트의 height 값을 설정함.
 
width()
선택된 엘리먼트의 width 값을 얻어옴.
 
height()
선택된 엘리먼트의 height 값을 얻어옴.
 
offset()
선택된 엘리먼트의 left 값과 top 값을 E.offset().left, E.offset().top과 같은 방법으로 얻을 수 있음.
엘리먼트 내용 설정
html()
선택된 엘리먼트 태그 내용을 얻을 수 있음.
 
html(content)
선택된 엘리먼트의 태그 내용을 content로 설정함.
 
text()
선택된 엘리먼트의 태그 내용 중 텍스트 값만 얻을 수 있음.
 
text(content)
선택된 엘리먼트의 태그 내용을 content로 설정함.
엘리먼트 복사&이동
append(content)
선택된 엘리먼트의 내용 마지막에 새로운 content를 추가함.
 
appendTo(target)
선택된 엘리먼트가 단일이면 target으로 이동시키고 다수라면 복사됨.
 
prepend(content)
append와 달리 앞으로 추가함
 
prependTo(target)
appendTo와 달리 앞으로 복사 또는 이동함
 
before(),
insertBefore()
엘리먼트를 대상의 첫 번째 자식으로 삽입하는 대신에 대상의 바로 앞 형제로 추가함.
 
after(),
insertAfter()
엘리먼트를 대상의 마지막 자식으로 삽입하는 대신에 대상의 바로 뒤 형제로 추가함
엘리먼트 감싸기
wrap(wrapper)
매개 변수로는 String과 엘리먼트 타입이 올 수 있으며, "<div class='hello'></div>" 형태로 매개 변수 값을 넘기면 됨.
 
wrapAll(wrapper)
선택된 모든 엘리먼트를 wrapper로 감쌈
엘리먼트 제거
remove()
페이지 DOM에서 확장 집합의 모든 엘리먼트를 삭제함.
 
empty()
일치하는 집합의 모든 엘리먼트의 Content를 제거함.
엘리먼트 복사
clone(copyHandlers)
일반적으로 엘리먼트를 복사한 확장 집합을 만들면 이들은 DOM 어딘가에 덧붙일 수 있음
[함수 정리 (1)]


(4) 그 밖에 함수 정리

아래 표에 정리된 함수들은 확장된 엘리먼트 집합을 관리하는 함수들이다.

 
함수 명
함수 설명
확장 집합 크기 얻기
size()
해당 엘리먼트의 개수를 반환한다.
확장 집합에서 특정 엘리먼트 얻기
get(index)
확장 집합에서 index번째의 엘리먼트를 가져온다. (배열과 유사함)
 
get()
모든 확장 엘리먼트를 일반 자바스크립트 배열로 얻는다.
 
index(element)
확장 집합에서 특정 엘리먼트의 index 값을 가져온다.
확장 집합 재편성 하기
add(element)
기존의 확장 집합에 다른 엘리먼트를 추가한다.
 
not(expression)
기존의 확장 집합에서 expression와 일치하는 엘리먼트를 제외시킨다.
 
filter(expression)
기존의 확장 집합에서 expression와 일치하는 엘리먼트만 가져온다.
확장 집합의 부분 집합 얻기
slice(begin, end)
기존의 확장 집합에서 begin번째부터 end번째까지의 엘리먼트만 가져온다.
확장 집합 관련 그 밖에 함수들
find(selector)
기존의 확장 집합에서 selector와 일치하는 엘리먼트들로 새로운 확장 집합을 생성한다.
 
is(selector)
기존의 확장 집합에서 selector와 일치하는 엘리먼트가 있다면 true, 없다면 false를 반환한다.
jQuery 체인 관리하기
end()
이전 확장 집합을 반환한다.
 
andSelf()
커맨드 체인에서 이전 확장 집합 두 개를 하나로 합친다
관계를 이용하여 확장 집합 얻기
 
아래 표 참조.
[함수 정리 (2)]

함수 명
설명
children()
확장 엘리먼트의 고유한 자식으로 구성된 확장 집합 반환한다.
contents()
엘리먼트의 콘텐츠로 구성된 확장 집합을 반환한다.
next()
확장 집합 내의 각 확장 엘리먼트 바로 다음에 나오는 형제로 구성된 확장 집합을 반환한다.
nextAll()
확장 집합 내의 각 확장 엘리먼트 바로 다음에 나오는 모든 형제로 구성된 확장 집합을 반환한다.
parent()
바로 위 부모로 구성된 확장 집합을 반환한다.
parents()
바로 위 부모와 모든 조상이 포함하는 확장 집합을 반환한다.
prev()
바로 이전에 나오는 형제로 구성된 확장 집합을 반환한다.
prevAll()
이전에 나오는 모든 형제로 구성된 확장 집합을 반환한다.
siblings()
확장 엘리먼트 내에 모든 형제를 포함한 확장 집합을 반환한다.
[관계를 이용하여 확장 집합 얻기와 관련된 함수 정리]

 

 


Event 관련 함수 및 프로퍼티와 $.유틸리티 함수 역시 이번 편과 비슷한 형식으로 정리를 해볼까 합니다. jQuery는 꼭 필요한 기능들만 구현이 되어 있기 때문에 따지고 보면 별로 정리할 내용이 없기 때문에 이를 간단하게 요약하면 jQuery를 사용하실 때, 참고하신다면 분명히 도움이 되리라 생각됩니다.

그럼 이상으로 글을 마치겠습니다.


출처 : http://blog.naver.com/seogi1004/ 




반응형

'IT > Javascript|Jquery' 카테고리의 다른 글

javascript 셀렉트박스(SelectBox) 바로실행  (2) 2018.01.04
ajax 로딩시 새로고침 문제  (6) 2018.01.03
promise 패턴 예제  (0) 2018.01.02
ajax 배열전송  (0) 2018.01.02
모바일/PC 코딩하기  (0) 2018.01.02
반응형
1

+ Recent posts