本來沒準備今天發部落格的,在乙個前端群中,一位老大哥風自由提出了乙個簡單卻很奇特的問題:
有乙個字串是這樣的:var s = ''+ '';
怎麼通過jquery得到其中content的值?
本來覺得這個問題蠻簡單的,既可以通過正則獲取,也可以通過jquery的$將這個字串變成乙個jq物件來獲取。但是也正是後來這個方法,卻帶來了問題。
以我的理解,定位content的方法應該為$(s).find("meta").attr("content"),但是這麼去獲取結果確並不正確。
於是做了簡單的嘗試:
var s = ''+ '';$(s);
//[]
得到的並不是所詳細的結果,而是meta標籤。
這就有點奇怪了,風大猜測是
因為外面有,可能jquery不能把標籤變為dom。而在字串外層套一層div則確實能夠正確的獲取結果。
但是,這個結果真的正確麼?
又做了乙個簡單的嘗試:
var s = ''+'';$(s);
//[
]
結果並不是我們所想象的那樣,而是仍舊去除了html標籤,只不過因為套用了一層div,使$(s).find("meta").attr("content")去正確找尋了節點,並不是保護了html標籤。
這個問題的原因,相信只有jq的原始碼能夠給我答案了。寫了幾行簡單的測試**,去通過斷點解讀一下jq的處理機制:
(function() )();
事實證明,除了第一種方式不能正確的獲得結果以外,後兩種都能正確的獲取結果。通過研讀jq的原始碼中對jq物件建立的**,終於弄清楚了這個原因。
jq對傳入的字串會進行一次正則:
var parsed = rsingletag.exec( data );//rsingletag=/^<(\w+)\s*\/?>(?:<\/\1>|)$/
解釋一下這個正則吧:
^<(\w+)\s*\/?
以《開頭,至少跟著乙個字元和任意個空白字元,之後出現0或1次/
>
這個就不說了,前面這些加起來就是這樣或者這樣的
(?:<\/\1>|)$
可以匹配<、乙個/或者空白並以之為結尾
這些就是
或者跟著
這種自閉合標籤後面的空
這樣如果沒有任何屬性和子節點的字串(比如''或者'
'這樣)會通過正則的匹配,當通過正則的匹配後則會通過傳入的上下文直接建立乙個節點:
if( parsed )
//context為上下文
而未通過節點的字串,則通過建立乙個div節點,將字串置入div的innerhtml:
tmp.innerhtml = wrap[1] + elem.replace( rxhtmltag, "<$1>" ) + wrap[2];//將字串置入div物件的innerhtml
而瀏覽器是不允許div內直接包含的,因此會將html標籤過濾。
當過濾了html之後,剛才的字串變成了:
jq會從兩端向中間去尋找節點的頭尾,在這裡閉合標籤則被尋找為meta標籤。
這就是這次所得到的所有結論,總結一下:
如果你的標籤是沒有子節點和屬性的標籤,jq會通過正則判定後在你傳入的上下文環境直接建立這個節點。
如果你的標籤帶有子節點或者屬性,jq的正則不過,然後會建立乙個div,把你的字串作為div的innerhtml傳入,再對div內部的dom節點遍歷屬性和節點,去獲取class啊id啊之類的,然後再建立這個真正的節點。
但是瀏覽器不允許任何非frame類元素內部有html標籤,會將之過濾。
在過濾了html標籤後,head標籤和body標籤就成了兩個標籤,而jq是從外向內尋找包裹的標籤對的,所以這兩個標籤沒有被識別,而meta標籤因為是自閉合標籤,而且也是從外往內被包裹的最外層閉合標籤,因此就成了獲取這個標籤。
大概就是這樣了。
感謝閱讀~同時感謝風大~
Oracle莫名其妙錯誤的另類思路
1 客戶端需要8.1.7或更高版本?解決方法 安裝oracle客戶端,並在 oracle product 10.2.0 目錄下,新增 netword service和 authenticated users 使用者許可權,如果還不行,還需在administrators使用者組中加入net servi...
莫名其妙的語法報錯
今天在使用python的parser模組時,遇到這樣的問題 解析自帶的example好好的,但解析我的檔案時就報語法錯誤。這個問題在以前寫編譯器時也出現過。根據以前的經驗,估計是unix和windows平台的換行不同造成的。用ultraedit將所有的換行都變成unix格式的。問題仍然存在。然後想到...
莫名其妙的問題(3)
使用gitcafe 類似github 時,關於windows下如何github ssh 公鑰的問題 1.安裝git,從程式目錄開啟 git bash 2.鍵入命令 ssh keygen t rsa c email email.com email email.com 是github賬號 3.提醒你輸入...