2016-11-10 2 views
0

Ich implementiere eine Append-Operation mit $.each - Methode. Das Ergebnis ist lustig (doppelt so viel Zeit für Elemente!). Ich habe möglicherweise eine Problemumgehung, um dies zu beheben.Was ist dieses Problem, und wie kann man auf jQuery's eigene Weise verhindern?

Aber ich möchte das eigentliche Problem hier verstehen, gibt es auch eine Möglichkeit, dies zu beheben mit jQuery eigenen Weg?

Vielen Dank im Voraus.

var data = ["orange", "apple"]; 
 
var temp = function() { 
 
    var template = '<dl class="dropdown"><dt> <div class ="dropdownclass" ><span class="hida">Select</span> <span class="multiSel"></span> </div></dt><dd><div class="mutliSelect"><ul><li><input type="checkbox" value="Control" />Control Node</li><li><input type="checkbox" value="Border" />Border Node</li</ul></div></dd></dl>'; 
 
    return $(template).clone(); 
 
} 
 
$(document).ready(function() { 
 
    var tr; 
 
    var ut 
 
    $.each(data, function(i, value) { 
 
    tr = $('<tr />', { 
 
     id: i + 'id' 
 
    }); 
 
    ut = temp(); 
 
    ut.addClass('hema' + i).click(function() { 
 
     alert($(this).prop('class')); 
 
    }); 
 
    tr.append(ut); 
 
    tr.appendTo('tbody'); //getting multple instance!!! 
 
    }) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table> 
 
    <tr> 
 
    <th>title</th> 
 
    </tr> 
 
    <tbody> 
 

 
    </tbody> 
 
</table>

+1

Werfen Sie einen Blick auf Ihre Elemente in dev Werkzeuge, haben Sie zwei '' Elemente, weil einige Browser automatisch falsche HTML beheben, dh ein '' direkt in einem '

' ist unpassend, es muss in einem sein '' (oder thead/tfoot) so macht es eine extra, und Ihre 'appendTo' hängt an jeden tbody –

+0

, wenn ich Konsole, ich bekomme genau 1 Wert auf jedes Mal – user2024080

+0

, wenn Sie eine tr haben, sollte es entweder innen sein tbody oder thead, wenn es nicht browser wird es automatisch in einen tbody wickeln, so wird es zwei tbodies in der tabelle und wenn sie appendTo an sie wird zweimal angehängt werden. – Manish

Antwort

5

Das Problem ist einfach, weil Ihre HTML ungültig ist. Ihr tbody muss alletr Elemente umfassen. Da Sie eine tr außerhalb der tbody der HTML-Renderer hatte eine zweite tbody um das - Sie können dies sehen, wenn Sie Ihr Original-Snippet in einem DOM-Inspektor überprüfen. Wenn Sie also an tbody angehängt haben, wurde der Inhalt für beide Elemente dupliziert.

Wenn Sie Ihre HTML zu beheben, geht das Problem weg:

var data = ["orange", "apple"]; 
 
var temp = function() { 
 
    var template = '<dl class="dropdown"><dt><div class ="dropdownclass" ><span class="hida">Select</span> <span class="multiSel"></span> </div></dt><dd><div class="mutliSelect"><ul><li><input type="checkbox" value="Control" />Control Node</li><li><input type="checkbox" value="Border" />Border Node</li</ul></div></dd></dl>'; 
 
    return $(template); 
 
} 
 

 
$(document).ready(function() { 
 
    $.each(data, function(i, value) { 
 
    var $tr = $('<tr />', { 
 
     id: i + 'id' 
 
    }); 
 
    var $ut = temp().addClass('hema' + i); 
 
    $tr.append($ut).appendTo('tbody'); 
 
    }) 
 

 
    $('tbody').on('click', '.dropdown', function() { 
 
    alert($(this).prop('class')); 
 
    }); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table> 
 
    <tbody> 
 
    <!-- note tbody here --> 
 
    <tr> 
 
     <th>title</th> 
 
    </tr> 
 
    </tbody> 
 
</table>

Bitte beachte, dass ich auch ein paar Änderungen an Ihrer JS Logik gemacht; Es gibt keine Notwendigkeit für die clone(), da Sie sowieso ein neues Element erstellen, die var-Deklarationen lokal in der each-Schleife machen und einen einzelnen delegierten Event-Handler verwenden, anstatt einen an jedes Element in der Schleife anzuhängen.

Verwandte Themen