1. 程式人生 > >仿新浪微博@功能 JS的實現 ——使用JQ At.js 和HTML5 contentEditable

仿新浪微博@功能 JS的實現 ——使用JQ At.js 和HTML5 contentEditable

專案需求 增加@功能

先上效果圖



Atwho.js  gitHub地址   https://github.com/ichord/At.js


需要引入的JS:

  <script type="text/javascript" src="jquery.caret.js"></script>    // 這個JS外掛用來獲取游標位置
  <script type="text/javascript" src="dist/js/jquery.atwho.js"></script> // 這個就是atJS了   

這裡是atjs的一些預設配置項 


你可以使用普通的input框   而我們這裡用的是H5的  contentEditable  這個神奇而又強大的屬性  

附上W3C的連線:

http://www.w3school.com.cn/html5/att_global_contenteditable.asp

這裡是我寫的一個demo

  <style type="text/css">
    .inputor {
      height: 160px;
      width: 90%;
      border: 1px solid #dadada;
      border-radius: 4px;
      padding: 5px 8px;
      outline: 0 none;
      margin: 10px 0;
      background: white;
      font-size: inherit;
      overflow-y: scroll;
    }
    .inputor:focus {
      border: 1px solid rgb(6, 150, 247);
    }

  .inputor span{
        color: #3366FF;
    }

  </style>

//  這裡是dom結構

 <div id="editable" class="inputor" contentEditable="true">    //注意這個屬性  contenteditable 屬性規定是否可編輯元素的內容。  就是你可以往裡面填充各種結構標籤 

但是好像只能以JS的方式去新增  打上去的沒有效果 還是標籤 可能出於安全考慮  沒太研究過

// 這裡是JS

<script type="text/javascript">
  $(function(){
      var at_config = {
         at: "@"  ,                              // 這個是觸發彈出選單的按鍵
         data: 'people.json',                     // 這裡是原始碼中封裝的一個AJAX   可以是絕對路徑相對路徑  我這裡是一段模擬的JSON
         insertTpl: '<span data-id="${id}">@${name}</span>',       //你的dom結構裡顯示的內容  你可以給span加樣式  繫結id
         displayTpl: "<li > ${name} </li>",                       // 這個是顯示的彈出選單裡面的內容 
         limit: 200
      };
     $('#editable').atwho(at_config) // 初始化
  });

  </script>

// 模擬的JSON

[{"id":"1","name":"李乾坤"},{"id":"2","name":"王鍇"},{"id":"3","name":"孔德博"},{"id":"4","name":"劉攀"},{"id":"5","name":"趙又鳴"}]

最後程式碼及效果


解決貼上的樣式問題  

借用張鑫旭大神的程式碼 嘿嘿  

谷歌可以-webkit-user-modify:read-write-plaintext-only 來解決複製進來的格式問題

(function(){
    
    $('[contenteditable]').each(function() {
        // 幹掉IE http之類地址自動加連結
        try {
            document.execCommand("AutoUrlDetect", false, false);
        } catch (e) {}
        
        $(this).on('paste', function(e) {
            e.preventDefault();
            var text = null;
        
            if(window.clipboardData && clipboardData.setData) {
                // IE
                text = window.clipboardData.getData('text');
            } else {
                text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('在這裡輸入文字');
            }
            if (document.body.createTextRange) {    
                if (document.selection) {
                    textRange = document.selection.createRange();
                } else if (window.getSelection) {
                    sel = window.getSelection();
                    var range = sel.getRangeAt(0);
                    
                    // 建立臨時元素,使得TextRange可以移動到正確的位置
                    var tempEl = document.createElement("span");
                    tempEl.innerHTML = "&#FEFF;";
                    range.deleteContents();
                    range.insertNode(tempEl);
                    textRange = document.body.createTextRange();
                    textRange.moveToElementText(tempEl);
                    tempEl.parentNode.removeChild(tempEl);
                }
                textRange.text = text;
                textRange.collapse(false);
                textRange.select();
            } else {
                // Chrome之類瀏覽器
                document.execCommand("insertText", false, text);
            }
        });
    });
})();

**點選無法聚焦無法輸入問題**

有時候會有殘留的@的DOM 比如使用者點了[email protected] 沒選人提交了 或者提交後被截斷了 下次再去點輸入框的時候 就會出現失焦無法輸入的問題 這個時候你就要自己過濾下空的和殘缺的@標籤  <span class="atwho-inserted"></span>