Kleinanzeigen m² Preis Rechner V2.1

Zeigt den Preis pro m² (fett, groß, ohne Klammern) direkt in den Kleinanzeigen Suchergebnissen für Immobilien an. Jetzt auch für Tauschangebote.

当前为 2025-06-05 提交的版本,查看 最新版本

// ==UserScript==
// @name         Kleinanzeigen m² Preis Rechner V2.1
// @namespace    http://tampermonkey.net/
// @version      1.3.1
// @description  Zeigt den Preis pro m² (fett, groß, ohne Klammern) direkt in den Kleinanzeigen Suchergebnissen für Immobilien an. Jetzt auch für Tauschangebote.
// @license MIT
// @author       Dein Name
// @match        https://www.kleinanzeigen.de/s-wohnung-mieten/*
// @match        https://www.kleinanzeigen.de/s-haus-mieten/*
// @match        https://www.kleinanzeigen.de/s-wohnung-kaufen/*
// @match        https://www.kleinanzeigen.de/s-haus-kaufen/*
// @match        https://www.kleinanzeigen.de/s-wg-zimmer/*
// @match        https://www.kleinanzeigen.de/s-immobilien/*
// @match        https://www.kleinanzeigen.de/s-grundstuecke-gaerten/*
// @grant        GM_addStyle
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    // CSS für die Anzeige des m²-Preises
    GM_addStyle(`
        .sqm-price-display {
            font-size: 1.4em; /* Angepasst: Größer, etwa wie der Hauptpreis */
            color: #20242C;   /* Angepasst: Farbe des Hauptpreises für Konsistenz */
            font-weight: bold;/* Angepasst: Fett */
            margin-left: 10px;/* Etwas Abstand zum Hauptpreis */
        }
        /* Stellt sicher, dass der Preis-Container den zusätzlichen Text aufnehmen kann */
        .aditem-main--middle--price-shipping {
            display: flex;
            align-items: baseline; /* Basislinien der Texte auf gleicher Höhe */
            flex-wrap: wrap;
        }
        .aditem-main--middle--price-shipping--price {
            /* Standardstyles für den Hauptpreis bleiben erhalten */
        }
        .sqm-price-container { /* Container für den m² Preis, um ihn rechts zu platzieren */
            margin-left: auto; /* Schiebt diesen Container ganz nach rechts */
            padding-left: 5px;
        }
    `);

    function parsePrice(priceString) {
        if (!priceString) return null;
        const cleanedPrice = priceString
            .replace(/\s*VB\s*/i, '')
            .replace(/\s*€\s*/g, '')
            .replace(/\./g, '')
            .replace(/,/g, '.')
            .trim();
        if (cleanedPrice.toLowerCase() === 'zu verschenken') return 0;
        if (cleanedPrice.toLowerCase() === 'auf anfrage' || cleanedPrice.toLowerCase() === 'anfrage') return null;
        const price = parseFloat(cleanedPrice);
        return isNaN(price) ? null : price;
    }

    function parseArea(areaString) {
        if (!areaString) return null;
        const match = areaString.match(/([\d\.,]+)\s*m²/i);
        if (match && match[1]) {
            const cleanedArea = match[1].replace(/\./g, '').replace(/,/g, '.');
            const area = parseFloat(cleanedArea);
            return isNaN(area) || area === 0 ? null : area;
        }
        return null;
    }

    function processAdItems() {
        const items = document.querySelectorAll('article.aditem');

        items.forEach(item => {
            const priceShippingContainer = item.querySelector('.aditem-main--middle--price-shipping');
            if (!priceShippingContainer) return;

            if (priceShippingContainer.querySelector('.sqm-price-container')) {
                return;
            }

            const priceElement = priceShippingContainer.querySelector('.aditem-main--middle--price-shipping--price');
            const priceText = priceElement ? priceElement.textContent : null;

            // *** GEÄNDERTER SELEKTOR HIER ***
            // Sucht nach einem p-Element innerhalb von .aditem-main--bottom
            const tagsContainer = item.querySelector('.aditem-main--bottom p');
            let areaText = null;
            if (tagsContainer) {
                const simpleTags = tagsContainer.querySelectorAll('span.simpletag');
                simpleTags.forEach(tag => {
                    if (tag.textContent && tag.textContent.includes('m²')) {
                        areaText = tag.textContent;
                    }
                });
            }

            const price = parsePrice(priceText);
            const area = parseArea(areaText);

            if (price !== null && area !== null && area > 0) {
                const pricePerSqm = price / area;

                const sqmPriceOuterContainer = document.createElement('div');
                sqmPriceOuterContainer.classList.add('sqm-price-container');

                const sqmPriceElement = document.createElement('span');
                sqmPriceElement.classList.add('sqm-price-display');
                sqmPriceElement.textContent = `${pricePerSqm.toFixed(2).replace('.', ',')} €/m²`;

                sqmPriceOuterContainer.appendChild(sqmPriceElement);
                priceShippingContainer.appendChild(sqmPriceOuterContainer);
            }
        });
    }

    // Führe die Funktion initial aus
    processAdItems();

    // MutationObserver für dynamisch geladene Inhalte
    const observerTargetNode = document.getElementById('srchrslt-adtable') || document.body;
    const observer = new MutationObserver(function(mutationsList) {
        for (const mutation of mutationsList) {
            if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                let hasNewAdItems = false;
                for (const addedNode of mutation.addedNodes) {
                    if (addedNode.nodeType === Node.ELEMENT_NODE && (addedNode.classList.contains('aditem') || addedNode.querySelector('.aditem'))) {
                        hasNewAdItems = true;
                        break;
                    }
                }
                if (hasNewAdItems) {
                    setTimeout(processAdItems, 300);
                    return;
                }
            }
        }
    });

    observer.observe(observerTargetNode, { childList: true, subtree: true });

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址