/blog/_posts/2011-10-26-creating-application-specific-jquery-plugins.md

https://github.com/GunioRobot/wenbing.github.com · Markdown · 105 lines · 83 code · 22 blank · 0 comment · 0 complexity · 70e0065e717738bdc37147a42666fd42 MD5 · raw file

  1. ---
  2. layout: blog-post
  3. title: 创建应用程序相关的 jQuery 扩展
  4. excerpt: ... 当你写的代码与你的应用紧密关联且想以链式方式执行时是不是要作为一个 jQuery 扩展来写就不是那么清楚了
  5. tags: [javascript, jQuery, jQuery plugins]
  6. ---
  7. 使用 jQuery 创建应用时经常会写些能够直接以 jQuery 对象链式执行的代码
  8. 当你的代码解决的问题与你的应用没有依赖性时就应该写成一个 jQuery 扩展
  9. 然而当你写的代码与你的应用紧密关联且想以链式方式执行时是不是要作为一个 jQuery 扩展
  10. 来写就不是那么清楚了
  11. 一种创建应用相关的扩展的模式是给你的方法添加前缀以避免命名冲突
  12. 例如假如我们有很多 widget 共用相同的标签结构如果我们想能够从任何包含此 widget 的元素
  13. 定位到此 widget 元素就要创建一个 nmkWidget 的方法
  14. 假设此 widget 有下面的结构
  15. {% highlight html %}
  16. <div class="nmk-widget">
  17. <div class="nmk-widget-header">
  18. <!-- widget-specific header -->
  19. </div>
  20. <div class="nmk-widget-content">
  21. <!-- widget-specific content -->
  22. </div>
  23. </div>
  24. {% endhighlight %}
  25. 我们可以定义一些能够定位此 widget 的函数
  26. {% highlight javascript %}
  27. $.fn.nmkWidget = function() {
  28. return this.closest('.nmk-widget');
  29. };
  30. $.fn.nmkWidgetHeader = function() {
  31. return this.nmkWidget.children('.nmk-widget-header');
  32. };
  33. $.fn.nmkWidgetContent = function() {
  34. return this.nmkWidget.children('.nmk-widget-content');
  35. };
  36. {% endhighlight %}
  37. 这些可以在没有依赖或没有超出 DOM 的状态管理的简单扩展中使用
  38. 如果你想要一个模块内部相关的功能呢 jQuery 不支持对 jQuery.fn 使用命名空间
  39. 不过有一个简单的模式可以用上
  40. 我们可以定义一个方法作为 jQuery 到其它对象的传递
  41. {% highlight javascript %}
  42. var slice = Array.prototype.slice;
  43. $.fn.exec = function(method) {
  44. return method.apply(this, slice.call(arguments, 1));
  45. };
  46. {% endhighlight %}
  47. 然后就可以创建对象嵌套多少层都可以就像标准 jQuery 方法一样定义在里面定义方法
  48. {% highlight javascript %}
  49. var nmk = {
  50. widget: {
  51. open: function(duration) {
  52. return this.nmkWidget().slideDown(duration);
  53. },
  54. close: function(duration) {
  55. return this.nmkWidget().slideUp(duration);
  56. }
  57. }
  58. };
  59. {% endhighlight %}
  60. 通过 .exec() 方法在 jQuery 链中执行
  61. {% highlight javascript %}
  62. $(elem).exec(nmk.widget.close);
  63. {% endhighlight %}
  64. 还可以向其中传递参数
  65. {% highlight javascript %}
  66. $(elem).exec(nmk.widget.close, 1000);
  67. {% endhighlight %}
  68. 现在我们有了可重用模块化支持命名空间的支持 jQuery 链式操作的代码
  69. 可以使用这个方法定义多种关闭 widget 的方法而不会逻辑重复也不用担心处于的 DOM 结构了
  70. {% highlight javascript %}
  71. $('.nmk-widget-close-button').live('click', function() {
  72. $(this).exec(nmk.widget.close);
  73. });
  74. $('#add-widget').click(function() {
  75. var widget = nmk.widget.create();
  76. $('<p>Your new widget has been added. Click here to undo</p>')
  77. .click(function() {
  78. widget.exec(nmk.widget.close);
  79. });
  80. });
  81. {% endhighlight %}
  82. [原文][source]
  83. [source]:http://blog.nemikor.com/2010/08/16/creating-application-specific-jquery-plugins/