집 >
기사 > 웹 프론트엔드 > jQuery 소스코드 분석 참고사항 (5) jQuery.support_jquery
jQuery 소스코드 분석 참고사항 (5) jQuery.support_jquery
WBOY원래의
2016-05-16 18:05:581108검색
그 중 jQuery.browser는 이미 UserAgent를 기반으로 탐지된 브라우저 정보를 제공하고 있습니다. jQuery.support는 기능 감지를 사용하여 브라우저 기능과 버그를 확인합니다.
문서와 마찬가지로 우선 이 모듈은 매우 낮은 수준의 코드이므로 기본적으로 일상적인 개발에 사용할 필요는 없지만 플러그인 개발자에게는 더 필요하다는 점을 설명하겠습니다. 플러그인은 각 브라우저와 호환되어야 하기 때문입니다. 먼저 지원 모듈에서 제공하는 브라우저 기능 감지를 살펴보겠습니다. 다음 결과는 Chrome 13 Dev에서 표시되는 결과입니다. 브라우저에 따라 이곳의 구성원이 변경될 수 있습니다. (PS: IE에 대해 다시 불평하고 있습니다. 대부분의 속성은 IE에만 적용됩니다.)
아약스: 사실입니다. XMLHttpRequest 객체를 지원할지 여부입니다. 이전 버전의 IE에서는 지원하지 않으므로 ActiveX를 사용해야 합니다. * 추가 확인됨: true. * boxModel: 사실입니다. W3C CSS 상자 모드에 따라 렌더링할지 여부입니다. IE6 및 7의 Quirks 모드는 False입니다. * 변경버블: 사실입니다. 변경 이벤트가 DOM 트리를 따라 버블링되는지 여부입니다. 이는 W3C DOM 이벤트 모델의 요구 사항이지만 IE는 지금까지 False입니다. jQuery는 이 버블링 기능을 시뮬레이션합니다. * checkClone: 정의되지 않음. 라디오 버튼이나 체크박스를 복제할 때 선택된 상태를 유지할지 여부입니다. 앞서 createFragment 캐싱에 대해 이야기할 때 언급했듯이 WebKit 코어는 유지되지 않습니다. * checkOn : 거짓. 지정되지 않은 경우 CheckBox의 기본값이 On인지 여부입니다. * 코르스 : 사실입니다. XMLHttpRequest 객체에 withCredentials 속성이 있는지 여부. 도메인 간 요청을 수행할 수 있습니다. 또는 그러한 속성이 없지만 도메인 간 XHR 요청을 구현하는 다른 방법이 있는 경우에도 True입니다(예: Windows Gadget을 통해). * cssFloat: 사실입니다. cssFloat의 CSS 속성을 지원합니다. IE는 False이며 styleFloat를 사용합니다. * deleteExpando: 사실입니다. * focusinBubbles: 거짓. * getSetAttribute: true. * href정규화: true. 요소에 대해 getAttribute("href")를 호출할 때 원래 지정된 URL을 반환할지 여부입니다. IE는 전체 경로를 반환합니다. 예를 들어, href="1.html"인 링크의 경우 IE는 http://.../1.html을 얻게 됩니다. * html직렬화: true. innerHTML을 사용하여 링크 요소를 삽입할 수 있습니까? IE는 거짓입니다. * inlineBlockNeedsLayout: 거짓. 블록 요소가 인라인 블록으로 동작하려면 인라인이어야 하고 hasLayout(대부분의 레이아웃 문제의 원인인 IE의 개념)이어야 합니다. IE8 이하에서는 문제가 있습니다. * LeadingWhitespace: 사실입니다. innerHTML 속성이 코드에 따라 엄격하게 렌더링되는지 여부입니다. IE6-8에서는 선행 공백이 제거됩니다. (그래서 Markdown으로 작성된 이 글은 IE에서 줄 바꿈이 누락되어 서식 문제가 있습니다.) * noCloneChecked: true. 1.5.1 새로운 속성. 브라우저가 확인된 확장자 속성을 복제하는지 여부를 탐지합니다. IE는 거짓입니다. * noCloneEvent: 사실입니다. 복사된 요소에 이벤트 핸들러 기능이 포함되는지 여부(즉, 이벤트 핸들러가 복사되는지 여부)입니다. IE는 거짓입니다. * 불투명도: 사실입니다. 불투명도 CSS 속성(투명도) 지원 여부입니다. IE는 거짓이며 알파 필터를 사용합니다. * optDisabled: 사실입니다. 비활성화된 선택 요소의 옵션 요소가 기본적으로 비활성화되어 있는지 여부입니다. * optSelected: 사실입니다. 기본적으로 선택되어 있는 옵션 요소의 selected 속성이 정상인지 여부. * 라디오값: true. * ReliableHiddenOffsets: 사실입니다. 테이블의 셀이 display:none으로 설정되어 있어도 여전히 offsetWidth/Height가 있습니다. 즉, 숨겨진 것은 신뢰할 수 없습니다. IE8에만 이 문제가 있습니다. 버그 번호 4512를 참조하세요. * ReliableMarginRight: true. div에는 명시적인 너비가 있지만 오른쪽 여백은 없습니다. 이때 컨테이너를 기준으로 한 margin-right 계산이 올바르지 않습니다. 이전 버전의 WebKit에 문제가 있습니다. 버그 번호 3333 참조 * scriptEval(): 버전 1.5.1 이전에는 속성이었지만 이제는 함수가 됩니다. 표준 DOM 조작 함수를 사용하여 추가할 때 인라인 스크립트가 자동으로 실행되는지 확인합니다. AppendChild 및 createTextNode 등이 있습니다. IE는 false입니다. 텍스트를 사용하여 스크립트를 삽입합니다. *shrinkWrapBlocks: 거짓. hasLayout이 설정된 경우 요소가 상위 노드를 확장할지 여부입니다. 이는 IE6에만 적용됩니다. * 스타일: 사실. DOM 속성을 사용하여 요소의 인라인 스타일 속성에 액세스할 수 있는지 여부입니다. 예를 들어 getAttribute("스타일")입니다. cssText 속성을 사용하는 IE에서는 거짓입니다. * submitBubbles: 사실입니다. 제출 이벤트가 DOM 트리에 표시되는지 여부입니다. IE가 거짓이면 jQuery는 이 버블링 프로세스를 시뮬레이션합니다. * tbody: 사실입니다. 빈 테이블 요소가 tbody 요소를 가질 수 없는지 여부입니다. HTML 사양에 따르면 하위 요소는 선택 사항입니다. 하지만 IE는 false이므로 tbody 요소가 자동으로 삽입됩니다.
var div = document.createElement ("div" ); div.setAttribute("className", "t") div.innerHTML = "
TABLE>< A 스타일="FLOAT: 왼쪽; TOP: 1px; 불투명도: .55" href="http://www.jb51.net/a">a "; all = div.getElementsByTagName("*"); a = div.getElementsByTagName("a")[0]; var select = document.createElement("select"); opt = select .appendChild(document.createElement("option")); input = div.getElementsByTagName("input")[0]; div 요소는 매우 암시적입니다. 빈 시작, 빈 테이블 요소, 인라인 스타일, 불투명도 등을 포함합니다. 코드와 주석을 한 줄씩 읽는 것 외에 다른 참고 사항은 없습니다:
support = { // IE는 선행 공백을 제거하므로 nodeType은 3이 아닙니다(텍스트) leadingWhitespace: (div.firstChild.nodeType === 3), // IE는 자동으로 tbody를 삽입하므로 길이가 다릅니다 tbody: !div.getElementsByName("tbody").length, // IE는 이러한 방식으로 링크 요소를 삽입하는 것을 허용하지 않습니다 htmlSerialize: !!div.getElementsByTagName(" link").length, // 스타일이 정상적으로 획득된 경우 이 정규식은 정상적으로 전달되어야 합니다. style: /top/.test(a.getAttribute("style ")), / / href 속성은 원래 지정된 문자열이어야 하며 IE는 이를 http hrefNormalized: (a.getAttribute("href") === "/로 시작하는 절대 URL로 수정합니다. a"), // 불투명도 속성을 얻을 수 있습니다. WebKit [bug No. 5145](http://dev.jquery.com/ticket/5145) // 하지만 이는 초기 버전에서는 문제가 될 것입니다. 적어도 Chrome 13에서는 정규식을 사용하지 않는 것이 맞습니다. 불투명도: /^0.55$/.test(a.style.opacity), // IE는 styleFloat를 사용합니다. cssFloat: !!a.style.cssFloat, // div의 확인란 If 값이 지정되지 않았습니다. 기본값이 켜져 있는지 확인하세요. 웹킷은 ""입니다. 그래서 내 결과는 false입니다. checkOn: (input.value === "on"), // 이 선택에는 옵션 요소가 하나만 있으므로 렌더링할 때 이 옵션이 기본적으로 선택됩니다. 현재 선택 항목은 true여야 합니다. optSelected: opt.selected, submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false , shrinkWrapBlocks: false, reliableMarginRight: true };