让IE浏览器支持html5标准

自HTML5标准的提出就得到非常多的关注,而作为全球使用用户最多的IE浏览器能够支持HTML5标准也是大家备受关注一个问题,让IE(包括IE6)支持HTML5元素,我们需要在HTML头部添加以下JavaScript,这是一个简单的document.createElement声明,利用条件注释针对IE来调用这个js文件。Opera,FireFox等其他非IE浏览器就会忽视这段代码,也不会存在http请求。

?
1
2
3
<!–[if IE]>  
< script  src=”http://html5shiv.googlecode.com/svn/trunk/html5.js”></ script >  
<![endif]–>

  上面这段代码仅会在IE浏览器下运行,还有一点需要注意,在页面中调用html5.js文件必须添加在页面的head元素内,因为IE浏览器必须在元素解析前知道这个元素,所以这个js文件不能在页面底部调用。

  这个html5的js文件是作者把他放在Google code project上提供给大家可以直接调用的,当然,如果觉得这样会影响你的网页打开速度,你可以把html5的js文件直接下载下来让后上传到自己的服务器单独调用。

  以下是html5的js文件中的代码:

?
1
2
3
4
5
6
7
8
/*
  HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
( function (l,f){ function  m(){ var  a=e.elements; return "string" == typeof  a?a.split( " " ):a} function  i(a){ var  b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b); return  b} function  p(a,b,c){b||(b=f); if (g) return  b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a); return  b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b} function  t(a,b){ if (!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
a.createElement= function (c){ return !e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function( "h,f" , "return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" +m().join().replace(/[\w\-]+/g, function (a){b.createElem(a);b.frag.createElement(a); return 'c("' +a+ '")' })+ ");return n}" )(e,b.frag)} function  q(a){a||(a=f); var  b=i(a); if (e.shivCSS&&!j&&!b.hasCSS){ var  c,d=a;c=d.createElement( "p" );d=d.getElementsByTagName( "head" )[0]||d.documentElement;c.innerHTML= "x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>" ;
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b); return  a} var  k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?: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,j,o= "_html5shiv" ,h=0,n={},g;( function (){ try { var  a=f.createElement( "a" );a.innerHTML= "<xyz></xyz>" ;j= "hidden" in  a; var  b; if (!(b=1==a.childNodes.length)){f.createElement( "a" ); var  c=f.createDocumentFragment();b= "undefined" == typeof  c.cloneNode||
"undefined" == typeof  c.createDocumentFragment|| "undefined" == typeof  c.createElement}g=b} catch (d){g=j=!0}})(); var  e={elements:k.elements|| "abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video" ,version: "3.7.0" ,shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type: "default" ,shivDocument:q,createElement:p,createDocumentFragment: function (a,b){a||(a=f);
if (g) return  a.createDocumentFragment(); for ( var  b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]); return  c}};l.html5=e;q(f)})( this ,document);

  除了在网页中调用包含以上代码的js文件来让IE浏览器支持HTML5元素以外,你也可以以下面这种方式把代码直接添加到网页中。

?
1
2
3
4
5
6
7
8
9
<!–[ if  IE]>  
<script>  
( function (l,f){ function  m(){ var  a=e.elements; return "string" == typeof  a?a.split( " " ):a} function  i(a){ var  b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b); return  b} function  p(a,b,c){b||(b=f); if (g) return  b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a); return  b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b} function  t(a,b){ if (!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
a.createElement= function (c){ return !e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function( "h,f" , "return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" +m().join().replace(/[\w\-]+/g, function (a){b.createElem(a);b.frag.createElement(a); return 'c("' +a+ '")' })+ ");return n}" )(e,b.frag)} function  q(a){a||(a=f); var  b=i(a); if (e.shivCSS&&!j&&!b.hasCSS){ var  c,d=a;c=d.createElement( "p" );d=d.getElementsByTagName( "head" )[0]||d.documentElement;c.innerHTML= "x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>" ;
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b); return  a} var  k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?: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,j,o= "_html5shiv" ,h=0,n={},g;( function (){ try { var  a=f.createElement( "a" );a.innerHTML= "<xyz></xyz>" ;j= "hidden" in  a; var  b; if (!(b=1==a.childNodes.length)){f.createElement( "a" ); var  c=f.createDocumentFragment();b= "undefined" == typeof  c.cloneNode||
"undefined" == typeof  c.createDocumentFragment|| "undefined" == typeof  c.createElement}g=b} catch (d){g=j=!0}})(); var  e={elements:k.elements|| "abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video" ,version: "3.7.0" ,shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type: "default" ,shivDocument:q,createElement:p,createDocumentFragment: function (a,b){a||(a=f);
if (g) return  a.createDocumentFragment(); for ( var  b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]); return  c}};l.html5=e;q(f)})( this ,document);  
</script>  
<![endif]–>

  补充阅读:以下代码是发布在github.com上的html5shiv.js,版本:3.7.0,注释也比较完整。可能GitHub打开速度有些慢,这里就直接将代码复制贴过来,如果需要最新版本,地址:https://github.com/aFarkas/html5shiv/blob/master/src/html5shiv.js

?
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/**
* @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
;( function (window, document) {
/*jshint evil:true */
   /** version */
   var  version =  '3.7.0' ;
 
   /** Preset options */
   var  options = window.html5 || {};
 
   /** Used to skip problem elements */
   var  reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
 
   /** Not all elements can be cloned in IE **/
   var  saveClones = /^(?: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;
 
   /** Detect whether the browser supports default html5 styles */
   var  supportsHtml5Styles;
 
   /** Name of the expando, to work with multiple documents or to re-shiv one document */
   var  expando =  '_html5shiv' ;
 
   /** The id for the the documents expando */
   var  expanID = 0;
 
   /** Cached data for each document */
   var  expandoData = {};
 
   /** Detect whether the browser supports unknown elements */
   var  supportsUnknownElements;
 
   ( function () {
     try  {
         var  a = document.createElement( 'a' );
         a.innerHTML =  '<xyz></xyz>' ;
         //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
         supportsHtml5Styles = ( 'hidden'  in  a);
 
         supportsUnknownElements = a.childNodes.length == 1 || ( function () {
           // assign a false positive if unable to shiv
           (document.createElement)( 'a' );
           var  frag = document.createDocumentFragment();
           return  (
             typeof  frag.cloneNode ==  'undefined'  ||
             typeof  frag.createDocumentFragment ==  'undefined'  ||
             typeof  frag.createElement ==  'undefined'
           );
         }());
     catch (e) {
       // assign a false positive if detection fails => unable to shiv
       supportsHtml5Styles =  true ;
       supportsUnknownElements =  true ;
     }
 
   }());
 
   /*--------------------------------------------------------------------------*/
 
   /**
    * Creates a style sheet with the given CSS text and adds it to the document.
    * @private
    * @param {Document} ownerDocument The document.
    * @param {String} cssText The CSS text.
    * @returns {StyleSheet} The style element.
    */
   function  addStyleSheet(ownerDocument, cssText) {
     var  p = ownerDocument.createElement( 'p' ),
         parent = ownerDocument.getElementsByTagName( 'head' )[0] || ownerDocument.documentElement;
 
     p.innerHTML =  'x<style>'  + cssText +  '</style>' ;
     return  parent.insertBefore(p.lastChild, parent.firstChild);
   }
 
   /**
    * Returns the value of `html5.elements` as an array.
    * @private
    * @returns {Array} An array of shived element node names.
    */
   function  getElements() {
     var  elements = html5.elements;
     return  typeof  elements ==  'string'  ? elements.split( ' ' ) : elements;
   }
 
     /**
    * Returns the data associated to the given document
    * @private
    * @param {Document} ownerDocument The document.
    * @returns {Object} An object of data.
    */
   function  getExpandoData(ownerDocument) {
     var  data = expandoData[ownerDocument[expando]];
     if  (!data) {
         data = {};
         expanID++;
         ownerDocument[expando] = expanID;
         expandoData[expanID] = data;
     }
     return  data;
   }
 
   /**
    * returns a shived element for the given nodeName and document
    * @memberOf html5
    * @param {String} nodeName name of the element
    * @param {Document} ownerDocument The context document.
    * @returns {Object} The shived element.
    */
   function  createElement(nodeName, ownerDocument, data){
     if  (!ownerDocument) {
         ownerDocument = document;
     }
     if (supportsUnknownElements){
         return  ownerDocument.createElement(nodeName);
     }
     if  (!data) {
         data = getExpandoData(ownerDocument);
     }
     var  node;
 
     if  (data.cache[nodeName]) {
         node = data.cache[nodeName].cloneNode();
     else  if  (saveClones.test(nodeName)) {
         node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
     else  {
         node = data.createElem(nodeName);
     }
 
     // Avoid adding some elements to fragments in IE < 9 because
     // * Attributes like `name` or `type` cannot be set/changed once an element
     //   is inserted into a document/fragment
     // * Link elements with `src` attributes that are inaccessible, as with
     //   a 403 response, will cause the tab/window to crash
     // * Script elements appended to fragments will execute when their `src`
     //   or `text` property is set
     return  node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
   }
 
   /**
    * returns a shived DocumentFragment for the given document
    * @memberOf html5
    * @param {Document} ownerDocument The context document.
    * @returns {Object} The shived DocumentFragment.
    */
   function  createDocumentFragment(ownerDocument, data){
     if  (!ownerDocument) {
         ownerDocument = document;
     }
     if (supportsUnknownElements){
         return  ownerDocument.createDocumentFragment();
     }
     data = data || getExpandoData(ownerDocument);
     var  clone = data.frag.cloneNode(),
         i = 0,
         elems = getElements(),
         l = elems.length;
     for (;i<l;i++){
         clone.createElement(elems[i]);
     }
     return  clone;
   }
 
   /**
    * Shivs the `createElement` and `createDocumentFragment` methods of the document.
    * @private
    * @param {Document|DocumentFragment} ownerDocument The document.
    * @param {Object} data of the document.
    */
   function  shivMethods(ownerDocument, data) {
     if  (!data.cache) {
         data.cache = {};
         data.createElem = ownerDocument.createElement;
         data.createFrag = ownerDocument.createDocumentFragment;
         data.frag = data.createFrag();
     }
 
 
     ownerDocument.createElement =  function (nodeName) {
       //abort shiv
       if  (!html5.shivMethods) {
           return  data.createElem(nodeName);
       }
       return  createElement(nodeName, ownerDocument, data);
     };
 
     ownerDocument.createDocumentFragment = Function( 'h,f' 'return function(){'  +
       'var n=f.cloneNode(),c=n.createElement;'  +
       'h.shivMethods&&('  +
         // unroll the `createElement` calls
         getElements().join().replace(/[\w\-:]+/g,  function (nodeName) {
           data.createElem(nodeName);
           data.frag.createElement(nodeName);
           return  'c("'  + nodeName +  '")' ;
         }) +
       ');return n}'
     )(html5, data.frag);
   }
 
   /*--------------------------------------------------------------------------*/
 
   /**
    * Shivs the given document.
    * @memberOf html5
    * @param {Document} ownerDocument The document to shiv.
    * @returns {Document} The shived document.
    */
   function  shivDocument(ownerDocument) {
     if  (!ownerDocument) {
         ownerDocument = document;
     }
     var  data = getExpandoData(ownerDocument);
 
     if  (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
       data.hasCSS = !!addStyleSheet(ownerDocument,
         // corrects block display not defined in IE6/7/8/9
         'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}'  +
         // adds styling not present in IE6/7/8/9
         'mark{background:#FF0;color:#000}'  +
         // hides non-rendered elements
         'template{display:none}'
       );
     }
     if  (!supportsUnknownElements) {
       shivMethods(ownerDocument, data);
     }
     return  ownerDocument;
   }
 
   /*--------------------------------------------------------------------------*/
 
   /**
    * The `html5` object is exposed so that more elements can be shived and
    * existing shiving can be detected on iframes.
    * @type Object
    * @example
    *
    * // options can be changed before the script is included
    * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
    */
   var  html5 = {
 
     /**
      * An array or space separated string of node names of the elements to shiv.
      * @memberOf html5
      * @type Array|String
      */
     'elements' : options.elements ||  'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video' ,
 
     /**
      * current version of html5shiv
      */
     'version' : version,
 
     /**
      * A flag to indicate that the HTML5 style sheet should be inserted.
      * @memberOf html5
      * @type Boolean
      */
     'shivCSS' : (options.shivCSS !==  false ),
 
     /**
      * Is equal to true if a browser supports creating unknown/HTML5 elements
      * @memberOf html5
      * @type boolean
      */
     'supportsUnknownElements' : supportsUnknownElements,
 
     /**
      * A flag to indicate that the document's `createElement` and `createDocumentFragment`
      * methods should be overwritten.
      * @memberOf html5
      * @type Boolean
      */
     'shivMethods ': (options.shivMethods !== false),
 
     /**
      * A string to describe the type of `html5` object ("default" or "default print").
      * @memberOf html5
      * @type String
      */
     ' type ': ' default ',
 
     // shivs the document according to the specified `html5` object options
     ' shivDocument': shivDocument,
 
     //creates a shived element
     createElement: createElement,
 
     //creates a shived documentFragment
     createDocumentFragment: createDocumentFragment
   };
 
   /*--------------------------------------------------------------------------*/
 
   // expose html5
   window.html5 = html5;
 
   // shiv the document
   shivDocument(document);
 
}( this , document));

  把html5shiv.js在head里面引入,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<! DOCTYPE  HTML>
< html >
     < head >
         < meta  charset = "UTF-8" >
         < title ></ title >
         < script  type = "text/javascript"  src = "js/html5shiv.js" ></ script >
         < style  type = "text/css" >
             nav {
                 width:200px;
                 height:100px;
                 background:#f12;
                 }
         </ style >
     </ head >
     < body >
         < nav >123abc</ nav >abc123
     </ body >
</ html >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值