私はここで立ち往生しています、どんなヒントでもいいでしょう。
Objects オブジェクト [] の配列と divnames [] の配列があります。私のオブジェクトには、play() や stop() などの関数があります。オブジェクトとその機能は複数の状況でテストされ、機能しています。今、私はdivnames []を繰り返し、適切なオブジェクト[]のアクションをマウスオーバー、マウスアウト、クリックに割り当てようとしています。
StackOverflow の別のスレッドで見つけた解決策で修正した閉鎖の問題がありました。それはうまくいきます。しかし、残っている問題は、後でロードされる div にマウスオーバーなどのアクションが割り当てられないことです。彼らは最初からページにあるオブジェクトに取り組んでいます。
ここに私が持っているものがあります:
$(function(){
for (var i=0, len=divnames.length; i<len; i++) {
if(divnames[i]){
(function( ) { // anonymous function to fix closures
var index = i; // also needed to fix closures
$('#'+divnames[index]).on("click", function() {
objects[index].play();
loadContent(divnames[index]+".php");
});
})( ); // direct function execution to fix closures
}
}
});
上記のように、クロージャーの問題は 2 つのコメント行によって修正されます。それらを除外すると、for ループの最後の実行のみが適用されます。今のように、それはうまくいきます。
しかし、機能しないのは、セレクターに一致するdivにもクリック機能を適用する必要があるが、まだロードされていないことです。
しかし、同じ機能を持つコードが for ループ内でクロージャー修正なしで反復されない場合、それは機能します。これは、正しく理解すれば .on() の動作が予想されるためです。
では、両方の必要な機能を機能させるにはどうすればよいですか?
お時間をいただきありがとうございます。
- - 編集 - -
要求された追加情報:
var divnames = [];
divnames[0] = "home";
divnames[1] = "about";
divnames[2] = "projects";
function SpriteAnim (options) {
var timerId = 0;
var i = 0;
this.status = 0;
this.init = function () {
var element = document.getElementById(options.elementId);
element.style.width = options.width + "px";
element.style.height = options.height + "px";
element.style.backgroundRepeat = "no-repeat";
element.style.backgroundImage = "url(" + options.sprite + ")";
};
this.showFrame = function (which) {
if (which < options.frames) {
i = which;
element = document.getElementById(options.elementId);
element.style.backgroundPosition = "0px -" + which * options.height + "px";
}
};
this.play = function () {
this.status = 2;
timerId = setInterval(function () {
if (i < (options.frames - 1)) {
i++;
element = document.getElementById(options.elementId);
element.style.backgroundPosition = "0px -" + i * options.height + "px";
} else {
clearInterval(timerId);
this.status = 1;
}
}, 100);
};
}
すでにお察しのとおり、objects[] 配列には、objects[0]、objects[1]、objects[2] に 3 つの SpriteAnim オブジェクトが含まれています。
objects[0] = new SpriteAnim({
width: 7,
height: 7,
frames: 8,
sprite: "myanim1.png",
elementId: "anim0"
});
objects[1] = new SpriteAnim({
width: 7,
height: 7,
frames: 8,
sprite: "myanim1.png",
elementId: "anim1"
});
objects[2] = new SpriteAnim({
width: 7,
height: 7,
frames: 8,
sprite: "myanim2.png",
elementId: "anim2"
});