说明

这是一个联系人名过滤组件,还提供可选的“大小写是否敏感”选项,默认大小写不敏感

一、HTML 结构

  1. <ul class="contacts">
  2. <li class="h-card">
  3. <a href="http://jakearchibald.com" class="p-name u-url">Jake Archibald</a>
  4. (<a href="mailto:jake@example.com" class="u-email">e-mail</a>)
  5. </li>
  6. <li class="h-card">
  7. <a href="http://christianheilmann.com" class="p-name u-url">Christian Heilmann</a>
  8. (<a href="mailto:christian@example.com" class="u-email">e-mail</a>)
  9. </li>
  10. <li class="h-card">
  11. <a href="http://ejohn.org" class="p-name u-url">John Resig</a>
  12. (<a href="mailto:john@example.com" class="u-email">e-mail</a>)
  13. </li>
  14. <li class="h-card">
  15. <a href="http://www.nczonline.net" class="p-name u-url">Nicholas Zakas</a>
  16. (<a href="mailto:nicholas@example.com" class="u-email">e-mail</a>)
  17. </li>
  18. </ul>

二、组件代码(依赖 jQuery)

  1. <script type="text/javascript" src="../js/vendor/jquery-3.1.1.min.js"></script>
  2. <script type="text/javascript">
  3. function startsWith(str, value, caseSensitive) {
  4. if(!caseSensitive) {
  5. str = str.toLowerCase();
  6. value = value.toLowerCase();
  7. }
  8. return str.indexOf(value) === 0;
  9. }
  10. // FilterWidget.js
  11. function FilterWidget(contactList) {
  12. var self = this;
  13. this.contacts = contactList;
  14. this.filterField = $('<input type="search" />').insertBefore(contactList);
  15. this.tipWords = $('<label>大小写敏感?</label>').insertBefore(contactList);
  16. this.caseSwitch = $('<input type="checkbox" />').insertBefore(contactList);
  17. this.caseSensitive = this.caseSwitch.prop("checked");
  18. this.filterField.on("keyup", function(ev) {
  19. var handler = self.onFilter;
  20. return handler.call(self, ev);
  21. });
  22. this.caseSwitch.on("change", function(ev) {
  23. var handler = self.onToggle;
  24. return handler.call(self, ev);
  25. });
  26. }
  27. FilterWidget.prototype.onFilter = function(ev) {
  28. var names = this.contacts.find("li .p-name");
  29. var input = ev.target.value.trim();
  30. var self = this;
  31. names.each(function(i, node) {
  32. var el = $(node);
  33. var name = el.text();
  34. var contact = el.closest(".h-card");
  35. var match = startsWith(name, input, self.caseSensitive);
  36. if(match) {
  37. contact.show();
  38. } else {
  39. contact.hide();
  40. }
  41. });
  42. }
  43. FilterWidget.prototype.onToggle = function(ev) {
  44. this.caseSensitive = this.caseSwitch.prop("checked");
  45. this.filterField.trigger("keyup");
  46. };
  47. </script>

三、使用组件

  1. new FilterWidget($('ul.contacts'));

(完)

JavaScript 组件编写的更多相关文章

  1. 浅析 JavaScript 组件编写

    之前因项目需要也编写过一些简单的JS组件,大多是基于JQuery库的,一直也没有过总结,导致再次写到的时候还去Google, 近日看到一个文章总结的挺好,拿过整理一下做个备忘. 此次同样是基于jque ...

  2. JavaScript手工编写滚动条组件

    0 前言 上周的一个练习,由于没来得及编写笔记,这里补充一下~ 虽然CSS3中提供了overflow:scroll; 来实现滚动条,但是这里可以使用原生JS来编写一个,以达到练习组件编写的效果. 练习 ...

  3. 试试用有限状态机的思路来定义javascript组件

    本文是一篇学习性的文章,学习利用有限状态机的思想来定义javascript组件的方法,欢迎阅读,后续计划会写几篇专门介绍自己利用有限状态机帮助自己编写组件的博客,证明这种思路对于编程实现的价值,目前正 ...

  4. Winjs – 微软开源技术发布的 JavaScript 组件集

    Winjs 是由微软开源技术的开发者推出的一组 JavaScript 组件,包括 ListView.ListView.Tooltip.DatePicker.Ratings 等等,帮助 Web 开发人员 ...

  5. javascript组件化(转)

    javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...

  6. javascript组件开发之基类继承实现

    上一篇文章大概的介绍了一下关于javascript组件的开发方式,这篇文章主要详细记一下基类的编写,这个基类主要是实现继承的功能 为什么要封装基类? 由于这次重构项目需要对各种组件进行封装,并且这些组 ...

  7. (转)javascript组件开发方式

    作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式. 下面我们来谈谈,在现有的知识体系下,如 ...

  8. [转] javascript组件开发方式

    作为一名前端工程师,写组件的能力至关重要.虽然JavaScript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式. 下面我们来谈谈,在现有的知识体系下,如 ...

  9. javascript 组件化(转载)

    这边只是很简陋的实现了类的继承机制.如果对类的实现有兴趣可以参考我另一篇文章javascript oo实现 我们看下使用方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

随机推荐

  1. Linux性能评测工具之一:gprof篇介绍

    转:http://blog.csdn.net/stanjiang2010/article/details/5655143 这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并 ...

  2. TortoiseGit不同分支合并代码2

    现在有主分支master和分支day2.现在要把day2上的变更合并到主分支master上! 1.首先切换到目标分支master上. 说明当前分支是master分支. 2.在master分支上查看提交 ...

  3. yield关键字用法与解析(C# 参考)

    yield 关键字向编译器指示它所在的方法是迭代器块. 编译器生成一个类来实现迭代器块中表示的行为. 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返 ...

  4. 学习动态性能表(4)--v$sqltext&v$sqlarea

    学习动态性能表 第四篇-(1)-V$SQLTEXT  2007.5.29 本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内. 注:V$SQLARE ...

  5. c&c++ datetime

    时间函数之间的关系 struct tm { int tm_sec; // 代表目前秒数,正常范围0-59,但允许至61秒: int tm_min; // 代表目前分数,范围为0-59. int tm_ ...

  6. myeclipse按.自动提示方法

    第一步:菜单Window->Preferences->Java->Editor->Content Assist->Enable auto activation 选项要打勾 ...

  7. 关于AutoCommit

    AutoCommit设置为true(大多数JDBCdrive的默认配置),则每次执行的SQL语句执行完成后都会落实到数据库中:如果想要在跨语句事务,则需要添加Begin Transiction,Com ...

  8. 完整的qt安装教程

    大家可能认为qt收费了 其实不是 大家直接点击 这个 Community 这里的下载 Download 然后呢 就跳转到这个界面 点击 Qt Offline Installer 就会跳到这个地方 滑下 ...

  9. UDP协议相关解释

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层 ...

  10. Redhat下 Apache, php, mysql的默认安装路径

    apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下 apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/a ...