Как оптимальнее решить подобную задачу? Недавно возникла необходимость вместо пустой цены выводить "Цена по запросу" в каталоге товаров на основе 1С-Битрикс Aspro.Max и сделать это совсем не редактируя шаблон.
Использовал кастомный JavaScript в настройках [Аспро: Максимум] в админ панели CMS Битрикс сайта [ Редактирование включаемой области: /bitrix/templates/aspro_max/js/custom.js ].
Повесил наблюдатель за DOM объектами через встроенный javascript объект MutationObserver( https://learn.javascript.ru/mutation-observer ) для товаров которые подгружаются через AJAX по кнопке 'Показать больше товаров' и инициировав проверку на первоночально загруженные товарные позиции при открытии страницы.
Так же это работает и в детальной карточке товара магазина 1C-Bitrix с шаблоном от "Aspro Максимум".
Код:
var targetInit = document.querySelectorAll('.item_info');
for (var i = 0; i < targetInit.length; i++) {
priceM=targetInit[i].getElementsByClassName('cost prices clearfix')[0];
regex = /^\s+$/g;
if((priceM.innerText=='')||(priceM.innerText.match(regex))){
priceM.innerHTML += "Цена по запросу";
}
}
var target = document.querySelectorAll(".inner_wrapper");
for (var i = 0; i < target.length; i++) {
// create an observer instance
var observer = new MutationObserver(function(mutations) {
//console.log("mutation1");
mutations.forEach(function(mutation) {
for(let node of mutation.addedNodes) {
if (!(node instanceof HTMLElement)) continue;
for(let elem of node.querySelectorAll('.item_info')) {
priceM=node.getElementsByClassName('cost prices clearfix')[0];
regex = /^\s+$/g;
if((priceM.innerText=='')||(priceM.innerText.match(regex))){
priceM.innerHTML += "Цена по запросу";
}
}
}
});
});
var config = { childList: true, subtree: true };
observer.observe(target[i], config);
}
if(document.getElementsByClassName('cost prices detail')[0] != undefined){
if(document.getElementsByClassName('cost prices detail')[0].innerText==''){
document.getElementsByClassName('cost prices detail')[0].innerHTML += "Цена по запросу";
}
}