【筆試集錦】百度2018前端筆試筆試第一題

題目描述: 有一個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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章