題目描述: 有一個div容器,容器中的內容如下
<div id="jsContainer">
這裏會,給出一段隨機文本,可能包含一些鏈接,比如https://www.baidu.com,或者 www.baidu.com?from=onlineExam,如果出現鏈接文本,請給該鏈接文本加上鍊接標籤,用戶點擊後能直接在新窗口中打開該鏈接。
</div>
實現link函數,要求:
(1)jsContainer中不能包含有其他的dom 元素
(2)將文本中的以http、https或是是www開頭的鏈接加上鍊接標籤,同時www開頭的鏈接地址要加上http協議。
(3)點擊鏈接時,在新窗口中打開。
思路:
(1)jsContainer中不包含其他的dom元素則可以考慮利用innerText或者是textContent來獲取元素中的文本信息,剔除所有的標籤元素
(2)匹配http等協議利用正則表達式進行匹配
(3)利用replace函數給鏈接加上a標籤
(4)在新窗口打開表示target = “_blank”
需要知識點:
1、innerText和textContent的區別
(1)innerText不會獲取到隱藏元素的文本內容
(2)innerText不會獲取script、style等元素內容
(3)innerText會導致迴流(reflow)
textContent會獲取所有內容文本,不管元素是否隱藏或者是script等,同時不會導致迴流。
innerHTML兼容性最好但是由於題目要求不能包含其他的標籤元素,所以不能使用innerHTML。具體的差別可以通過如下的代碼體現:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>innerText vs textContent</title>
</head>
<body>
<div id="test">
test area
<div style="visibility:hidden">hidden</div>
<div style="display:none">none</div>
<div>hello</div>
<script>document</script>
</div>
<hr />
<div id="log_container">
log area
</div>
<script>
function log(text){
var $d = document.createElement('pre');
$d.textContent = text;
log_container.appendChild($d);
}
log('html: ' + JSON.stringify(test.innerHTML));
log('innerText: ' + JSON.stringify(test.innerText));
log('textContent: ' + JSON.stringify(test.textContent));
</script>
</body>
</html>
運行結果:
html: "\n test area\n <div style=\"visibility:hidden\">hidden</div>\n <div style=\"display:none\">none</div>\n <div>hello</div>\n <script>document</script>\n"
innerText: "test area\nhello"
textContent: "\n test area\n hidden\n none\n hello\n document\n"
2、利用replace函數替換,其中要注意一種情況就是www開頭的,所以不能直接用字符串替換(利用字符串替換時$1表示的是第一個匹配的字符串)
text = text.replace(reg,"<a target = '_blank' href='$1'>$1</a>");
應該要利用replace傳入函數的方式處理www開頭的情況,函數的返回值將替換匹配的字符串,同時要注意的是當正則表達式中沒有g全局標誌時,replace只會匹配一個,有全局標誌纔會進行全局的替換。函數中的參數第一個是匹配字符串,後面的多個參數可表示匹配的子串,然後是一個整數,表示匹配字符串在原字符串中的位置,最後一個參數是原字符串。
題目答案:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
a {
color: #00bc9b;
}
</style>
</head>
<body>
<div id="jsContainer">
<span>hello</span>
這裏會給出一段隨機文本,<span>hi,nihao</span>可能包含一些鏈接,比如https://www.baidu.com,或者 www.baidu.com?from=onlineExam,如果出現鏈接文本,請給該鏈接文本加上鍊接標籤,用戶點擊後能直接在新窗口中打開該鏈接。
</div>
<script type="text/javascript">
function link() {
var Dom = document.getElementById("jsContainer");
var text = Dom.textContent;/*保證其中沒有其他子標籤,只獲取文本信息*/
/* var text = Dom.innerText;*/
/* console.log(text);*/
var reg = new RegExp("(http://||https://)?www.[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]","g");
var text = text.replace(reg,function(result){
if((new RegExp("^www.")).test(result)){
result = "http://" + result;
}
return '<a target="_blank" href='+ result +'>'+result+'</a>'
})
Dom.innerHTML = text;
}
link();
</script>
</body>
</html>