成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JQuery Data方法的一個(gè)小特技

開發(fā) 開發(fā)工具
通常我們?cè)谟?JavaScript 操作 DOM 元素的時(shí)候會(huì)往 DOM 上臨時(shí)添加一些參數(shù),用來記住一些狀態(tài),或者從后端取參數(shù)值等。

通常我們?cè)谟?JavaScript 操作 DOM 元素的時(shí)候會(huì)往 DOM 上臨時(shí)添加一些參數(shù),用來記住一些狀態(tài),或者從后端取參數(shù)值等。

[[190918]]

一般通過在 HTML 標(biāo)簽上添加自定義屬性來實(shí)現(xiàn),但是這樣會(huì)不可避免的訪問 DOM,性能上并不好。如果你使用 jQuery 的話建議使用 $el.data() 方法來取元素上 data-* 的值,比如:

  1. <div id="demo" data-key="value"></div> 
  2. <script> 
  3.     $('#demo').attr('data-key') 
  4.     $('#demo').data('key')  // ***次訪問 DOM,以后從緩存取 
  5. </script> 

這兩個(gè)方法的區(qū)別在于 attr 每次都會(huì)直接訪問 DOM 元素,而 data 方法會(huì)緩存***次的查找,后續(xù)調(diào)用不需要訪問 DOM。

很明顯建議使用后者,但是在 低版本的 jQuery 中默認(rèn)會(huì)對(duì) data 方法取到的值進(jìn)行粗暴的強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換「parseFloat」。看下面代碼:

  1. <div id="demo0" data-key="abc">字符串</div> 
  2. <div id="demo1" data-key="123">數(shù)字</div> 
  3. <div id="demo2" data-key="123e456">科學(xué)計(jì)數(shù)法</div> 
  4. <div id="demo3" data-key="0000123">八進(jìn)制數(shù)字</div> 
  5. <script src="jquery-1.6.4"></script> 
  6. <script> 
  7.     $('#demo0').data('key')  // "abc" 
  8.     $('#demo1').data('key')  // 123 
  9.     $('#demo2').data('key')  // Infinity 
  10.     $('#demo3').data('key')  // 83 
  11. </script> 

后面兩種顯然出錯(cuò)了,就是因?yàn)?jQuery 對(duì)屬性值進(jìn)行了強(qiáng)制 parseFloat 操作。這種轉(zhuǎn)換是方便了使用者,如果是數(shù)字的話我們?nèi)〉竭@個(gè)值進(jìn)行計(jì)算什么的就不用再轉(zhuǎn)數(shù)據(jù)類型了,但是一不小心就會(huì)出 bug

發(fā)現(xiàn)這個(gè) bug 的時(shí)候***感覺是 jQuery 不應(yīng)該沒考慮到這一點(diǎn)呀。后來果斷去查了下***版的 jQuery 源代碼,發(fā)現(xiàn)已經(jīng)修復(fù)了。核心代碼在 data.js 35 行,如下

  1. function getData( data ) { 
  2.     if ( data === "true" ) { 
  3.         return true; 
  4.     } 
  5.  
  6.     if ( data === "false" ) { 
  7.         return false; 
  8.     } 
  9.  
  10.     if ( data === "null" ) { 
  11.         return null; 
  12.     } 
  13.  
  14.     // Only convert to a number if it doesn't change the string 
  15.     // 重點(diǎn)就在這里 →_→ 
  16.     if ( data === +data + "" ) { 
  17.         return +data; 
  18.     } 
  19.  
  20.     if ( rbrace.test( data ) ) { 
  21.         return JSON.parse( data ); 
  22.     } 
  23.  
  24.     return data; 

getData 方法就返回了節(jié)點(diǎn)屬性的值,只不過加了一些特殊處理使得我們?nèi)〉搅藳]有 bug 的值,關(guān)鍵地方就在這里: data === +data + "" 。這行代碼做了些什么神奇的事情

將節(jié)點(diǎn)的屬性值強(qiáng)制轉(zhuǎn)換成數(shù)字「+data」后再轉(zhuǎn)成字符串「+ ““」,如果轉(zhuǎn)換后的值與原來相等就取轉(zhuǎn)換后的值

可以簡(jiǎn)單的這么理解:jQuery 會(huì)嘗試轉(zhuǎn)換數(shù)據(jù)類型,如果轉(zhuǎn)換后和轉(zhuǎn)換前的 長(zhǎng)得一樣 那么 jQuery 就認(rèn)為它是需要被轉(zhuǎn)換成數(shù)字的。這樣就可以***規(guī)避上面例子中的兩種問題,我們來測(cè)試一下:

  1. var data = 'abc' 
  2. console.log(data === +data + "")        // false 不轉(zhuǎn)換,直接返回字符串原值 
  3.  
  4. var data = '123' 
  5. console.log(data === +data + "")        // true 轉(zhuǎn)換,使用轉(zhuǎn)換后的數(shù)字類型值 
  6.  
  7. var data = '123e456' 
  8. console.log(data === +data + "")        // false 不轉(zhuǎn)換,直接返回字符串原值 
  9.  
  10. var data = '0000123' 
  11. console.log(data === +data + "")        // false 不轉(zhuǎn)換,直接返回字符串原值 

【本文是51CTO專欄作者周琪力的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)注明出處】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2021-08-11 18:23:08

數(shù)據(jù)平臺(tái)IT

2011-05-27 17:51:00

Android

2025-05-20 08:00:00

鏈?zhǔn)?/a>調(diào)用異步

2009-06-11 10:59:19

netbeans提示

2009-07-06 18:28:26

Java Socket

2017-04-26 14:48:01

Chrome程序擴(kuò)展

2021-04-19 11:16:17

小程序微信開發(fā)

2011-10-19 09:30:23

jQuery

2012-08-07 11:28:13

卸載linux

2024-05-16 12:03:54

Python代碼開發(fā)

2020-06-01 12:47:12

戴爾

2020-08-12 22:03:17

JavaScript開發(fā)技術(shù)

2009-09-01 16:03:32

C#單元測(cè)試

2012-12-07 10:04:58

管理項(xiàng)目管理日常管理

2024-05-08 07:40:20

ChatGPT訓(xùn)練數(shù)據(jù)預(yù)測(cè)

2016-11-23 18:13:44

javascriptrxjsreactivex

2023-09-19 23:21:48

Python列表

2016-09-27 17:29:23

騰訊云小程序微信

2012-11-19 11:07:42

IBMdw

2011-05-25 15:34:17

jQueryJSON
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品视频在线观看免费 | 91看国产 | 亚洲视频在线观看免费 | 香蕉久久久 | 精品一区二区视频 | 在线免费91 | 国产乱肥老妇国产一区二 | 激情五月婷婷综合 | 不卡视频一区二区三区 | 日韩影院在线观看 | 亚洲乱码一区二区三区在线观看 | 我爱操| 欧美成人免费在线视频 | 91在线观看| 亚洲精品视频三区 | 精品九九 | a黄在线观看 | 亚洲国产成人精品女人久久久野战 | 国产一级片在线观看视频 | 日韩欧美久久精品 | 日本一区二区三区精品视频 | 久久国内精品 | 免费黄色大片 | 国产精品国产三级国产aⅴ无密码 | www国产成人免费观看视频,深夜成人网 | 成人性生交大片免费看中文带字幕 | 亚洲成人一区二区在线 | 欧美男人天堂 | 五月婷婷视频 | 日本a∨精品中文字幕在线 亚洲91视频 | 欧美黑人一区二区三区 | 中文字幕成人av | 91极品视频| 一级毛片免费 | 欧美综合一区二区 | 色综合久久久 | 亚洲精品在线免费看 | 黄色大片在线视频 | 日日夜夜操天天干 | 性xxxxx| 亚洲黄色高清视频 |