欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js完美實(shí)現(xiàn)@提到好友特效(兼容各大瀏覽器)

 更新時(shí)間:2015年03月16日 08:57:05   投稿:hebedich  
本文給大家分享的是一則使用javascript完美實(shí)現(xiàn)兼容各大瀏覽器的@好友自動(dòng)提示的特效,是根據(jù)百度貼吧的效果模仿來(lái)的,推薦給小伙伴們,希望大家能夠喜歡。

要求

1.輸入@時(shí),彈出匹配的好友菜單

2.光標(biāo)進(jìn)入包含有"@好友"的標(biāo)簽時(shí),彈出菜單

3.按backspace刪除時(shí),如果光標(biāo)前面是包含有"@好友"的標(biāo)簽,彈出菜單

4.兼容ie,firefox.

具體做法

針對(duì)要求一,很自然的會(huì)想到對(duì)輸入框綁定事件。這里要綁定mousedown,而不是mouseup.因?yàn)槿绻莔ouseup的話,用event.preventDefault()是無(wú)法阻止鍵盤(pán)輸入@的。另外,這里在事件回調(diào)中用return false也是起不了作用的。

綁定mousedown事件后,就要插入自定義的包含有"@好友"的標(biāo)簽了。新浪微博的輸入框是用textarea做的,無(wú)法知道其內(nèi)部是怎樣處理的,只好看百度貼吧了。

可以看到,貼吧是插入了<span class='at'></span>標(biāo)簽。這應(yīng)該是方便后臺(tái)用正則表達(dá)式匹配。

具體的

復(fù)制代碼 代碼如下:

        vm.check_key=function(e){
            var editor=$('editor'),range;
            if(e.shiftKey&&e.keyCode==50){
                if (document.selection && document.selection.createRange) {
                    range = document.selection.createRange();
                    range.pasteHTML("&nbsp;<span id='at"+at_index+"' class='at_span'>@</span>&nbsp;");
                }else{
                    document.execCommand("insertHtml", false,"&nbsp;<span id='at"+at_index+"' class='at_span'>@</span>&nbsp;");
                }
                e.preventDefault();
            }
        };

這里需要在光標(biāo)處插入,所以用到了range.

然后就是菜單顯示了,關(guān)鍵在于怎么定位。我的做法很垃圾,就是為插入的span添加id,然后根據(jù)span id的位置為菜單定位。如果有更好的做法,請(qǐng)告訴我一聲。

具體的

復(fù)制代碼 代碼如下:

    function at_box_show(at){
        var at_pos=avalon($(at)).position();
        $('at_box').style.left=at_pos.left+'px';
        $('at_box').style.top=at_pos.top+16+'px';
        $('at_box').style.display='block';
    }
    var at_index=0,cur_index=0;
    avalon.define('editor', function(vm) {
        vm.item_click=function(){
            $('at'+cur_index).innerHTML="@"+this.innerHTML;
            $('at_box').style.display='none';
            at_index++;
        };
        vm.check_key=function(e){
            var editor=$('editor'),a=getCharacterPrecedingCaret(editor),range;
            if(e.shiftKey&&e.keyCode==50){
                if (document.selection && document.selection.createRange) {
                    range = document.selection.createRange();
                    range.pasteHTML("&nbsp;<span id='at"+at_index+"' class='at_span'>@</span>&nbsp;");
                }else{
                    document.execCommand("insertHtml", false,"&nbsp;<span id='at"+at_index+"' class='at_span'>@</span>&nbsp;");
                }
                at_box_show('at'+at_index);
                cur_index=at_index;
                e.preventDefault();
            }
        };
    });

at_show_box根據(jù)新插入的span id,為at_box定位,然后顯示菜單。cur_index表示光標(biāo)當(dāng)前所在的span id.設(shè)置這個(gè)變量因?yàn)橛脩艨赡艿够厝ジ囊呀?jīng)插入的span,而at_index是一直遞增的,所以這里就還需要一個(gè)變量。

用戶點(diǎn)擊菜單中好友項(xiàng),觸發(fā)item_click回調(diào)?;卣{(diào)里就是將好友名字用innserHTML添加到當(dāng)前span里面.然后隱藏菜單,at_index++。

上面是監(jiān)聽(tīng)shift+@,接著是監(jiān)聽(tīng)backspace刪除。

復(fù)制代碼 代碼如下:

    function getTextBeforeCursor(containerEl) {
        var precedingChar = "", sel, range, precedingRange;
        if (window.getSelection) {
            sel = window.getSelection();
            if (sel.rangeCount > 0) {
                range = sel.getRangeAt(0).cloneRange();
                range.collapse(true);
                range.setStart(containerEl, 0);
                precedingChar = range.cloneContents();
            }
        } else if ( (sel = document.selection)) {
            range = sel.createRange();
            precedingRange = range.duplicate();
            precedingRange.moveToElementText(containerEl);
            precedingRange.setEndPoint("EndToStart", range);
            precedingChar = precedingRange.htmlText;
        }
        return precedingChar;
    }

getTextBeforeCursor的作用是獲取光標(biāo)前的內(nèi)容.由于兼容性,這個(gè)函數(shù)在標(biāo)準(zhǔn)瀏覽器中可以得到是光標(biāo)前所有內(nèi)容的DocumentFragment,而在ie中就只能得到文本(不是node)了,不過(guò)這個(gè)html字符串可以轉(zhuǎn)換成DocumentFragment.在avalon中用parseHTML就可以將html字符串變成node了。jquery中用$(html)[0]也能得到node.

有了這個(gè)函數(shù),再用lastChild就可以判斷光標(biāo)是不是在光標(biāo)前html的lastChild里,并且這個(gè)lastChild是span。

具體的

復(fù)制代碼 代碼如下:

               var a=getTextBeforeCursor($('editor'));
                       if(e.keyCode==8){
                if(!-[1,]){
                    var b=avalon.parseHTML(a).lastChild;
                }else{
                    var b=a.lastChild;
                }
                if(b.nodeType==1&&b.nodeName=='SPAN'){
                    var id=b.id;
                    cur_index=b.id.substring(2);
                    at_box_show(b.id);
                }else
                    $('at_box').style.display='none';
            }

最后是光標(biāo)進(jìn)入span標(biāo)簽,顯示菜單。這個(gè)很顯然需要綁定鼠標(biāo)事件。這里綁定mouseup,因?yàn)槿绻壎╩ousedown的話,需要鼠標(biāo)在span標(biāo)簽再點(diǎn)一次才能顯示菜單。至于原理,和上面差不多。

復(fù)制代碼 代碼如下:

        vm.check_mouse=function(e){
            var editor=$('editor'),a=getTextBeforeCursor(editor);
            if(!-[1,]){
                var b=avalon.parseHTML(getTextBeforeCursor(editor)).lastChild;
            }else{
                var b=a.lastChild;
            }
            if(b!=null&&b.nodeType==1&&b.nodeName=='SPAN'){
                var id=b.id;
                cur_index=b.id.substring(2);
                at_box_show(b.id);
            }else
                $('at_box').style.display='none';
        };

注意,如果光標(biāo)在span里面,就要取出它的id,at_box根據(jù)這個(gè)id定位,另外還要重置cur_index.

至于ajax更新菜單,字符匹配我就不做了

效果

firefox

ie8

ie7

ie6

下載

以上就是本文所述的全部?jī)?nèi)容了,希望對(duì)大家了解javascript能夠有所幫助。

相關(guān)文章

  • Bootstrap實(shí)現(xiàn)input控件失去焦點(diǎn)時(shí)驗(yàn)證

    Bootstrap實(shí)現(xiàn)input控件失去焦點(diǎn)時(shí)驗(yàn)證

    這篇文章主要介紹了Bootstrap實(shí)現(xiàn)input控件失去焦點(diǎn)時(shí)驗(yàn)證的相關(guān)資料,非常不錯(cuò),需要的朋友可以參考下,需要的朋友可以參考下
    2016-08-08
  • 微信小程序?qū)崿F(xiàn)蒙版彈出窗功能

    微信小程序?qū)崿F(xiàn)蒙版彈出窗功能

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)蒙版彈出窗功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • uniapp使用navigateBack方法返回上級(jí)頁(yè)面并刷新的簡(jiǎn)單示例

    uniapp使用navigateBack方法返回上級(jí)頁(yè)面并刷新的簡(jiǎn)單示例

    最近寫(xiě)uniapp項(xiàng)目的時(shí)候發(fā)現(xiàn)有時(shí)候需要更新頁(yè)面數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于uniapp使用navigateBack方法返回上級(jí)頁(yè)面并刷新的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • js實(shí)現(xiàn)彈幕飛機(jī)效果

    js實(shí)現(xiàn)彈幕飛機(jī)效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)彈幕飛機(jī)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript更改字符串的大小寫(xiě)

    JavaScript更改字符串的大小寫(xiě)

    在javascript中涉及字符串大小寫(xiě)轉(zhuǎn)換的方法有4個(gè):toLowerCase()、toLocaleLowerCase()、toUpperCase()及toLocaleUpperCase()。今天我們主要來(lái)用下toUpperCase()和toLowerCase()方法。
    2015-05-05
  • 在TypeScript中泛型的使用方法及場(chǎng)景

    在TypeScript中泛型的使用方法及場(chǎng)景

    泛型是TypeScript中的一個(gè)強(qiáng)大特性,它可以增加代碼的靈活性和安全性,在本文中,我將向您介紹泛型的使用方法和場(chǎng)景,并展示如何使用類型約束,需要的朋友可以參考下
    2023-08-08
  • 一文帶你掌握J(rèn)avaScript中的箭頭函數(shù)

    一文帶你掌握J(rèn)avaScript中的箭頭函數(shù)

    在JavaScript中,箭頭函數(shù)是一種簡(jiǎn)化的函數(shù)語(yǔ)法,它在ES6(ECMAScript?2015)引入,本文就來(lái)和大家深入講講JavaScript中的箭頭函數(shù)的使用吧
    2023-05-05
  • JS判斷對(duì)象是否為空對(duì)象的幾種實(shí)用方法匯總

    JS判斷對(duì)象是否為空對(duì)象的幾種實(shí)用方法匯總

    判斷是否為空對(duì)象在實(shí)際開(kāi)發(fā)中很常見(jiàn),下面這篇文章主要給大家介紹了關(guān)于JS判斷對(duì)象是否為空對(duì)象的幾種實(shí)用方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 微信小程序公用參數(shù)與公用方法用法示例

    微信小程序公用參數(shù)與公用方法用法示例

    這篇文章主要介紹了微信小程序公用參數(shù)與公用方法用法,結(jié)合實(shí)例形式分析了微信小程序中公用參數(shù)與公用方法的簡(jiǎn)單定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • 20多個(gè)小事例帶你重溫ES10新特性(小結(jié))

    20多個(gè)小事例帶你重溫ES10新特性(小結(jié))

    這篇文章主要介紹了20多個(gè)小事例帶你重溫ES10新特性(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論