jQuery - 链接自定义函数

时间:2016-06-23 13:10:33

标签: javascript jquery method-chaining

我想知道如何链接我的自定义函数并维护'this'的上下文。

示例:

$.fn.foo = function() {
  var html = '<div class="foo"></div>';
  if ($(this).hasClass(somthing) {
    $(this).prepend(html);
  }
}

$.fn.bar = function() {
  var html = '<h3>bar</h3>';
  $(this).find('.foo').prepend(html);
}

$('body').foo().bar();

当我尝试使用此代码时,我得到 TypeError:无法读取未定义的属性'bar'

3 个答案:

答案 0 :(得分:9)

您需要返回当前元素上下文,即自定义方法中的this

&#13;
&#13;
$.fn.foo = function() {
  var html = '<div class="foo"></div>';
  if ($(this).hasClass('somthing')) {
    $(this).prepend(html);
  }
  return this; //The magic statement
}

$.fn.bar = function() {
  var html = '<h3>bar</h3>';
  $(this).find('.foo').prepend(html);
  return this; //The magic statement
}

$('body').addClass('somthing').foo().bar();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:4)

返回this

$.fn.foo = function() {
    var html = '<div class="foo"></div>';
    if ($(this).hasClass(somthing) {
        $(this).prepend(html);
    }
    return this;
};

$.fn.bar = function() {
    var html = '<h3>bar</h3>';
    $(this).find('.foo').prepend(html);
    return this;
};

$('body').foo().bar();

答案 2 :(得分:1)

您可能正在寻找jQuery extend 功能。它使您可以创建逗号分隔的函数列表,以供在链式表达式中使用

jQuery.fn.extend({
  check: function() {return this.each(function() { this.checked = true; });} ,  
  uncheck: function() {return this.each(function() { this.checked = false;  });
  }})

用法:这会选中所有复选框:

$( "input[type='checkbox']" ).check();

(示例摘自https://api.jquery.com/jquery.fn.extend/