Mietspiegel-Rechner Hattingen 2025-27
// general shortcutting // let dqs = (q) => document.querySelector(q); let dqsa = (q) => document.querySelectorAll(q); let dsid = (q) => document.getElementById(q); let dscn = (q) => document.getElementsByClassName(q); let dstn = (q) => document.getElementsByTagName(q);
let arr = (a) => Array.from(a);
ortsübliche Vergleichsmiete online ermitteln. Gehen Sie die nachfolgende
Liste komplett durch und setzen Sie Häkchen bei allen zutreffenden
Eigenschaften. Das Ergebnis finden Sie unten.
Geben Sie zunächst als Basisdaten die Wohnungsgrößenkategorie
und die Baualtersklasse an. Das Ergebnis ist die Basismiete in €/qm.
einem Zu- oder Abschlag auf die Basismiete führen. Bitte setzen Sie bei
allen zutreffenden Eigenschaften ein Häkchen.
let fläche_fixed; let baujahr_fixed;
const is_valid = () => !arr(dqsa('#fläche_input, #baujahr_input')).find((x) => x.value <= 0); const rd = ((num=undefined) => typeof num != 'undefined' && num !== null ? Math.round(num*100) / 100 : undefined); const pnum = ((a) => `${rd(a)}`.replace(/([0-9]+)\.([0-9]+)/gm,'$1,$2').replace(/,([0-9]{1})$/,',$1'+0));
const commitLogic = function(){
const createObjectFromNodeMap = (m) => Object.fromEntries(Object.values(m).map((x)=>[x.name, x.textContent]));
dqsa(`#CALCULATOR .form-check-input, #CALCULATOR option`).forEach( function(x){ x.disabled = null; }) dqsa(`#CALCULATOR .form-check-label`).forEach( function(x){ x.style.color = 'rgba(0,0,0,1)'; });
let set_enabled = ( item, on = true ) => { if(typeof item==='undefined'||item===null) return; if(on===false) { item.setAttribute('disabled',''); try{ item.checked = null; } catch(e){} item.parentNode.style.opacity = 0.25; return; } item.removeAttribute('disabled'); item.parentNode.style.opacity = null; }
dqsa('[jahr_max_allowed]').forEach( x => set_enabled(x) );
if( dqs('[jahr_max]:checked') && dqs('[jahr_min]:checked') ) { let jahr_max = dqs('[jahr_max]:checked').getAttribute('jahr_max'); let jahr_min = dqs('[jahr_min]:checked').getAttribute('jahr_min'); dqsa('[jahr_max_allowed]').forEach( x => { set_enabled( x, jahr_max < x.getAttribute('jahr_max_allowed') || jahr_min < x.getAttribute('jahr_max_allowed') ) }); } else if( dqs('[jahr_min]:checked') ) { let jahr_max = dqs('[jahr_min]:checked').getAttribute('jahr_min'); dqsa('[jahr_max_allowed]').forEach( x => { set_enabled( x, jahr_max > x.getAttribute('jahr_max_allowed') ) }); }
let deactivate_constraints = function(x){ if ( x && x.constraints) { x.constraints.split(/,/g).filter(id => !id.match(/^\s*$/)).map( function(id){ try{ constraints.add(id); let el = dqs(`[_id="${id}"]`); if(el) el.style.color = 'rgba(0,0,0,0.5)';
let cb = dqs(`[id="${id}"]`); cb.disabled = 'disabled'; cb.checked = null; } catch(e) { console.warn(e); } }); } }
let deactivate_requirements = (x) => { x.requires.split(/,/g).filter(id => !id.match(/^\s*$/)).forEach((id) => { try{ if( !dqs(`[id="${id}"]`).checked ){ let el = dqs(`[_id="${x.id}"]`); if(el) el.style.color = 'rgba(0,0,0,0.5)';
let cb = dqs(`[id="${x.id}"]`); cb.disabled = 'disabled'; cb.checked = null; } } catch(e) {} }); } dqsa('#CALCULATOR .form-check-input[requires], #CALCULATOR option[requires]').forEach( x => deactivate_requirements(createObjectFromNodeMap(x.attributes)) );
let constraints = new Set(), summation = 0, selected_settings = [];
let basis_selektion = dqs('[id="baujahr und fläche"] :checked'); if (!basis_selektion) return;
basis_selektion = {
...createObjectFromNodeMap(basis_selektion.attributes),
value: !(isNaN(fläche_fixed) || isNaN(baujahr_fixed)) ? `Baujahr ${baujahr_fixed}, ${fläche_fixed} qm` : basis_selektion.value,
};
basis_selektion = {
...basis_selektion,
text_second: ' mit einer Fläche ' + (
!isNaN(fläche_fixed)
? 'von ' + fläche_fixed + ' qm'
: typeof basis_selektion.size_min != "undefined" && typeof basis_selektion.size_max != "undefined"
? 'zwischen ' + basis_selektion.size_min + ' qm und ' + basis_selektion.size_max + ' qm'
: typeof basis_selektion.size_max != "undefined"
? 'bis ' + basis_selektion.size_max+' qm'
: typeof basis_selektion.size_min != "undefined"
? 'ab ' + basis_selektion.size_min + ' qm' + ' aufwärts'
: ''
) + ' und einem Baujahr ' + (
!isNaN(baujahr_fixed)
? baujahr_fixed
: typeof basis_selektion.jahr_min != "undefined" && typeof basis_selektion.jahr_max != "undefined"
? 'zwischen ' + basis_selektion.jahr_min + ' und ' + basis_selektion.jahr_max
: typeof basis_selektion.jahr_max != "undefined"
? 'bis ' + basis_selektion.jahr_max
: typeof basis_selektion.jahr_min != "undefined"
? 'ab ' + basis_selektion.jahr_min + ' aufwärts'
: ''
) + `
liegt die ortsübliche Vergleichsmiete `// in ${basis_selektion.wohngebiet} `
}
selected_settings.push({ text: basis_selektion.value, price: basis_selektion.price, currency: basis_selektion.currency });
let basis_preis = parseFloat(basis_selektion.price); deactivate_constraints(basis_selektion);
let basis_preis_untergrenze = parseFloat(basis_selektion.min) ?? false; let basis_preis_obergrenze = parseFloat(basis_selektion.max) ?? false;
let summation_untergrenze = 0, summation_obergrenze = 0;
const woPrice = (s="") => s.replace(/\s*[(][0-9]+[.,]*[0-9]*\s*€[)\s*]/g,'');
dqsa('#CALCULATOR :not(.no_charge) .form-check-input:checked, #CALCULATOR select:not(.no_charge) option:checked').forEach( function(x){
if(x.tagName.match(/option/i) && x.parentNode.id == 'baujahr und fläche') return; if(x.parentNode.classList)
constraints.has(x.id)
const x_attributes = createObjectFromNodeMap(x.attributes) deactivate_constraints(x_attributes);
selected_settings.push( { text: dqs(`[_id="${x.id}"]`) ? dqs(`[_id="${x.id}"] span nobr`).textContent : (x.label || x.value), price: x_attributes.price, currency: x_attributes.currency } ); //.getAttribute('desc') ); });
dqsa('#CALCULATOR :not(.no_charge) .form-check-input:checked, #CALCULATOR select:not(.no_charge) option:checked').forEach((node) => { if(node.tagName.match(/option/i) && node.parentNode.id == 'baujahr und fläche') return;
const x = createObjectFromNodeMap(node.attributes)
summation += parseFloat(x.price);
if(basis_preis_untergrenze !== false) summation_untergrenze += parseFloat(x?.price); if(basis_preis_obergrenze !== false) summation_obergrenze += parseFloat(x?.price); }); summation += basis_preis;
let summations = [ { text: "Durchschnittliche ortsübliche Vergleichsmiete", price: Math.round( summation * 100 ) / 100 } ]
if( basis_preis_untergrenze !== false ){ summations.push( { ignore_sum: true, text: "Untere Spanne", price: Math.round( ( basis_preis_untergrenze + summation_untergrenze ) * 100 ) / 100 } ); } if( basis_preis_obergrenze !== false ){ summations.push( { ignore_sum: true, text: "Obere Spanne", price: Math.round( ( basis_preis_obergrenze + summation_obergrenze ) * 100 ) / 100 } ); }
dqs('#selected_options').innerHTML = '
` ], [] ).join('') + '
';
const prc = (a=0, b=0, c=1) => pnum(Math.round( ( a + b ) * c * 100 )/100);
if(summation){ dqs('#selected_options').innerHTML += `
ortsübliche Vergleichsmiete / qm (Mittelwert + Zu- / Abschläge)
${pnum(summations.reduce((p, c) => p += c.ignore_sum === true ? 0 : c.price, 0))} €
`
} let _e0ee59ee_951e_46fd_9647_f93e336f8f36 = function() { let size_min = dqs('[size_min]:checked') ? dqs('[size_min]:checked').getAttribute('size_min') : undefined; let size_max = dqs('[size_max]:checked') ? dqs('[size_max]:checked').getAttribute('size_max') : undefined; let selected_size = dqs('[id="mo_size"]') ? dqs('[id="mo_size"]').value : undefined;
size_min = parseFloat(size_min) || undefined; size_max = parseFloat(size_max) || undefined; selected_size = parseFloat(selected_size) || 0;
if( ( size_min && selected_size < size_min ) || ( size_max && selected_size > size_max ) ) return false;
let flaeche = parseFloat(dsid('mo_size').value);
dsid('mo_size_total').innerHTML = 'Für das Mietobjekt'
dqsa('[id="fläche_input"]').forEach(_ => dqsa('#mo_size, [id="baujahr und fläche"]').forEach(_ => _.style.display='none'));
dsid('mo_size_total').innerHTML += basis_selektion.text_second
let P = fläche_fixed; P = Number.isNaN(P) ? undefined : P; if (P) { dsid('mo_size_total').innerHTML += `bei ${pnum(P * summation)} €`; }
let v = is_valid() ? 'unset' : 'hidden'; dqsa('[id="evaluation"], [id="priceinfo"]').forEach((x) => x.style.visibility = v);
};
if( dqs('[size_max]:checked') && parseFloat( dqs('[id="mo_size"]').value ) > parseFloat( dqs('[size_max]:checked').getAttribute('size_max') ) ) dqs('[id="mo_size"]').value = dqs('[size_max]:checked').getAttribute('size_max'); else if( dqs('[size_min]:checked') && parseFloat( dqs('[id="mo_size"]').value ) < parseFloat( dqs('[size_min]:checked').getAttribute('size_min') ) ) dqs('[id="mo_size"]').value = dqs('[size_min]:checked').getAttribute('size_min'); if(dqs('[size_min]:checked')) dqs('[id="mo_size"]').setAttribute( 'min', dqs('[size_min]:checked').getAttribute('size_min') ) if(dqs('[size_max]:checked')) dqs('[id="mo_size"]').setAttribute( 'max', dqs('[size_max]:checked').getAttribute('size_max') ) if( dqs('[size_max]:checked') && dqs('[id="mo_size"]').value > dqs('[size_max]:checked').getAttribute('size_max') ) dqs('[id="mo_size"]').value = dqs('[size_max]:checked').getAttribute('size_max'); else if( dqs('[size_min]:checked') && dqs('[id="mo_size"]').value < dqs('[size_min]:checked').getAttribute('size_min') ) dqs('[id="mo_size"]').value = dqs('[size_min]:checked').getAttribute('size_min'); if( dqs('[size_max]:checked') && !dqs('[size_min]:checked') ) dqs('[id="mo_size"]').setAttribute('min', null ); if( dqs('[size_min]:checked') && !dqs('[size_max]:checked') ) dqs('[id="mo_size"]').setAttribute('max', null ); dqs('[id="mo_size"]').oninput = _e0ee59ee_951e_46fd_9647_f93e336f8f36; dqs('[id="mo_size"]').oninput(); }; dqsa('#CALCULATOR input[type="checkbox"], #CALCULATOR select').forEach( function(x){ x.oninput = (()=>{ commitLogic(); }) } );
commitLogic(); dsid('baujahr und fläche')?.parentNode?.parentNode?.classList.add('active'); dqs('#CALCULATOR .collapsible > li:last-of-type')?.classList.add('active');
document.addEventListener('DOMContentLoaded', function(){
const inputFieldsFn = (()=>{ const inputs = dqsa('[id="fläche_input"],[id="baujahr_input"],[id="wohngebiet_input"]'); if( inputs.length < 2 ) return false; fläche_fixed = parseFloat( dqs('[id="fläche_input"]').value.replace(/^[^0-9]+$/gi,x=>'') ); baujahr_fixed = parseFloat( dqs('[id="baujahr_input"]').value.replace(/^[^0-9]+$/gi,x=>'') );
let wohngebiet = dqs('[id="wohngebiet_input"]') ? dqs('[id="wohngebiet_input"]').value : undefined;
let selectors = Array.from(dqsa('[id="baujahr und fläche"] option')); let selector = selectors.find(x => { return ( ( (isNaN(fläche_fixed)) || ( parseFloat(x.getAttribute('size_min')||-Infinity) <= fläche_fixed && fläche_fixed <= parseFloat(x.getAttribute('size_max')||Infinity) ) ) && ( (isNaN(baujahr_fixed)) || ( parseFloat(x.getAttribute('jahr_min')||-Infinity) <= baujahr_fixed && baujahr_fixed <= parseFloat(x.getAttribute('jahr_max')||Infinity) ) ) && ( wohngebiet == x.getAttribute('wohngebiet') ) ) }); if (!selector) return; selector.parentNode.selectedIndex = selector.index; commitLogic(); }); dqsa('[id="baujahr und fläche"]').forEach(x => { if(dqs('[id="baujahr und fläche bound"]')) return; let el = document.createElement('DIV'); el.id = 'baujahr und fläche bound' dqsa('[id="fläche_input"], [id="baujahr_input"], [id="wohngebiet_input"]').forEach((x) => { x.oninput = inputFieldsFn; }); }); inputFieldsFn();
});