Start
›
Hersteller
›
Pulsar
Pulsar
Pulsar is a US manufacturer that has offered smoking accessories and vaporizers for over 20 years. The brand sells devices under various names, including the Groove line.Vaporizer models include the APX V3 as a compact entry-level device, the RoK as an e-rig for concentrates, and the Groove Cara as a portable dry herb vaporizer.
Preisvergleich
Pulsar Preise, Shops und Filter werden erst bei Bedarf geladen. So bleibt der erste Seitenaufbau deutlich leichter.
×
Preisverlauf (30 Tage)
Preisverlauf wird aufgezeichnet. Schau in ein paar Tagen nochmal vorbei!
Pulsar Vaporizer im Überblick
Pulsar ist ein Vaporizer-Hersteller aus USA. Im Vapochecker Preisvergleich sind 8 Vaporizer und 87 Zubehörteile von Pulsar gelistet, erhältlich in 54 Shops. Die Preise reichen von 34,33 € bis 210,87 €. Das Sortiment umfasst 5 portable Geräte, Heizmethoden: Konduktion, Konvektion.
Pulsar kaufen
Pulsar Vaporizer sind bei 54 Shops erhältlich. Vergleiche Preise und Versandkosten, um das beste Angebot zu finden.
';
} else if (d.shops > 0) {
metaHtml = '';
}
var priceHtml = d.price
? '' + priceLabel + ' \u20AC' + d.price + '
'
: '';
card.innerHTML = '' + imgHtml + '
' + nameHtml + ' ' + metaHtml + priceHtml;
return card;
}
function renderAllDeferred() {
if (accRenderedIdx >= accDeferredData.length) return;
var frag = document.createDocumentFragment();
for (var i = accRenderedIdx; i < accDeferredData.length; i++) {
frag.appendChild(renderAccCard(accDeferredData[i]));
}
if (accSentinel && accSentinel.parentNode) {
accGrid.insertBefore(frag, accSentinel);
} else {
accGrid.appendChild(frag);
}
accRenderedIdx = accDeferredData.length;
if (accSentinel) accSentinel.remove();
var lmBtn = document.getElementById('vc-acc-load-more');
if (lmBtn) lmBtn.style.display = 'none';
}
// Load more button
var loadMoreBtn = document.getElementById('vc-acc-load-more');
if (loadMoreBtn && accDeferredData.length > 0) {
loadMoreBtn.addEventListener('click', function() {
renderAllDeferred();
generateAccTable();
filterAccessories();
});
}
// Build table rows from all grid cards (lazy, on first table toggle)
var accTableGenerated = false;
function generateAccTable() {
accTableGenerated = true;
var tbody = document.getElementById('vc-acc-tbody');
if (!tbody || !accPanel) return;
var cards = accPanel.querySelectorAll('.vc-accessory-card');
if (cards.length === 0) return;
var frag = document.createDocumentFragment();
cards.forEach(function(card) {
var tr = document.createElement('tr');
tr.dataset.type = card.dataset.type || '';
tr.dataset.name = (card.dataset.accName || '').toLowerCase();
tr.style.cursor = 'pointer';
var img = card.dataset.accImage || '';
var name = card.dataset.accName || '';
var typeLabel = card.dataset.accType || '';
var priceEl = card.querySelector('.vc-product-price');
var priceText = priceEl ? priceEl.textContent.replace(/^\s+|\s+$/g, '').replace(/^[a-zA-Z\u00e0-\u024f\s]+/, '').trim() : '-';
if (!priceText) priceText = '-';
var shopEl = card.querySelector('.vc-product-shops');
var shopCount = shopEl ? shopEl.textContent.replace(/[^0-9]/g, '') : '0';
var imgHtml = img ? ' ' : '';
tr.innerHTML = '' + imgHtml + ' ' + name.replace(/ ' +
'' + typeLabel.replace(/ ' +
'' + priceText + ' ' +
'' + shopCount + ' ';
frag.appendChild(tr);
});
tbody.innerHTML = '';
tbody.appendChild(frag);
}
// Accessories Search + Type Filter (Multi-Select Checkbox)
var accSearchInput = document.getElementById('vc-acc-search');
const filterToggle = document.getElementById('vc-filter-toggle');
const filterDropdown = document.getElementById('vc-filter-dropdown');
const filterCount = document.getElementById('vc-filter-count');
const accPanel = document.querySelector('[data-panel="accessories"]');
let selectedTypes = [];
function filterAccessories() {
if (!accPanel) return;
const searchTerm = (accSearchInput ? accSearchInput.value : '').toLowerCase().trim();
// If filtering, render all deferred cards first
if ((searchTerm || selectedTypes.length > 0) && accRenderedIdx < accDeferredData.length) {
renderAllDeferred();
generateAccTable();
}
const allSelected = selectedTypes.length === 0;
let visibleCount = 0;
// Filter grid cards
accPanel.querySelectorAll('.vc-accessory-card').forEach(card => {
const cardType = card.dataset.type || '';
const cardName = (card.dataset.name || '').toLowerCase();
const matchesType = allSelected || selectedTypes.includes(cardType);
const matchesSearch = !searchTerm || cardName.includes(searchTerm);
const isVisible = matchesType && matchesSearch;
card.style.display = isVisible ? '' : 'none';
if (isVisible) visibleCount++;
});
// Filter table rows
accPanel.querySelectorAll('.vc-acc-table tbody tr').forEach(row => {
const rowType = row.dataset.type || '';
const rowName = (row.dataset.name || '').toLowerCase();
const matchesType = allSelected || selectedTypes.includes(rowType);
const matchesSearch = !searchTerm || rowName.includes(searchTerm);
const isVisible = matchesType && matchesSearch;
row.classList.toggle('vc-filtered-out', !isVisible);
});
// Update count display
if (filterCount) {
filterCount.textContent = '(' + visibleCount + ')';
}
// Show/hide no results message
const noResults = accPanel.querySelector('.vc-acc-no-results');
if (noResults) {
noResults.style.display = visibleCount === 0 ? 'block' : 'none';
}
}
// Search input with debounce
if (accSearchInput) {
var accDebounceTimer;
accSearchInput.addEventListener('input', function() {
clearTimeout(accDebounceTimer);
accDebounceTimer = setTimeout(filterAccessories, 150);
});
}
// Trigger initial filter if search is pre-filled via ?q= parameter
if (accSearchInput && accSearchInput.value.trim()) {
filterAccessories();
}
// Filter dropdown toggle
if (filterToggle && filterDropdown) {
filterToggle.addEventListener('click', function(e) {
e.stopPropagation();
filterDropdown.classList.toggle('open');
filterToggle.classList.toggle('active');
});
// Close on outside click
document.addEventListener('click', function(e) {
if (!filterDropdown.contains(e.target) && e.target !== filterToggle) {
filterDropdown.classList.remove('open');
filterToggle.classList.remove('active');
}
});
// Checkbox handling
const allCheckbox = filterDropdown.querySelector('input[data-all]');
const typeCheckboxes = filterDropdown.querySelectorAll('input:not([data-all])');
if (allCheckbox) {
allCheckbox.addEventListener('change', function() {
if (this.checked) {
typeCheckboxes.forEach(cb => cb.checked = false);
selectedTypes = [];
var label = filterToggle.querySelector('.vc-filter-label');
if (label) label.textContent = 'Alle Typen';
}
filterAccessories();
});
}
if (typeCheckboxes && typeCheckboxes.length > 0) {
typeCheckboxes.forEach(cb => {
cb.addEventListener('change', function() {
// Update selected types
selectedTypes = Array.from(typeCheckboxes)
.filter(c => c.checked)
.map(c => c.value);
// Update "All" checkbox
if (allCheckbox) allCheckbox.checked = selectedTypes.length === 0;
// Update label
var label = filterToggle.querySelector('.vc-filter-label');
if (label) {
if (selectedTypes.length === 0) {
label.textContent = 'Alle Typen';
} else if (selectedTypes.length === 1) {
var spanText = this.parentElement.querySelector('span');
label.textContent = spanText ? spanText.textContent.split(' (')[0] : selectedTypes[0];
} else {
label.textContent = selectedTypes.length + ' Typen';
}
}
filterAccessories();
});
});
}
}
// Accessory Card Click → Modal with Price Chart
var goToShopText = "Zum Shop";
var apiBase = "https:\/\/vapochecker.com\/wp-json\/vapochecker\/v1\/accessory-history\/";
var modal = document.getElementById('vc-acc-modal');
var accChartInstance = null;
if (modal) {
var modalName = document.getElementById('vc-modal-name');
var modalImage = document.getElementById('vc-modal-image');
var modalType = document.getElementById('vc-modal-type');
var modalShops = document.getElementById('vc-modal-shops');
var chartWrap = document.getElementById('vc-modal-chart-wrap');
var chartEmpty = document.getElementById('vc-modal-chart-empty');
var chartCanvas = document.getElementById('vc-acc-chart');
var closeBtn = modal.querySelector('.vc-acc-modal-close');
function loadChartJs(cb) {
if (typeof Chart !== 'undefined') { cb(); return; }
if (window._vcChartLoading) {
var check = setInterval(function() { if (typeof Chart !== 'undefined') { clearInterval(check); cb(); } }, 50);
return;
}
window._vcChartLoading = true;
var s = document.createElement('script');
s.src = 'https://cdn.jsdelivr.net/npm/[email protected] /dist/chart.umd.min.js';
s.onload = cb;
document.head.appendChild(s);
}
function renderAccChart(data) {
if (accChartInstance) { accChartInstance.destroy(); accChartInstance = null; }
chartCanvas.style.display = '';
chartEmpty.style.display = 'none';
var dates = [...new Set(data.map(function(d) { return d.date; }))].sort();
if (dates.length < 2) {
chartCanvas.style.display = 'none';
chartEmpty.style.display = 'block';
return;
}
var shopData = {};
data.forEach(function(d) {
if (!shopData[d.shop]) shopData[d.shop] = {};
shopData[d.shop][d.date] = parseFloat(d.price);
});
var colors = ['#3b82f6','#10b981','#f59e0b','#ef4444','#8b5cf6','#ec4899','#06b6d4','#84cc16'];
var datasets = Object.keys(shopData).slice(0, 8).map(function(shop, i) {
return {
label: shop,
data: dates.map(function(d) { return shopData[shop][d] || null; }),
borderColor: colors[i % colors.length],
backgroundColor: colors[i % colors.length],
tension: 0.3, fill: false, pointRadius: 3, spanGaps: true
};
});
accChartInstance = new Chart(chartCanvas, {
type: 'line',
data: { labels: dates, datasets: datasets },
options: {
responsive: true, maintainAspectRatio: false,
interaction: { intersect: false, mode: 'index' },
scales: { y: { ticks: { callback: function(v) { return v + ' \u20AC'; } } } },
plugins: { legend: { position: 'bottom', labels: { boxWidth: 12, font: { size: 11 } } },
tooltip: { callbacks: { label: function(ctx) { return ctx.dataset.label + ': ' + ctx.parsed.y.toFixed(2) + ' €'; } } } }
}
});
}
function fetchAccHistory(accId) {
chartCanvas.style.display = 'none';
chartEmpty.style.display = 'none';
fetch(apiBase + accId + '?days=30')
.then(function(r) { return r.json(); })
.then(function(data) {
if (!data || !data.length) { chartCanvas.style.display = 'none'; chartEmpty.style.display = 'block'; return; }
loadChartJs(function() { renderAccChart(data); });
})
.catch(function() { chartCanvas.style.display = 'none'; chartEmpty.style.display = 'block'; });
}
function openAccModal(card) {
var name = card.dataset.accName;
var image = card.dataset.accImage;
var type = card.dataset.accType;
var accId = card.dataset.accId;
var shops = [];
try { shops = JSON.parse(card.dataset.accShops || '[]'); } catch(e) {}
modalName.textContent = name;
modalType.textContent = type;
modalType.style.display = type ? '' : 'none';
modalImage.innerHTML = image
? ' '
: ' ';
var html = '';
shops.forEach(function(s) {
var priceFormatted = '\u20AC' + s.price.toFixed(2).replace('.', ',');
var logoHtml = s.logo
? ' '
: '';
var btnHtml = s.url
? '' +
' ' +
goToShopText + ' '
: '';
html += '' + logoHtml +
'
' + s.name + ' ' +
'' + s.country + '
' +
'' + priceFormatted + ' ' +
'' + btnHtml + ' ';
});
modalShops.innerHTML = html;
modal.style.display = 'flex';
document.body.style.overflow = 'hidden';
// Fetch and render price history chart
if (accId) fetchAccHistory(accId);
}
function closeAccModal() {
modal.style.display = 'none';
document.body.style.overflow = '';
if (accChartInstance) { accChartInstance.destroy(); accChartInstance = null; }
}
// Event delegation for grid card clicks (works for lazy-loaded cards)
if (accGrid) {
accGrid.addEventListener('click', function(e) {
var card = e.target.closest('.vc-accessory-card.vc-clickable');
if (card) openAccModal(card);
});
}
// Event delegation for table row clicks
var accTable = document.getElementById('vc-acc-table');
if (accTable) {
accTable.addEventListener('click', function(e) {
var row = e.target.closest('tbody tr');
if (!row) return;
var nameEl = row.querySelector('.vc-acc-table-name');
if (!nameEl) return;
var accName = nameEl.textContent.trim();
var matchingCard = document.querySelector('.vc-accessory-card[data-acc-name="' + CSS.escape(accName) + '"]');
if (matchingCard) openAccModal(matchingCard);
});
}
closeBtn.addEventListener('click', closeAccModal);
modal.addEventListener('click', function(e) {
if (e.target === modal) closeAccModal();
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && modal.style.display !== 'none') closeAccModal();
});
}
})();