私は一般的なOOPの概念にかなり慣れていないので、クライアント用にこのミニアプリケーションを構築しようとしています。モジュール番号などに基づいて構成可能なオプションがあるはずです。関連するものを保持するためにいくつかのコードを切り取りました。特に、これを可能な限りカスタマイズできるようにしようとしています。これにより、コーダーは、以下のオプション配列に追加することで、複数のライトボックススタイルのポップアップをサポートできるようになります。
これまではすべてうまくいきました。私の問題は、配列内の各オブジェクトを、構成を介して直接セレクターに文字列としてoptions.popups
フィードすることにより、jQueryでバインドしようとしていることです。selector
$()
これclick()
はオープナーへのバインドには問題なく機能しますが、selector
プロパティはバインドされません。毎回、次のエラーが発生します。TypeError: self.options.popups[i] is undefined.
たとえば$(".helpPopup").show();
、セレクターを直接挿入すると、正常に機能します。click()
そのすぐ上の関数内の変数で定義すると、機能します。例えばvar s = ".helpPopup";
私がここで見逃している明らかなことはありますか?これは私を狂わせています。また、私のコードのデザインパターンはこれに直接基づいています:https ://github.com/shichuan/javascript-patterns/blob/master/jquery-plugin-patterns/prototypal-inheritance.html
ありがとう!
var MODULE = {
init: function(options, elem) {
// Stuff here
this.bindPopups();
},
options: {
title: "Module title",
pages: 1,
currentPage: 1,
windowOpener: ".popupVar",
popups: [
{
name: "help",
selector: ".helpPopup",
opener: ".button.open",
closer: ".button.close",
type: 3
}
]
},
bindPopups: function() {
var self = this;
for(i = 0; i < this.options.popups.length; i++) {
// Open the popup
$(self.options.popups[i].opener).click(function(e) {
e.preventDefault();
$(self.options.popups[i].selector).show();
});
// Close the popup
$(self.options.popups[i].closer).click(function(e) {
e.preventDefault();
$(self.options.popups[i].selector).hide();
});
}
}
};
// If browser doesn't support Object.create
if(typeof Object.create !== "function") {
Object.create = function(o) {
function F() {
F.prototype = o;
return new F();
}
};
}
// Create plugin
$.plugin = function(name, object) {
$.fn[name] = function(options) {
return this.each(function() {
if(!$.data(this, name)) {
$.data(this, name, Object.create(object).init(options, this));
}
});
};
};
$.plugin("module", MODULE);
/* PAGE CODE */
<script>
$(function() {
$("body").module({
title: "Module 1",
pages: 12,
popups: [
{
name: "help",
selector: ".helpPopup",
opener: ".button.open",
closer: ".button.close",
type: 3
},
{
name: "info",
selector: ".infoPopup",
opener: ".button.info",
closer: ".button.close",
type: 1
}
]
});
});
</script>