我试图创建一个小的jQuery插件,使元素可折叠或展开。
基本上,插件要求dom元素具有标题和内容:
<div class="foldable">
<div class="foldable-title">Title</div>
<div class="foldable-content">Content</div>
</div>
当用户点击标题时,它应显示或隐藏内容。即使嵌套的可折叠元素在DOM
中,这也应该有效我的插件按预期工作,当我点击标题时,它按预期运行。
但是,我希望能够添加&#34;方法&#34;到我的插件,但它不起作用。
我在控制台中没有错误,只是没有发生任何错误。
这是我的一种方法:
foldall: function () {
$(this).each(function () {
$(this).find(".foldable-unfolded").addClass("foldable-folded").removeClass("foldable-unfolded");
});
return this;
}
我想我的问题来自this
对象。我不确定它的价值是否是预期值。它使用以下模式提供:
$.fn.foldable = function (methodOrOptions) {
if (methods[methodOrOptions]) {
return methods[methodOrOptions].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
// Default to "init"
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + methodOrOptions + ' does not exist on jQuery.foldable');
}
};
有任何线索如何解决我的问题?
仅供参考,jsFiddle is available with my current work。
以下是完整代码:
(function ($) {
var methods = {
init: function (options) {
var opts = $.extend({}, $.fn.foldable.defaults, options);
this.each(function () {
var $this = $(this);
var $title = $this.find(opts.title).first();
var $content = $this.find(opts.content).first();
$this.data("foldable", opts);
$title.css("cursor", "pointer");
if (!$this.hasClass(opts.foldedClass) && !$this.hasClass(opts.unfoldedClass)) {
$this.addClass(opts.unfoldedClass);
//$content.hide();
}
$title.click(function () {
$content.slideToggle(function () {
$this.toggleClass(opts.unfoldedClass).toggleClass(opts.foldedClass);
if (opts.complete) opts.complete();
});
});
});
return this;
},
foldall: function () {
$(this).each(function () {
$(this).find(".foldable-unfolded").andSelf().addClass("foldable-folded").removeClass("foldable-unfolded");
});
return this;
},
unfoldall: function () {
$(this).each(function () {
$(this).find(".foldable-folded").andSelf().addClass("foldable-unfolded").removeClass("foldable-folded");
});
return this;
}
};
$.fn.foldable = function (methodOrOptions) {
if (methods[methodOrOptions]) {
return methods[methodOrOptions].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
// Default to "init"
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + methodOrOptions + ' does not exist on jQuery.foldable');
}
};
$.fn.foldable.defaults = {
title: ".foldable-title",
content: ".foldable-content",
foldedClass: "foldable-folded",
unfoldedClass: "foldable-unfolded",
complete: null
};
var foldable = $(".foldable").foldable();
$(".foldall").click(function () {
foldable.foldable("foldall");
});
$(".unfoldall").click(function () {
foldable.foldable("unfoldall");
});
})(jQuery);
很少有css规则:
.folded > .content {
display:none;
}
.unfolded > .content {
display:inherit;
}
答案 0 :(得分:0)
有时简单的事情不那么明显。
我的问题是css规则中的类型,特别是类名。应该是:
.foldable-folded > .foldable-content {
display:none;
}
.foldable-unfolded > .foldable-content {
display:inherit;
}