jQuery源码 support

support 在jQuery中是个很重要的地方,统一表现形式,搞定兼容性。
support就是干一件事情,就是功能检测。
jQuery并没有判断什么浏览器,而是判断有什么功能。
检测一下是否兼容这个功能,没有这个功能,就兼容就可以了。
主要是内部使用,外部很少使用。

$(function () {
	var temp = $.support;
	for (var pro in temp) {
		document.write(pro + "  " + temp[pro] + "</br>");
	}
});

/*
测试的事chrome浏览器。返回true是支持,返回false是不支持。

checkOn true
optSelected true
reliableMarginRight true
boxSizingReliable true
pixelPosition true
noCloneChecked true
optDisabled true
radioValue true
checkClone true
focusinBubbles false
clearCloneStyle true
cors true			//	跟ajax 有关	 跨域 IE(IE9不支持) 和 W3C都支持,
ajax true			//	跟ajax 有关
boxSizing true

*/

创建了一个工具方法,返回了一个json。
思路:主要是通过创建一些元素,然后通过这些元素,并给元素添加了一些属性,来判断这些属性,然后进行兼容性获取。
但是获取判断分2种,一种是直接进行获取的,创建就即可以判断,另一种是要等页面加载完成之后,才可以判断。

jQuery是用hooks,钩子去解决兼容性问题。
support只是检测的。具体是用hooks(钩子机制)去解决问题。


源码:

jQuery.support = (function( support ) {

//这里创建了一些元素,input,文档碎片,div,下拉菜单,下拉菜单的子项。
	var input = document.createElement("input"),
		fragment = document.createDocumentFragment(),
		div = document.createElement("div"),
		select = document.createElement("select"),
		opt = select.appendChild( document.createElement("option") );

	// Finish early in limited environments
  // 判断input的type是否存在。默认是有值的,是text。
  //	最新的jq都已经去掉了。
	if ( !input.type ) {
		return support;
	}

	//	改成复选框。
	input.type = "checkbox";

	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
	// Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
  // 这里的意思是,大部分浏览器下面, checkbox的默认值都是on。但是老版本的webkit下面是空的,就是false。
	support.checkOn = input.value !== "";
  //	这里统一都返回on。

	// Must access the parent to make an option select properly
	// Support: IE9, IE10
	support.optSelected = opt.selected;		//下拉菜单的子项。是否被选中。

	// Will be defined later
  //	这几个属性,就是等页面加载结束以后,才可判断是否支持。具体在后面($(function () { 检查 }))
	support.reliableMarginRight = true;
	support.boxSizingReliable = true;
	support.pixelPosition = false;

	// Make sure checked status is properly cloned
	// Support: IE9, IE10
  //  这里说明在IE9 和 10 是有兼容性问题。通过hooks去兼容。
	input.checked = true;
	support.noCloneChecked = input.cloneNode( true ).checked;

	// Make sure that the options inside disabled selects aren‘t marked as disabled
	// (WebKit marks them as disabled)
  //   非常老的版本的webkit中,下拉列表被禁止了,子项也被禁止了。
	select.disabled = true;
	support.optDisabled = !opt.disabled;

	// Check if an input maintains its value after becoming a radio
	// Support: IE9, IE10
  // 注意创建时赋值顺序,如果value 和 type 赋值顺序反了,就不会有问题了。
	input = document.createElement("input");
	input.value = "t";
	input.type = "radio";
	support.radioValue = input.value === "t";

	// #11217 - WebKit loses check when the name is after the checked attribute
	input.setAttribute( "checked", "t" );
	input.setAttribute( "name", "t" );

	fragment.appendChild( input );

	// Support: Safari 5.1, Android 4.x, Android 2.3
	// old WebKit doesn‘t clone checked state correctly in fragments
  // 只有webkit下,在clone一个碎片的时候,cheecked无法返回一个值。
	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;

	// Support: Firefox, Chrome, Safari
	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
  // 是否支持focusin 事件, 光标移入事件,但是不具备冒泡的机制。
  // 但是 onfocusin 具备 冒泡机制的。
	support.focusinBubbles = "onfocusin" in window;

  //	背景剪切
  // 	这里是克隆的节点,原则上说,新的节点是不会影响以前到节点,
  //	如果新节点可以影响以前到节点。div.style.backgroundClip == ‘‘;
  // 	任何跟背景有关的。
  //	原则上面来说,克隆是不应该影响到以前的节点的。这里就解决了这个问题。
	div.style.backgroundClip = "content-box";
	div.cloneNode( true ).style.backgroundClip = "";
	support.clearCloneStyle = div.style.backgroundClip === "content-box";

	// Run tests that need a body at doc ready
  // 这里就是要等到页面加载以后才能判断的属性。进行处理。。。。。。
	jQuery(function() {
		var container, marginDiv,
			// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
      // -webkit-box-sizing CSS3的属性,作用就是当前页面是标准模式,还是怪异模式。
      //	content-box就是标准模式。
      //	这里区分一下标准模式和怪异模式
      // 	标准模式和怪异模式简单区分,就是对盒模型的影响。
      //  怪异模型下,padding和border还有content,跟我W3C里面的content等价。
      //	box-sizing:content-box标准。
			divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",
			body = document.getElementsByTagName("body")[ 0 ];

    // body 不存在,就返回。
		if ( !body ) {
			// Return for frameset docs that don‘t have a body
			return;
		}
    // body 存在,就是一个页面。就进行后续的判断。

    // 创建了div,设定了样式。
    // 创建的div,要添加人body中,所以将它的位置设定到浏览器看不到的地方。
		container = document.createElement("div");
		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";

/*******这里添加一下属性******/
		// Check box-sizing and margin behavior.
		body.appendChild( container ).appendChild( div );
		div.innerHTML = "";
		// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
		// 这里的 box-sizing:border-box;是怪异模式。
		div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%";

/********swap函数就是转换一下CSS样式。*****/
		// Workaround failing boxSizing test due to offsetWidth returning wrong value
		// with some non-1 values of body zoom, ticket #13543
    // 	body.style.zoom != null,	zoom是设定显示比例。如果设定1,就是1:1显示,如果是2,就是放大了2倍。
    // 	不等于空,都影响offsetWidth这个属性,不等于空的时候,就统一一下。
    //	swap 内的funciotn()	是一个回调函数,判断是否支持这个属性。
    //	w3c 和 IE 都支持这个属性。
/************************boxSizing 还在用 *******************************************************************/
		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
			support.boxSizing = div.offsetWidth === 4;
		});

/*******判断这个函数是否存在******/
/************************getComputedStyle 还在用 *******************************************************************/
		// Use window.getComputedStyle because jsdom on node.js will break without it.
    //	这里的意思是node里面没有这个函数。在node里面,就不会用了。浏览器都支持。
		if ( window.getComputedStyle ) {
      //	像素问题。
      //  w3c 是true ,只有Safari返回 pixelPosition = false; 其他的浏览器返回的都是像素。
      // 	1% 转换为 像素值。 判断是否支持像素定位。
/************************pixelPosition 还在用 *******************************************************************/
			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";

      //	IE 下 boxSizingReliable=false,W3C是true。
      //    padding:1px;
      //	IE 下的怪异模式,width = width - padding = 2px;
/************************boxSizingReliable 还在用 *******************************************************************/
			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";

			// Support: Android 2.3
			// Check if div with explicit width and no margin-right incorrectly
			// gets computed margin-right based on width of container. (#3333)
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
      //	还原了数据
			marginDiv = div.appendChild( document.createElement("div") );
			marginDiv.style.cssText = div.style.cssText = divReset;
      //	设定了0,又改变了宽度。
			marginDiv.style.marginRight = marginDiv.style.width = "0";
			div.style.width = "1px";
      //	reliableMarginRight 都是true。因为取反了。所以。浏览器得到的都是0.
      //	webkit老版本,有问题。现在浏览器都修正了这个问题。
/************************reliableMarginRight 还在用 *******************************************************************/
			support.reliableMarginRight =
				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
		}

    // 检测结束以后,将创建的div删掉。
		body.removeChild( container );
	});

	return support;
})( {} );

这里真好解释一下box-sizing

box-sizing属性可以为三个值之一:content-box(default),border-box,padding-box。

  content-box:     border和padding不计算入width之内

  padding-box:    padding计算入width内

  border-box:     border和padding计算入width之内,其实就是怪异模式了~

 

chrome, ie8+浏览器支持content-box和border-box;

ff则支持全部三个值。

 

使用时:

-webkit-box-sizing: 100px;     // for ios-safari, android

-moz-box-sizing:100px;       //for ff 

box-sizing:100px;          //for other

时间: 2024-11-08 22:06:09

jQuery源码 support的相关文章

jQuery源码分析(一)jQuery.support

1 // Internet Explorer 8.0.7601.17514 | Chrome 34.0.1847.131 m | Firefox 30.0 2 (function () { 3 4 jQuery.support = {}; 5 6 var root = document.documentElement, 7 script = document.createElement("script"), 8 div = document.createElement("di

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

Jquery源码分析与简单模拟实现

前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1.jQuery为什么能使用$的方式调用,$是什么.$()又是什么.链式调用如何实现的 2.jQuery的类级别的扩展内部是怎样实现的,方法级别的扩展有是怎样实现的,$.fn又是什么 3.jQuery选择器是如何执行的,又是如何将结果包装并返回的 带着这些问题,我们进行jquery的模拟实现,文章下方有

jquery源码分析(二)——结构

再来复习下整体架构: jQuery源码分析(基于 jQuery 1.11 版本,共计8829行源码) (21,94)                定义了一些变量和函数jQuery=function(){} (96,280)        给jQuery添加一些方法和属性,jQuery.fn=jQuery.prototype(285,347)        extend:        jQuery的一些继承方法        更容易进行后续的扩展                       

jquery 源码学习(四)构造jQuery对象-工具函数

jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:[email protected] 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪

jquery 源码学习(一)

从上边的注释看,jQuery的源码结构相当清晰.条理,不像代码那般晦涩和让人纠结 1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQuery源码,首先你会看到这样的代码结构: 复制代码 代码如下: (function( window, undefined ) { // jquery code })(window); 1. 这是一个自调用匿名函数.什么东东呢?在第一个括号内,创建一个匿名函数:第二个括号,立即执行 2. 为什么要创建这

jquery源码学习(一)core部分

这一部分是jquery的核心 jquery的构造器 jquery的核心工具函数 构造器 jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQu

jQuery源码框架思路

开始计划时间读源码,第一节jQuery框架阅读思路整理 (function(){ jQuery = function(){}; jQuery一些变量和函数和给jQuery对象添加一些方法和属性 extend : jQuery的继承方法的实现 jQuery.extend() : 使用jQuery扩展一些工具方法 Sizzle : jQuery自身实现的复杂选择器 Callbacks : 回调函数 Deferred : 延迟对象(异步) support : 功能检测(嗅探) data() : 数据缓

jquery源码解析:代码结构分析

本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94)     定义了一些变量和函数,   jQuery = function(){}; (96,283)   给jQuery对象添加一些属性和方法(实例方法,通过$("div")这类的jQuery实例对象来调用) (285,347)   extend : jQuery的继承方法 (349,817)   jQuery.extend():扩展一些工具方法(静态方法,直接通