4

私はdiv "maindiv"を持っています。これにはさらに、「imagediv」を含む div が含まれています。jQuery では、次のように記述します。

$(document).ready(function() {

    ......

    var copydiv = $('#maindiv').clone();
    var number = 1;
    $("body").delegate("#imagediv", "mousedown", function(event) {

        $("#maindiv").attr('id', "changedmain" + number);
        $("#imagediv").attr('id', "changedimage" + number);
        copydiv.insertAfter("#appendafter");
        number = number + 1;
    });
});​

HTML:

<div id="appendafter"></div>
<div id="maindiv">
.
.
.
</div>

このコードでは、copydiv が追加された後に初めて、追加されたクローンの id が「maindiv」になり、すべての内部 div の ID が正しくなります。ただし、number が 2 の場合、クローンには maindiv ではなく「changemain2」が含まれます。どうしてこれなの??何か対策は???

4

3 に答える 3

4

まず、ID は DOM 内で一意である必要があります。この場合、複数のセットを追加する場合は、クラス セレクターに切り替えます。

次に、変数numberはローカルで再定義され1、毎回にリセットされますmousedown

var copydiv = $('.maindiv').clone();  
var number = 1; // This was redefined and set as 1 on every `mousedown` 
                // So make it global

$("body").delegate(".imagediv","mousedown",function(event){       
    $(".maindiv").attr('class',"changedmain" + number);
    $(".imagediv").attr('class',"changedimage" + number );
    copydiv.insertAfter("#appendafter"); // You might have to change this too 
                                         // depending if this is repeated too
    number = number+1;
}

また、.on()関数を使用して委任することをお勧めします

$("body").on("mousedown", ".imagediv", function(event){       
    $(".maindiv").attr('class',"changedmain" + number);
    $(".imagediv").attr('class',"changedimage" + number );
    copydiv.insertAfter("#appendafter"); // You might have to change this too 
                                         // depending if this is repeated too
    number = number+1;
}

解決:

問題は、使用された方法にありました。を使用して複製された要素.clone()は参照を保持するため、新しい要素を追加する代わりに、以前に参照されたオブジェクトを更新し続けます。

解決策は次のとおりです。

var number = 1; //Our Counter Script

function createDiv() {
    //Lets create a new div, 
             // I mean WHY CLONE AT the first place?? 
             // We are delegating events anyway :p

    $("<div />", {
        html : $('#maindiv').html(), // add the HTML of div we are trying to keep
             // ^ Better used cached 
             //   version is not updated regularly

        id : "maindiv-"+number       // add the generate id number 
    }).insertAfter("#appendafter");  // Now insert it
    number++;
}

$("body").on("mousedown", ".imagediv", function(event){
    createDiv(); //Delegating on all elements with `imagediv` class
});

デモ

于 2012-11-06T10:10:23.747 に答える
1

わかりました.......まあ、親愛なる関数 clone() は基本的に参照を維持します。私は単にステートメントを配置しました

var copydiv = $('#maindiv').clone();

デリゲートステートメント内:

  $("body").delegate("#imagediv", "mousedown", function(event) {

今どのように機能しているのか..わかりません...しかし、締め切りが厳しいときは...あまり考えることはありません...ンジョイ!

于 2012-11-06T12:13:52.010 に答える
1

問題は変数番号にあり、外部で宣言する必要があります

于 2012-11-06T10:12:35.927 に答える