Хочу сделать что-то вроде фильтра, однако не с сортировкой блоков, а именно вставкой данных из массива. То есть, изначально блок .result
пустой. Скрипт видит активную ссылку и размещает данные сравнивая CatID
из массива и data-cat
из ссылки. При клике на ссылку, данные плавно исчезают и запрашиваются новые. Накидал минимальный код:
var result=[
//['CatID','Name','Price','URL']
['1','Данные 1','123','http://sitetest.com/page1.html'],
['2','Данные 2','533','http://sitetest.com/page2.html']
['1','Данные 3','123','http://sitetest.com/page3.html'],
['1','Данные 4','533','http://sitetest.com/page4.html']
['1','Данные 5','123','http://sitetest.com/page5.html'],
['2','Данные 6','533','http://sitetest.com/page6.html']
];
<div class="filter">
<a href="javascript:void(0)" class="active" data-cat="1">Вариант 1</a>
<a href="javascript:void(0)" class="" data-cat="2">Вариант 2</a>
</div>
<div class="result"></div>
На выходе код элементов внутри .result
может быть любым. Например:
<a href="http://sitetest.com/page1.html">Данные 1 за $123</a>
Целиком писать все не обязательно, только чтоб понять сам принцип. Или хотя бы киньте ссылки на нужные функции для реализации. Заранее спасибо.
Всё просто:
Ищем .active
и выполняем функцию сортировки.
Клик по другой категории делает так же, только с другим ID.
Сама сортировка проще - фильтруем по ID, преобразуем данные в нужный шаблон и выводим его.
Я чуть упоролся, но, думаю, понятно:
var result = [
//['CatID','Name','Price','URL']
['1', 'Данные 1', '123', 'http://sitetest.com/page1.html'],
['2', 'Данные 2', '533', 'http://sitetest.com/page2.html'],
['1', 'Данные 3', '123', 'http://sitetest.com/page3.html'],
['1', 'Данные 4', '533', 'http://sitetest.com/page4.html'],
['1', 'Данные 5', '123', 'http://sitetest.com/page5.html'],
['2', 'Данные 6', '533', 'http://sitetest.com/page6.html']
];
document.querySelector('.filter').addEventListener('click', e => e.target.nodeName === 'A' ? (el = e.target, cat = el.dataset.cat, document.querySelector('.result').innerHTML = result.filter(i => cat === i[0]).map(e => `<a href="{3}">{1} за \${2}</a>`.replace(/{(\d)}/g, (_, id) => id in e ? e[id] : `{${id}}`)).join('<br />')) : null);
document.querySelector('.active').click();
<div class="filter">
<a href="javascript:void(0)" class="active" data-cat="1">Вариант 1</a>
<a href="javascript:void(0)" class="" data-cat="2">Вариант 2</a>
</div>
<div class="result"></div>
UPD:
Писать как выше - грех, за который надо бы хворостиной отходить создавшего.
Я просто не удержался :)
Вот пример на jQuery
(просто замена стандартных функций на библиотечные; жуть, но раз народ просит...) с пояснениями:
var result = [
//['CatID','Name','Price','URL']
['1', 'Данные 1', '123', 'http://sitetest.com/page1.html'],
['2', 'Данные 2', '533', 'http://sitetest.com/page2.html'],
['1', 'Данные 3', '123', 'http://sitetest.com/page3.html'],
['1', 'Данные 4', '533', 'http://sitetest.com/page4.html'],
['1', 'Данные 5', '123', 'http://sitetest.com/page5.html'],
['2', 'Данные 6', '533', 'http://sitetest.com/page6.html']
];
$('.filter').on('click', 'a', function () {
let cat = $(this).data('cat'); // Выбираем искомую категорию (int)
let html = result
.filter(i => cat === i[0]) // Оставляем только те массивы, у которых первый элемент равен искомой категории
.map(e => `<a href="{3}">{1} за \${2}</a>`.replace(/{(\d)}/g, (_, id) => id in e ? e[id] : `{${id}}`)) // Преобразуем каждый объект в строку, где заменим каждый willcard в шаблоне на реальное значение ({0} - первый элемент, {1} - второй элемент и т. д.)
.join('<br />'); // Склеиваем в строку через тэг переноса
$('.result').html(html); // Заменяем прошлый .result новыми данными
$('.active').click(); // После того, как навесили обработчик, эмулируем клик по активной ссылке, чтобы сразу загрузить активную категорию
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="filter">
<a href="javascript:void(0)" class="active" data-cat="1">Вариант 1</a>
<a href="javascript:void(0)" class="" data-cat="2">Вариант 2</a>
</div>
<div class="result"></div>
Вариант на jQuery со сменой .active
var result=[
//['CatID','Name','Price','URL']
['1','Данные 1','123','http://sitetest.com/page1.html'],
['2','Данные 2','533','http://sitetest.com/page2.html'],
['1','Данные 3','123','http://sitetest.com/page3.html'],
['1','Данные 4','533','http://sitetest.com/page4.html'],
['1','Данные 5','123','http://sitetest.com/page5.html'],
['2','Данные 6','533','http://sitetest.com/page6.html']
],
output=$('.result');
$('.filter').on('click','a',function() {
btn=$(this);
$('.filter a').removeClass('active');
btn.addClass('active');
output.empty();
for (i = 0; i < result.length; i++) {
if (result[i][0]===btn.attr('data-cat')) {
output.append('<div><a href="'+result[i][3]+'">'+result[i][1]+' за $'+result[i][2]+'</a></div>');
}
}
})
$('.active').trigger('click');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="filter">
<a href="javascript:void(0)" class="active" data-cat="1">Вариант 1</a>
<a href="javascript:void(0)" data-cat="2">Вариант 2</a>
</div>
<div class="result"></div>
Первый вариант без jQuery и без класса active
var result=[
//['CatID','Name','Price','URL']
['1','Данные 1','123','http://sitetest.com/page1.html'],
['2','Данные 2','533','http://sitetest.com/page2.html'],
['1','Данные 3','123','http://sitetest.com/page3.html'],
['1','Данные 4','533','http://sitetest.com/page4.html'],
['1','Данные 5','123','http://sitetest.com/page5.html'],
['2','Данные 6','533','http://sitetest.com/page6.html']
];
var filters = document.getElementsByClassName("filters");
var output = document.getElementsByClassName('result');
function filterIt() {
var catId = this.getAttribute("data-cat");
output[0].innerHTML='';
for (i = 0; i < result.length; i++) {
if (result[i][0]===catId) {
var d = document.createElement("div");
d.innerHTML='<a href="'+result[i][3]+'">'+result[i][1]+' за $'+result[i][2]+'</a>';
output[0].appendChild(d);
}
}
};
for (var i = 0; i < filters.length; i++) {
filters[i].addEventListener('click', filterIt, false);
}
<div class="filter">
<a href="javascript:void(0)" class="filters active" data-cat="1">Вариант 1</a>
<a href="javascript:void(0)" class="filters" data-cat="2">Вариант 2</a>
</div>
<div class="result"></div>
I have situation where I need to create file uploading using Cloudinary I need to disabled file resizeing and set custom height and weight
Столкнулся со следующей проблемой при работе с Google visualization
Как можно из-под Linux (debian) управлять вводом-выводом через LPT порт используя NodeJS?