jQueryベースのemail suggestプラグイン

30597 ワード

最近、プロジェクトにフォームが提出されたところはユーザーがメールボックスに記入する必要があり、PM(プロダクトマネージャ)と運営はユーザーがメールボックスに記入する際にsuggestリストが現れ、ユーザーが入力する記入プロセスを簡素化することを強く要求している.考えてみると、これもよく使われる機能だと思いますが、細心の注意を払っている友达は、検索狐白社会ログイン、私の捜狐ログインなど、ログインや他のフォームの提出があるところをたくさん発見するかもしれません.
ここでは具体的なコードを詳しく説明しないで、実現の構想と流れだけを話します.まずデフォルト設定defaultsがあります
 1 //       
 2         defaults = {
 3             sugClass: 'ema-sug',
 4             domains: [
 5                 'sohu.com',
 6                 '163.com',
 7                 '126.com',
 8                 '139.com',
 9                 'sina.com',
10                 'qq.com',
11                 'gmail.com'
12             ]
13         }

sugClassは、ユーザーがsuggestにスタイルを追加し、プラグインコンテンツjsフックとして使用し、domainsはsuggestリストコンテンツであり、ユーザーがプラグインを使用するときにパラメータを渡さない場合はデフォルト構成を使用します.
プラグインの内部にはEmailSugコンストラクタがあり、プラグインを呼び出すたびにEmailSugのインスタンスが新しく作成されます.各インスタンスには独自のプロパティと構成があります.
 1 function EmailSug(elem, options) {
 2         this.$field = $(elem); 
 3         this.options = $.extend(true, {}, defaults, options);
 4         this._defaults = defaults;
 5         this._domains = this.options.domains;
 6         //         
 7         this.selectedIndex = 0;
 8 
 9         this.init();
10     }

インスタンスを作成すると初期化関数が実行され、初期化関数はイベントバインドメソッドを呼び出します.
init: function() {
    this.addEvent();      
}

イベントバインドメソッドはinput要素をkeyup blurイベントにバインドし,ユーザがコンテンツを入力するときにsuggest更新とblurを行うときにsuggestプロンプトを閉じる.
 1 addEvent: function() {
 2             var 
 3                 //      
 4                 that = this,
 5 
 6                 // 
 7                 value;
 8 
 9             this.$field.on('keyup.ema', function(e) {
10                 value = $.trim(this.value);
11 
12                 if (value) {
13                     that.create(this, value);
14 
15                     that.doSelect(e.keyCode);
16                 } else {
17                     that.hide();
18                 }
19             }).on('blur.ema', function() {
20                 setTimeout(function() {
21                     that.hide(); 
22                 }, 200);
23             });
24         }

blurイベント処理はsettimeout処理を使用する必要があります.ユーザーがsuggestの要素をマウスでクリックするとinputのblurイベントがトリガーされるため、settimeout処理をしないと選択する要素がクリックされません.
  1 create: function(elem, value) {
  2             var 
  3                 // 
  4                 that = this,
  5 
  6                 arr,
  7 
  8                 len,
  9 
 10                 // 
 11                 fragment,
 12 
 13                 //  
 14                 ul = [],
 15                 
 16                 // 
 17                 offset,
 18 
 19                 left,
 20                 
 21                 top,
 22                 
 23                 width,
 24 
 25                 height,
 26 
 27                 style,
 28                 
 29                 //      
 30                 borderWidth = 2;
 31 
 32             elem = $(elem);
 33             offset = elem.offset();
 34 
 35             width = elem.outerWidth(true) - borderWidth;
 36             height = elem.outerHeight(true);
 37             left = offset.left; 
 38             top = offset.top + height;
 39             style = 'left: ' + left + 'px; top: ' + top + 'px; width: ' + width + 'px; border: 1px solid #e2e2e2; border-top: 0; display: none';
 40 
 41             // 
 42             fragment = $('<div class="' + this.options.sugClass + '-wrapper" style="' + style + '" />');
 43             ul.push('<ul class="' + this.options.sugClass + '-list">');
 44 
 45             arr = this.filter(value, this._domains);
 46             len = arr.length;
 47             $.each(arr, function(i, domain) {
 48                 var 
 49                     //  
 50                     _class = that.options.sugClass + '-item';
 51 
 52                 if (that.selectedIndex > len - 1) {
 53                     if (i === 0) {
 54                         _class += ' active';
 55 
 56                         that.selectedIndex = 0;
 57                     }
 58                 } else {
 59                     if (i === that.selectedIndex) {
 60                         _class += ' active';
 61                     } 
 62                 } 
 63 
 64                 ul.push('<li class="' + _class + '" data-index="' + i + '">' + value.replace(/@.*/, '') + '@' + domain  + '</li>'); 
 65             });
 66 
 67             ul.push('</ul>');
 68             ul = ul.join('');
 69 
 70             if (this.$suggest) {
 71                 this.$suggest.empty();
 72                 this.$suggest.append(ul);
 73             } else {
 74                 fragment.append(ul);
 75 
 76                 //      
 77                 $('body').append(fragment);
 78                 this.$suggest = fragment;
 79 
 80                 /// 
 81                 this.$suggest.on('mouseenter click', '.' + this.options.sugClass + '-item', function(e) {
 82                     var lis,
 83                     
 84                         li;
 85 
 86                     li = $(this);
 87                     lis = li.parent().children();
 88 
 89                     if (e.type === 'mouseenter') {
 90                         li.addClass('active').siblings().removeClass('active');   
 91 
 92                         that.selectedIndex = $.inArray(this, lis);
 93                     } else {
 94                         //     
 95                         that.$field.val(lis.eq(that.selectedIndex).text());
 96 
 97                         //   email sug
 98                         that.hide();
 99                     }
100                 });
101             }
102 
103             // 
104             this.show();
105         }

createメソッドはfilterメソッドを呼び出し、ユーザーが入力した内容に基づいて構成パラメータdomainsをフィルタリングし、ユーザー入力と一致する配列に戻り、suggestリストを作成して要素を選択し、input要素の位置に基づいてsuggestを位置決めし、最後にページにレンダリングして表示します.各インスタンスはsuggest要素を1つだけ作成し、ユーザーが入力した内容に基づいてリストを更新します.
 1 // 
 2         filter: function(value, arr) {
 3             var 
 4                 // 
 5                 start,
 6             
 7                 suffix,
 8                 
 9                 r = [];
10 
11             start = value.indexOf('@');
12             if (start > -1) {
13                 suffix = value.substring(start + 1);
14 
15                 $.each(arr, function(i, str) {
16                     if (str.indexOf(suffix) > -1) {
17                         r.push(str); 
18                     }
19                 });
20             } else {
21                 r = arr;
22             }
23 
24             return r;
25         }

filterメソッド、ロジックを実現するのはよく理解します
 1 doSelect: function(keyCode) {
 2             var 
 3                 //
 4                 elems = $('.' + this.options.sugClass + '-item', this.$suggest),
 5 
 6                 //  
 7                 min = 0,
 8 
 9                 // 
10                 max = elems.length - 1; 
11                 
12             switch (keyCode) {
13                 case 13:
14                     //          
15                     $('li.active', this.$suggest).trigger('click');
16 
17                     //     
18                     this.selectedIndex = 0;
19 
20                     break;
21                     //   
22                 case 38:
23                     this.selectedIndex --;
24 
25                     if (this.selectedIndex < min) {
26                         this.selectedIndex = max;
27                     } 
28 
29                     elems.removeClass('active').eq(this.selectedIndex).addClass('active'); 
30                     break;
31                     //    
32                 case 40:
33                     this.selectedIndex ++;
34 
35                     if (this.selectedIndex > max) {
36                         this.selectedIndex = min;
37                     }
38 
39                     elems.removeClass('active').eq(this.selectedIndex).addClass('active'); 
40                     break;
41                 default:
42                     break;
43             }       
44         }

doSelectメソッドユーザはユーザのキーボード操作を処理し,Up Down Enter Escこれらのキー処理を行う.
 1 show: function() {
 2             if (this.$suggest) {
 3                 this.$suggest.show(); 
 4             }
 5         }
 6 
 7 hide: function() {
 8             if (this.$suggest) {
 9                 this.$suggest.hide(); 
10             }
11         }

showとhideの方法は簡単な最もsuggestで表示と非表示の操作を行います
実現は簡単でしょう.ソースコードは300行を超えません.不合理や不備がある場合は指摘を歓迎します.
最後にdemoアドレスとソースコードを添付します




jQueryプラグインemail suggest-demo










$('.email').emailSug({
sugClass: 'ema-sug',
domains: [
'sohu.com',
'sogou.com',
'163.com',
'126.com',
'139.com',
'sina.com',
'qq.com',
'gmail.com'
]
});