为旧浏览器添加新特性

简介: 理论上如果浏览器的库功能足够强大,是完全可可以代替第三方的库。事实上各家浏览器都在不断增强自家浏览器的特性一些群众呼声较高的功能或者 API 已经早早加入到浏览器标准规范中,直接调用即可。问题是,许多客户因为种种原因没有升级它们的浏览器,造成开发者面对此类的问题时候,只能采取第三方库或“打补丁”的方式兼容,所谓”Polyfill“ 正是如此。

理论上如果浏览器的库功能足够强大,是完全可可以代替第三方的库。事实上各家浏览器都在不断增强自家浏览器的特性一些群众呼声较高的功能或者 API 已经早早加入到浏览器标准规范中,直接调用即可。问题是,许多客户因为种种原因没有升级它们的浏览器,造成开发者面对此类的问题时候,只能采取第三方库或“打补丁”的方式兼容,所谓”Polyfill“ 正是如此。笔者较倾向于“打补丁”的方式,也就是编写补丁的时候,其接口尽量与标准规范的一致。这样的好处当然是兼容了新的通用方式,API 更显一致。

语言增强

控制台

首先是调试用的方法 console.log()/dir()/warn()。代码如下。

if(!this.console){ // 用 this 代替 window 更通用,可在一些非浏览器的 js 环境中使用,例如 ASP in JScript
    this.console = {
        log : alert
    }
}
if(!console.dir){
    console.dir = console.log;
}

Object.create() 创建对象

不使用 new 创建对象,就应该使用 Object.create()。该方法最早由 D.C 提出,然后被纳入 ECMAScript 语言标准,这也是笔者所极力推荐的方法。

if (!Object.create){
    Object.create = function (o) {
        if (arguments.length > 1) {
            throw new Error('Object.create implementation only accepts the first parameter.');
        }
        function F() {}
        F.prototype = o;
        return new F();
    };
}
参见本博客系列文章 《OO思想(js)》

String.prototype.format()

无须多讲,这方法很常用。但奇怪的是,好像没有被纳入语言 API 的迹象。

String.prototype.format = function () {
    var str = this; 
    if(typeof(arguments[0]) == 'string'|| typeof(arguments[0]) == 'number'){
        for(var i = 0, j = arguments.length; i < j; i++){
            str = str.replace(new RegExp('\\{' + i +'\\}', 'g'), arguments[i]);
        }
    }else{
        for(var i in arguments[0]){
            str = str.replace(new RegExp('\\{' + i +'\\}', 'g'), arguments[0][i]); // 大小写敏感
        }
    }

    return str;
}

Date.prototype.format()

视各场合而用。

参见本博客文章《JavaScript自定义日期格式化函数》

Function.prototype.bind()  函数作用域绑定

Function.prototype.bind 很实用。笔者的方案依赖于 delegate,除了指定作用域外还能指定函数的参数。

if(!Function.prototype.bind){
    Function.prototype.bind = function (scope) {
        this.scope = scope;
        return this.delegate();
    }
}
delegate 参见源码: http://naturaljs.googlecode.com/svn/trunk/src/dhtml/prototype.js

参见本博客文章《我对 Javascript 原型的扩展函数》

JSON 序列化

IE8+ 很及时地对 JSON 支持,这点很好。

if(!window.JSON)window.JSON = {
  // 加入 JSON 包
};

IE7或以下的必须依赖其他包

<!--[if lte IE 7]>
    <script src=""<%=bigfootUrl%>libs/json2.js"></script>
<![endif]-->

HTML/CSS 渲染问题

<!--[if lte IE 8]>
    <script src="<%=bigfootUrl%>libs/html5shim.js"></script>
<![endif]-->

DOM 控制

跨浏览器问题

// for IE8-
if(!window.addEventListener){
	/**
	 * @param {String} eventName 事件名称,不要带 on 开头
	 * @param {Function} eventHandler 事件处理器
	 */
	window.addEventListener = Element.prototype.addEventListener = function(eventName, eventHandler){
		this.attachEvent('on' + eventName, eventHandler);
	}
}

// for IE8-
if(!window.XMLHttpRequest); // see request.js

// for IE7- 不报错
if(!window.Element)window.Element = function(){};

/**
* 一般来讲我们不通过 style.xxx 来获取元素的样式。IE8 不支持,IE9开始支持。
* http://www.w3help.org/zh-cn/causes/BT9008
*/
if (!window.getComputedStyle) {
    window.getComputedStyle = function (el) {
    	return el.currentStyle;
    }
}

if(!window.postMessage){
	console.warn('不支持 postMessage');
	window.postMessage = function(event){
		var e = {
			data : event
		};
		render(e);
	}
}

样式列表

如浏览器不支持 el.classList 属性,设置一个,例如这样:

;(function(){
	var el = document.createElement('div');
	if(!el.classList){
		Element.prototype.classList = {

		};
	}
})();

参见本博客文章《浏览器已经支持 className 的一些方法了 》

data-* 属性

如浏览器不支持 HTML5 data-* 属性,也可以设置一个。但这种方法有入侵原生方法之嫌。

源码详见:https://code.google.com/p/naturaljs/source/browse/trunk/src/webview/patch.js

参见本博客文章《自动获取HTML5 的 data-* 属性》

Android 2.x 不支持元素:active 的办法

参见本博客文章《记一次 JS 模拟 CSS active 效果的过程 》

源码详见:https://code.google.com/p/naturaljs/source/browse/trunk/src/webview/patch.js

DOM Ready 方法

这个方法事件是个事件。在早期的时候,DOMReady 很受用。但是笔者现在的习惯就是,先写 HTML 再写 Script,让这个顺序固定好,DOMReady 使用的机会就不多了。当然不好就是 Script 都写成一块一块的较分散,不能写在头部的 <head> 中。

/*
 * 注册浏览器的 DOMContentLoaded 事件,@todo 应有自我卸载的功能。
 * @param {Function} onready [必填]在DOMContentLoaded事件触发时需要执行的函数
 */
document.onReady = function(f){
	if(/in/.test(document.readyState)){
		window.setTimeout(arguments.callee, 9, f);
	}else{
		f();
	}
}

见过其他的实现,代码行数较多。这个就很短小,原理较巧妙(当然也要注意 document.readyState 浏览器是否支持),值得推荐。最后 f 是对 arguemnts.callee 的传参,应用到了 setTimeout/ setInterval 的新写法。同样这种新写法也有补丁。参见下面。

setTimeout/ setInterval 传参新写法

曾几何时,对 setTimeout/ setInterval 如何传递参数是童鞋们一大关心的问题。如果了解 JS 函数和事件队列,那么这个问题迎刃而解。不过,话又说回来,如果 API 直接提供传参功能,岂不是很好?恰恰就是这种想法,新版的浏览器提供了。要写旧补丁的话,可参见如下的。

/*\
|*|  IE-specific polyfill which enables the passage of arbitrary arguments to the
|*|  callback functions of javascript timers (HTML5 standard syntax).
|*|  https://developer.mozilla.org/en-US/docs/DOM/window.setInterval
|*|  Syntax:
|*|  var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
|*|  var timeoutID = window.setTimeout(code, delay);
|*|  var intervalID = window.setInterval(func, delay[, param1, param2, ...]);
|*|  var intervalID = window.setInterval(code, delay);
\*/
;(function(){
	if (document.all && !window.setTimeout.isPolyfill) {
	  var __nativeST__ = window.setTimeout;
	  window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
	    var aArgs = Array.prototype.slice.call(arguments, 2);
	    return __nativeST__(vCallback instanceof Function ? function () {
	      vCallback.apply(null, aArgs);
	    } : vCallback, nDelay);
	  };
	  window.setTimeout.isPolyfill = true;
	}
	 
	if (document.all && !window.setInterval.isPolyfill) {
	  var __nativeSI__ = window.setInterval;
	  window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
	    var aArgs = Array.prototype.slice.call(arguments, 2);
	    return __nativeSI__(vCallback instanceof Function ? function () {
	      vCallback.apply(null, aArgs);
	    } : vCallback, nDelay);
	  };
	  window.setInterval.isPolyfill = true;
	}
})();

附:《兼容的浏览器原生功能支持》http://goojs.com/polyfill.html

    • 名称:

      Placeholder.js

    • 描述:Adds support for the placeholder attribute in older browsers that don't support this HTML5 feature.
    • 大小:0.4k
    • 链接:https://github.com/NV/placeholder.js
    • 名称:

      yepnope

    • 描述:yepnope is an asynchronous conditional resource loader that allows you to load only the scripts that your users need.
    • 大小:1.6k
    • 链接:http://yepnopejs.com/
    • 名称:

      H5F.js

    • 描述:Adds support for HTML5 Forms chapters new field input types, attributes and constraint validation API in non-supporting browsers.
    • 大小:1.8k
    • 链接:https://github.com/ryanseddon/H5F
    • 名称:

      Head JS

    • 描述:An asynchronous loader library, with HTML5 and CSS3 polyfills
    • 大小:2.8k
    • 链接:http://headjs.com/
    • 名称:

      Augment.js

    • 描述:Enables use of modern JavaScript by augmenting built in objects with the latest JavaScript methods.
    • 大小:1.4k
    • 链接:http://augmentjs.com

提示用户升级 IE

<!--[if lte IE 8]>
    <script>
/**
* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
    </script>
    <script>
    // ie_patch
// for IE8 & IE8-
// 用 this 代替 window 更通用,可在一些非浏览器的 js 环境中使用,例如 ASP in JScript
// IE8 只有在 DevTools 被打开的情况下才可用
if(!this.console){ 
    this.console = {
        log : function(){}
    }
}
if(!console.dir){
    console.dir = console.log;
}

// 用 this 代替 window 更通用,可在一些非浏览器的 js 环境中使用,例如 ASP in JScript
// IE8 只有在 DevTools 被打开的情况下才可用
if(!this.console){ 
        this.console = {
                log : function(){}
        };
}

if(!console.dir){
        console.dir = console.log;
}
// IE 6 不支持,IE7开始支持。
// XMLHttpRequest

// IE8 不支持,IE9开始支持。
if (!Object.create){
    Object.create = function (o) {
        if (arguments.length > 1)throw new Error('Object.create implementation only accepts the first parameter.');
        
        function F() {}
        F.prototype = o;
        return new F();
    };
}



// IE8 不支持,IE9开始支持。
if(!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g,'');
  };
}

// IE8 不支持,IE9开始支持。
if(!Function.prototype.bind){
    Function.prototype.bind = function () {
        if (!arguments.length) return this;
        var _ = this, p = Array.prototype.slice.call(arguments), A = p.shift();
        return function () {
            return _.apply(A, p.concat(Array.prototype.slice.call(arguments)))
        }
    }
}

// IE8 不支持,IE9开始支持。
if(!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start) {
         for (var i = (start || 0), j = this.length; i < j; i++) {
             if (this[i] === obj) { return i; }
         }
         return -1;
    }
}

/**
* 一般来讲我们不通过 style.xxx 来获取元素的样式。IE8 不支持,IE9开始支持。
* http://www.w3help.org/zh-cn/causes/BT9008
*/
if (!window.getComputedStyle) {
    window.getComputedStyle = function (el) {
        return el.currentStyle;
    }
}

function getChildren(){
        var children = [];
        for(var node, childNodes = this.childNodes, i = 0, j = childNodes.length; i < j; i++){
                // for ie8-
                node = childNodes[i];
                
                if(node.nodeType == 1)children.push(elWrapper(node));
        }
        
        return children;
}

//placeholder 占位符
if(window.navigator.isIE6 || window.navigator.isIE7 || window.navigator.isIE8 || window.navigator.isIE9){
        /*
         * Author: lichen , http://leechan.me
         * E-mail: chen.ican@gmail.com
         * Date  : 2012-07-27
         */
        ;(function(doc,win){
                if('placeholder' in doc.createElement('input')){
                        return;
                }
                var addEvent = function(obj, type, fn) {
                        if (obj.attachEvent) {
                                if(obj['e' + type + fn]){
                                        return;
                                }
                            obj['e' + type + fn] = fn;
                            obj[type + fn] = function(){
                                obj['e' + type + fn](win.event);
                            }
                            obj.attachEvent('on' + type, obj[type + fn]);
                        } else {
                                obj.addEventListener(type, fn, false);
                        }
                }
                         
                var placeHolderFix = function(){
                        var inputs = doc.getElementsByTagName('input'), textareas = doc.getElementsByTagName('textarea');

                        //input
                        for(var i = 0,len = inputs.length; i < len; i++){
                                var input = inputs[i], inputAttr = input.getAttribute('placeholder');
                                if(input.type !== 'password' && inputAttr){
                                        input.value = inputAttr;
                                        var focusHandler = (function(inputAttr){
                                                return function(){
                                                        if(this.value == inputAttr)this.value = "";
                                                }
                                        })(inputAttr);
                                        var blurHandler = (function(inputAttr){
                                                return function(){
                                                        if(this.value == "")this.value = inputAttr;
                                                }
                                        })(inputAttr);
                                        addEvent(input,'focus',focusHandler);
                                        addEvent(input,'blur',blurHandler);
                                }
                        }

                        //textarea
                        for(var i = 0,len = textareas.length; i < len; i++){
                                var textarea = textareas[i], textareaAttr = textarea.getAttribute('placeholder');
                                if(textareaAttr){
                                        textarea.innerText = textareaAttr;
                                        var focusHandler = (function(textareaAttr){
                                                return function(){
                                                        if(this.innerText == textareaAttr)this.innerText = "";
                                                }
                                        })(textareaAttr);
                                        var blurHandler = (function(textareaAttr){
                                                return function(){
                                                        if(this.innerText == "")this.innerText = textareaAttr;
                                                }
                                        })(textareaAttr);
                                        addEvent(textarea,'focus',focusHandler);
                                        addEvent(textarea,'blur',blurHandler);
                                }
                        }
                }
                addEvent(win,'load',placeHolderFix);
        })(document,window);
}
    </script>
<![endif]-->
<!--[if lte IE 7]>
    <script>
// ie7_patch
// PNG半透明图片的问题
if(/msie 6/.test(window.navigator.userAgent.toLowerCase())){
        function correctPNG(){
            var arVersion = navigator.appVersion.split("MSIE")
            var version = parseFloat(arVersion[1])
            if ((version >= 5.5) && (document.body.filters))
            {
               for(var j=0; j<document.images.length; j++)
               {
                  var img = document.images[j]
                  var imgName = img.src.toUpperCase()
                  if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
                  {
                     var imgID = (img.id) ? "id='" + img.id + "' " : ""
                     var imgClass = (img.className) ? "class='" + img.className + "' " : ""
                     var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
                     var imgStyle = "display:inline-block;" + img.style.cssText
                     if (img.align == "left") imgStyle = "float:left;" + imgStyle
                     if (img.align == "right") imgStyle = "float:right;" + imgStyle
                     if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
                     var strNewHTML = "<span " + imgID + imgClass + imgTitle
                     + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
                     + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
                     + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
                     img.outerHTML = strNewHTML
                     j = j-1
                  }
               }
            }    
        }
        window.attachEvent("onload", correctPNG);

        // IE6下默认不缓存背景图片
        try {
          document.execCommand('BackgroundImageCache', false, true);
        } catch(e) {}
}

if(!window.JSON)window.JSON = {};

// for IE7- 不报错
if(!window.Element)window.Element = function(){};

// for IE8-
if(!window.addEventListener){
        /**
         * @param {String} eventName 事件名称,不要带 on 开头
         * @param {Function} eventHandler 事件处理器
         */
        window.addEventListener = Element.prototype.addEventListener = function(eventType, funcHandle, useCapture) {
        var element = this;
        if (eventType == "input") { eventType = "propertychange"; }
        
        // 兼容处理
        var eventHandle = function(event) {
            event = event || window.event || {};
            
            if (!event.target) event.target = event.srcElement;        
            if (!event.preventDefault) event.preventDefault = function() {
                    event.returnValue = false;
            };
            
            if (eventType == "propertychange" && event.propertyName !== "value") return;
            
            return funcHandle.call(element, event);
        };
        eventHandle.initFuncHandle = funcHandle;
        

        element.attachEvent("on" + eventType, eventHandle);// event bind
        
        // event store
        if (element["event" + eventType])
                element["event" + eventType].push(eventHandle);
        else 
                element["event" + eventType] = [eventHandle];
    }
}

if(!window.postMessage){
        console.warn('不支持 postMessage');
        window.postMessage = function(event){
                var e = {
                        data : event
                };
                render(e);
        }
}

// for IE7- = addEventListener + MyUtils
if(!document.querySelector) {
        function fDomExtend(collection) {
        // collection extend some dom method
        for (var element, i = 0, len = collection.length; i < len; ++i){
                element = collection[i];

                        for (var key in oDomExtend)
                                element[key] = oDomExtend[key].bind(element);
                        for (var key in addElementMethod)
                                element[key] = addElementMethod[key].bind(element);
        }
        return collection;
    };

    document.querySelector = function(selector) {
        return document.querySelectorAll(selector)[0] || null;
    }
    document.querySelectorAll = function(selector) {
        if(!window.Sizzle)throw 'Sizzle.js 未加载!';
        var collection = Sizzle(selector);                
        return fDomExtend(collection);        
    }

        /**
     * dom method that extend
    */
    var oDomExtend = {
        // selector realtive
        querySelector: function(selector) {
            return oDomExtend.querySelectorAll.call(this, selector)[0] || null;
        },
        querySelectorAll: function(selector) {
            return fDomExtend(Sizzle(selector, this));
        },

        // addEventListener
        addEventListener : Element.prototype.addEventListener,
        on : Element.prototype.addEventListener
    };
}

var isNEED = window.navigator.isIE6 || window.navigator.isIE7;
window.elWrapper = function(el){
        if(!isNEED)return el;
        return fDomExtend([el])[0];
}

if (!("addEventListener" in document.createElement("div"))) {
// 劫持 document.createElement 方法
        var _old_createElement = document.createElement;
        document.createElement = function(el){
                el = _old_createElement(el);
                return elWrapper(el);
        }
}    
    </script>
    <script>
 		// json2.js
if(typeof JSON!=='object'){JSON={};}
(function(){'use strict';function f(n){return n<10?'0'+n:n;}
if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf();};}
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
if(typeof rep==='function'){value=rep.call(holder,key,value);}
switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
v=partial.length===0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';gap=mind;return v;}
if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]==='string'){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
return str('',{'':value});};}
if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
return reviver.call(holder,key,value);}
text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
throw new SyntaxError('JSON.parse');};}}());

    </script>
    <script>

/*! Sizzle v2.2.1-pre | (c) jQuery Foundation, Inc. | jquery.org/license */
!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=$.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(!(!c.qsa||A[a+" "]||q&&q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="[id='"+k+"'] "+qa(o[h]);r=o.join(","),s=_.test(a)&&oa(b.parentNode)||b}if(r)try{return H.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),n.documentMode&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),!(!c.matchesSelector||!p||A[b+" "]||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),"function"==typeof define&&define.amd?define(function(){return fa}):"undefined"!=typeof module&&module.exports?module.exports=fa:a.Sizzle=fa}(window);
//# sourceMappingURL=sizzle.min.map
    </script>
<![endif]-->
<!--[if lte IE 7]>
<style type="text/css">
	#popDiv {
		width:412px;
		background: #f0f0f6;
		border: 10px solid #e0e0e0;
		padding:0 0 10px 0;
		border-top:none;
		text-alig: left;
		font-size: 12px;
		z-index:99;
		left:50%;/*FF IE7*/
		top: 50%;/*FF IE7*/
		margin-left:-200px!important;/*FF IE7 该值为本身宽的一半 */
		margin-top:-60px!important;/*FF IE7 该值为本身高的一半*/
		margin-top:0px;
		position:fixed!important;/*FF IE7*/
		position:absolute;/*IE6*/
		_top:expression(eval(document.compatMode && document.compatMode=='CSS1Compat') ? documentElement.scrollTop + (document.documentElement.clientHeight-this.offsetHeight)/2 :/*IE6*/ document.body.scrollTop + (document.body.clientHeight - this.clientHeight)/2);/*IE5 IE5.5*/
	}
	#popDiv a{text-decoration:none;color:#f00;}
	#popDiv a:hover{color:#f60;}
	#isclose{position:absolute;bottom:5px;right:6px;}
	#isclose a{border:1px solid #e0e0e0;padding:2px 5px;background:#f0f0f6;}
	#isclose a:hover{color:#f60;background:#fc6;}
	#popDiv h1{font-size:12px;line-height:24px;background:#e0e0e0;line-height:30px;color:#333;}
	#popDiv h2{font-size:12px;text-indent:24px;line-height:24px;color:#333;font-weight:normal;padding:10px;}
	#popDiv p{line-height:24px;display:inline-block;text-indent:24px;}
</style>

<div id="popDiv">
	<h1>还在使用IE6/IE7的用户,建议升级到IE8:)</h1>
	<h2>您使用的是较低版本浏览器,将导致无法使用本系统的部分功能。我们建议您使用 IE8.0 或其他较新版本浏览器,以便更好的感受本系统的各项特色功能及服务,感谢您对本系统的关心和支持。</h2>
	</p>
	<br /><br />
	<p id="isclose">
		<a href="http://www.microsoft.com/zh-cn/download/internet-explorer-8-details.aspx" target="_blank">下载 IE 8</a>
		<a href="#" onclick="document.getElementById('popDiv').style.display='none';" id="acontinue">继续使用</a>
		<a href="javascript:window.close();" id="aClose">关闭窗口</a>
	</p>
</div>
<![endif]-->


目录
相关文章
|
29天前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
35 1
|
4月前
|
JSON JavaScript 前端开发
javascript import maps 特性现已被全部主流浏览器支持
javascript import maps 特性现已被全部主流浏览器支持
|
7月前
|
JavaScript 前端开发
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
【4月更文挑战第15天】使用Modernizr库检测浏览器特性:添加 `<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>` 到HTML,然后通过 `Modernizr.localstorage` 进行检测,如支持localStorage则执行相应代码,否则执行备用逻辑。
74 0
|
7月前
|
JavaScript 前端开发
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
52 0
|
存储 移动开发 缓存
HTML5相关面试题:1.H5新特性;2. HTML5 新标签的浏览器兼容问题;3.H5 的离线存储;4.H5缓存和常规缓存有什么差别;5:H5缓存优势;6.Web Worker 和Web作用
●拖放(Drag and drop) API. ●语义化更好的内容标签( header、nav、footer、 aside、 article、 section )。 ●音频、 视频(audio、video) API。 ●画布( Canvas) API。 ●地理( Geolocation) API。 ●本地离线存储( localStorage),即长期存储数据,浏览器关闭后数据不丢失。 ●会话 存储( sessionStorage),即数据在浏览器关闭后自动删除。 ●表单控件包括calendar、date、 time、 email、 url、 search ●新的技术包括webworker、we
241 0
|
Web App开发 JavaScript 前端开发
|
26天前
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
在浏览器执行js脚本的两种方式