Поскольку вы используете jQuery, используйте его в полной мере и создайте все элементы, используя соответствующие методы jQuery. Это имеет дополнительное преимущество в том, что вы избегаете потенциальных проблем с экранированием символов и избегаете случайных ошибок при открытии / закрытии тегов.
Итак, вот как ваш код может быть преобразован в стиль, более jQuery. Тогда также легко позвонить .data
в подходящее место:
$('.loader').show();
$.get(api).done(function (data) {
$('#' + menu + '-tab > .card-columns').append(
data.map(d => d.codplu == "COPERTI" || d.desc == "" ? ""
: $("<div>", {
"class": "card card-product",
"data-toggle": "modal",
"data-target": "#modalProduct",
"data-plu": d.id
}).append($("<img>", {
"class": "img-fluid" + (d.img ? "" : " d-none"),
src: d.img ? "data:image/png;base64," + d.img : "",
}),
$("<div>").addClass("card-body").append(
$("<div>").addClass("row").append(
$("<div>").addClass("col").append(
$("<h5>").addClass("card-title mb-0").text(d.desc)
),
$("<div>").addClass("col-auto").append(
$("<h5>").addClass("text-right text-success price").text(formatPrezzo(d.prezzo))
)
),
$("<p>").addClass("card-tag mb-0").append(
d.attributi.map(attr =>
$("<span>").addClass("badge badge-success mr-1").css({
backgroundColor: toColor(attr.background),
color: toColor(attr.text)
}).text(attr.desc)
)
),
$("<p>").addClass("card-text text-muted").text(d.estesa),
profilo.moduli.ordine_menu && profilo.tavolo != "0"
? $("<a>", {
href: "#",
"class": "btn btn-outline-primary btn-block add-cart cd-add-to-cart js-cd-add-to-cart",
"data-price": d.prezzo.toFixed(2)
}).text(AddToCartText()).data(d.varianti)
: ""
)
)
)
)
$('.loader').fadeOut("slow");
});