Die Inhaltsanalyse zeigt, ob Seitentitel, Beschreibungen, Überschriften, Bilder und Textstruktur Suchmaschinen und Besuchern klare Signale geben.
Seitentitel
Aignostics - Turning complex biomedical data into transformative insights
Länge : 74
Der Seitentitel von aignostics.de umfasst aktuell 74 Zeichen und liegt damit außerhalb des empfohlenen Bereichs von 10 bis 70 Zeichen. Eine etwas präzisere Länge kann helfen, das Thema der Seite in Suchergebnissen besser zu vermitteln. Zur Kontrolle können Sie dieses kostenlose Werkzeug verwenden.
Seitenbeschreibung
Aignostics turns complex biomedical data into transformative insights for biopharma companies through development of AI-powered precision medicine for pathology throughout the drug development pipeline from target identification, to translational research, and trials & companion diagnostics.
Länge : 296
Die Meta-Beschreibung von aignostics.de hat 296 Zeichen und sollte besser auf 70 bis 160 Zeichen gebracht werden. Eine präzise Beschreibung macht die Seite für Suchmaschinen und Nutzer leichter einordenbar. Zur Längenprüfung können Sie dieses kostenlose Werkzeug nutzen.
Suchbegriffe
Bei aignostics.de wurden keine Meta-Suchbegriffe gefunden. Das ist für moderne Suchmaschinen nicht kritisch, dennoch kann eine saubere interne Themenliste helfen, den Inhalt bewusster zu strukturieren. Bei Bedarf können Sie dieses kostenlose Werkzeug verwenden.
Og META Eigenschaften
aignostics.de verwendet Open-Graph-Angaben. Dadurch können soziale Netzwerke und Messenger Titel, Beschreibung, URL und Vorschaubild kontrollierter anzeigen.
Eigenschaft
Inhalt
type
website
Überschriften
H1
H2
H3
H4
H5
H6
1
12
20
0
0
0
[H1] Turning complex biomedical data into transformative insights
[H2] tags inside
if (tocElement && !tocElement.querySelector('h2')) {
// Remove the sidebar TOC if it exists
const sidebarToc = document.querySelector('.resource-content_sidebar_toc');
sidebarToc?.remove(); // Optional chaining for safety
}
});
var Webflow = Webflow || [];
Webflow.push(function () {
const FEED_URL = "https://aignostics.teamtailor.com/jobs.rss";
const NS_TT = "https://teamtailor.com/locations";
const jobsComponent = document.querySelector('[data-job-element="component"]');
if (!jobsComponent) return;
// ---------- Loader handling ----------
function removeLoader() {
jobsComponent
.querySelectorAll('[data-job-element="loader"], .jobs-loader, .careers-listing_loader')
.forEach((el) => el.remove());
const LOADER_TEXT = /Loading in available positions/i;
jobsComponent.querySelectorAll("*").forEach((el) => {
if (el.children.length === 0 && LOADER_TEXT.test((el.textContent || "").trim())) {
el.remove();
}
});
document.querySelectorAll('[data-job-element="loader"]').forEach((el) => el.remove());
document.querySelectorAll("*").forEach((el) => {
if (el.children && el.children.length === 0) {
const t = (el.textContent || "").trim();
if (LOADER_TEXT.test(t)) el.remove();
}
});
}
// ---------- Helpers ----------
function clearSymbolsFromText(string) {
return (string || "").replace(/[^a-zA-Z0-9\. \-]/g, "").trim();
}
function cleanHTMLTags(string) {
const addDotAfterClosingLi = (string || "").replace(//g, ". ");
return clearSymbolsFromText(addDotAfterClosingLi.replace(/(]+)>)/gi, ""));
}
function parseDate(pubDateStr) {
const d = new Date(pubDateStr);
return isNaN(d.getTime()) ? new Date(0) : d;
}
function nsText(parent, ns, tag) {
const el = parent?.getElementsByTagNameNS?.(ns, tag)?.[0];
return el ? el.textContent.trim() : "";
}
function qText(parent, tag) {
const el = parent?.getElementsByTagName?.(tag)?.[0];
return el ? el.textContent.trim() : "";
}
function sortPositionsByCategory(positions) {
const sortedCategories = Object.keys(positions).sort((a, b) => {
if (a === "Others") return 1;
if (b === "Others") return -1;
return a.localeCompare(b);
});
const acc = {};
for (const cat of sortedCategories) {
acc[cat] = positions[cat].sort((a, b) => b.createdAt - a.createdAt);
}
return acc;
}
function ensureJobsList() {
const list = jobsComponent.querySelector('[data-job-element="list"]');
if (list) return list;
const created = document.createElement("div");
created.setAttribute("data-job-element", "list");
jobsComponent.appendChild(created);
return created;
}
// ---------- Render ----------
function renderJobs(positionsWithCategories) {
removeLoader();
const jobsList = ensureJobsList();
const referenceGroup = jobsList.querySelector?.('[data-job-element="group"]');
const referenceCard = referenceGroup?.querySelector?.('[data-job-element="card"]');
const referenceCategory = referenceCard?.querySelector?.('[data-job-element="category"]');
const referenceTitle = referenceCard?.querySelector?.('[data-job-element="title"]');
const referenceLocation = referenceCard?.querySelector?.('[data-job-element="location"]');
jobsComponent.style.display = "none";
jobsList.innerHTML = "";
const categories = Object.entries(positionsWithCategories);
if (!categories.length) {
const msg = document.createElement("div");
msg.textContent = "No open positions found.";
jobsList.appendChild(msg);
jobsComponent.style.display = "block";
removeLoader();
return;
}
for (const [category, positions] of categories) {
const groupElement = document.createElement("div");
groupElement.setAttribute("data-job-element", "group");
if (referenceGroup) groupElement.className = referenceGroup.className;
positions.forEach((position) => {
const cardElement = document.createElement("div");
cardElement.setAttribute("data-job-element", "card");
if (referenceCard) cardElement.className = referenceCard.className;
const categoryElement = document.createElement("div");
categoryElement.setAttribute("data-job-element", "category");
if (referenceCategory) categoryElement.className = referenceCategory.className;
categoryElement.textContent = position.category;
const titleElement = document.createElement("a");
titleElement.setAttribute("data-job-element", "title");
titleElement.setAttribute("href", position.link || "#");
titleElement.setAttribute("target", "_blank");
titleElement.rel = "noopener noreferrer";
if (referenceTitle) titleElement.className = referenceTitle.className;
titleElement.textContent = position.name || "Untitled position";
const locationElement = document.createElement("div");
locationElement.setAttribute("data-job-element", "location");
if (referenceLocation) locationElement.className = referenceLocation.className;
const parts = [];
if (position.remoteStatus) {
const rs = position.remoteStatus.charAt(0).toUpperCase() + position.remoteStatus.slice(1);
parts.push(rs);
}
if (position.office) parts.push(position.office);
locationElement.textContent = parts.join(" - ") || "";
cardElement.appendChild(categoryElement);
cardElement.appendChild(titleElement);
cardElement.appendChild(locationElement);
groupElement.appendChild(cardElement);
});
jobsList.appendChild(groupElement);
}
jobsComponent.style.display = "block";
removeLoader();
}
// ---------- Fetch helpers (CORS fallback) ----------
async function fetchTextWithCorsFallback(url) {
try {
const res = await fetch(url, { credentials: "omit", cache: "no-store" });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.text();
} catch (e) {
const proxy = "https://api.allorigins.win/raw?url=" + encodeURIComponent(url);
const res2 = await fetch(proxy, { credentials: "omit", cache: "no-store" });
if (!res2.ok) throw new Error(`Proxy HTTP ${res2.status}`);
return await res2.text();
}
}
// ---------- Parse ----------
function parseFeedItems(xmlString) {
const doc = new window.DOMParser().parseFromString(xmlString, "application/xml");
if (doc.getElementsByTagName("parsererror").length) {
throw new Error("Invalid XML in feed");
}
let items = Array.from(doc.getElementsByTagName("item"));
let mode = "rss";
if (!items.length) {
items = Array.from(doc.getElementsByTagName("entry"));
mode = "atom";
}
return { doc, items, mode };
}
function extractJobFromItem(item, mode) {
let title, link, description, pubDate;
if (mode === "rss") {
title = qText(item, "title");
link = qText(item, "link");
description = qText(item, "description");
pubDate = qText(item, "pubDate") || qText(item, "date");
} else {
title = qText(item, "title");
const linkEl = item.getElementsByTagName("link")[0];
link = linkEl ? (linkEl.getAttribute("href") || linkEl.textContent || "") : "";
description = qText(item, "content") || qText(item, "summary");
pubDate = qText(item, "updated") || qText(item, "published");
}
const departmentName = nsText(item, NS_TT, "department") || qText(item, "department") || "";
let office = "";
const locNS = item.getElementsByTagNameNS?.(NS_TT, "location")?.[0];
if (locNS) {
const city = locNS.getElementsByTagNameNS(NS_TT, "city")[0]?.textContent?.trim();
const country = locNS.getElementsByTagNameNS(NS_TT, "country")[0]?.textContent?.trim();
office = [city, country].filter(Boolean).join(", ");
} else {
const city = qText(item, "city");
const country = qText(item, "country");
const locationText = qText(item, "location");
office = [city, country].filter(Boolean).join(", ") || locationText || "";
}
const remoteStatus = qText(item, "remoteStatus") || "";
let category = departmentName;
if (!category) {
const catEl = item.getElementsByTagName("category")[0];
category = catEl ? (catEl.getAttribute?.("term") || catEl.textContent || "").trim() : "";
}
if (!category) category = "Others";
return {
id: qText(item, "guid") || link || title,
name: title || "",
office,
type: remoteStatus || "",
seniority: "",
employmentType: "",
jobDescription: cleanHTMLTags(description || ""),
link,
createdAt: parseDate(pubDate),
category,
role: "",
remoteStatus
};
}
// ---------- Fetch & render ----------
async function fetchData() {
try {
const xmlString = await fetchTextWithCorsFallback(FEED_URL);
const { items, mode } = parseFeedItems(xmlString);
let positionsByCategory = {};
items.forEach((item) => {
const job = extractJobFromItem(item, mode);
if (!positionsByCategory.hasOwnProperty(job.category)) {
positionsByCategory[job.category] = [];
}
positionsByCategory[job.category].push(job);
});
positionsByCategory = sortPositionsByCategory(positionsByCategory);
renderJobs(positionsByCategory);
} catch (err) {
console.error("Error loading RSS:", err);
const jobsList = ensureJobsList();
jobsList.innerHTML = "";
const alert = document.createElement("div");
alert.textContent = "Unable to load job listings right now.";
jobsList.appendChild(alert);
jobsComponent.style.display = "block";
removeLoader();
}
}
fetchData();
});
var Webflow = Webflow || [];
Webflow.push(function () {
if (!document.querySelector('[data-custom-clipPath="element"]')) return;
const customClipPathElements = document.querySelectorAll('[data-custom-clipPath="element"]');
customClipPathElements.forEach((customClipPathElement) => {
// Find the sibling element using a more reliable selector
const siblingElement = customClipPathElement.parentElement.querySelector(
'[data-mobile-clipPath]');
if (siblingElement) {
const mobileClipPath = siblingElement.getAttribute('data-mobile-clipPath');
const breakpointClipPath = parseInt(siblingElement.getAttribute('data-breakpoint-clipPath'),
10);
const svgPath = customClipPathElement.querySelector('path');
if (svgPath && mobileClipPath && breakpointClipPath) {
const originalClipPath = svgPath.getAttribute('d');
const handleResize = () => {
const viewportWidth = window.innerWidth;
if (viewportWidth = 992) {
// Check if any element already has .is-active
const hasActiveItem = Array.from(caseStudyItems).some(item =>
item.classList.contains('is-active')
);
// If no active item exists and there are items, activate the first one
if (!hasActiveItem && caseStudyItems.length > 0) {
caseStudyItems[0].classList.add('is-active');
}
} else {
// Remove .is-active from all items when below 992px
caseStudyItems.forEach(item => item.classList.remove('is-active'));
}
}
// Click handler function
function handleClick(e) {
if (window.innerWidth >= 992) {
caseStudyItems.forEach(item => item.classList.remove('is-active'));
e.currentTarget.classList.add('is-active');
}
}
// Add click handlers
caseStudyItems.forEach(item => {
item.addEventListener('click', handleClick);
});
// Initialize on load
initializeItems();
// Handle resize
let resizeTimer;
window.addEventListener('resize', () => {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
initializeItems();
}, 250); // Debounce resize events
});
// Return cleanup function
return () => {
window.removeEventListener('resize', initializeItems);
caseStudyItems.forEach(item => {
item.removeEventListener('click', handleClick);
});
};
}
// Initial setup
handleCaseStudies();
});
var Webflow = Webflow || [];
Webflow.push(function () {
if (!document.querySelector('[data-back-top]')) return;
const scrollBtn = document.querySelector('[data-back-top]');
const rootElement = document.documentElement;
function smoothScrollToTop(duration) {
const startPosition = window.pageYOffset;
const targetPosition = 0;
const distance = targetPosition - startPosition;
const startTime = performance.now();
function ease(t, b, c, d) {
// Easing function (optional)
t /= d / 2;
if (t < 1) return c / 2 * t * t + b;
t--;
return -c / 2 * (t * (t - 2) - 1) + b;
}
function scroll() {
const currentTime = Math.min(performance.now() - startTime, duration);
window.scrollTo(0, ease(currentTime, startPosition, distance, duration));
if (currentTime < duration) {
requestAnimationFrame(scroll);
}
}
scroll();
}
// Attach smoothScrollToTop function to the click event of the scroll button
scrollBtn.addEventListener('click', function () {
smoothScrollToTop(1000); // Adjust duration as needed (in milliseconds)
});
// Show or hide the scroll button based on scroll position
window.addEventListener('scroll', function () {
const scrollPercentage = (window.scrollY / rootElement.scrollHeight) * 100;
if (scrollPercentage > 5) {
scrollBtn.style.pointerEvents = 'auto';
scrollBtn.style.opacity = '1';
} else {
scrollBtn.style.pointerEvents = 'none';
scrollBtn.style.opacity = '0';
}
});
});
var Webflow = Webflow || [];
Webflow.push(function () {
function replaceAndScrollTo(elementId) {
var targetElement = document.getElementById(elementId);
if (targetElement) {
targetElement.removeAttribute("id");
var newTarget = document.createElement("div");
newTarget.classList.add("anchor-offset");
newTarget.id = elementId;
targetElement.prepend(newTarget);
newTarget.scrollIntoView({ behavior: "smooth" });
setTimeout(() => {
newTarget.remove();
targetElement.id = elementId;
}, 500);
}
}
// Function to extract the ID from any href format
function getElementIdFromHref(href) {
const hashIndex = href.indexOf('#');
return hashIndex !== -1 ? href.substring(hashIndex + 1) : null;
}
// Handle all anchor links, including full URLs
document.querySelectorAll('a[href*="#"]').forEach(anchor => {
anchor.addEventListener("click", event => {
const href = anchor.getAttribute("href");
const elementId = getElementIdFromHref(href);
// Only handle if we're on the correct page or it's a same-page anchor
if (elementId && (
href.startsWith('#') ||
(href.includes('/services') && window.location.pathname === '/services')
)) {
event.preventDefault();
replaceAndScrollTo(elementId);
}
});
});
// Optional: Handle scroll events if needed
const windowHeight = window.innerHeight;
window.addEventListener("scroll", () => {
Array.from(document.querySelectorAll("div[id^='section']")).find(section => {
var rect = section.getBoundingClientRect();
return rect.top >= 0 && rect.top 0) {
// Process each .accordion_list
accordionLists.forEach((list, index) => {
// Find all .accordion_item elements within the list that do not have the .is-header class
const accordionItems = list.querySelectorAll('.accordion_item:not(.is-header)');
if (accordionItems.length > 0) {
// Add event listener to the child .accordion_item-trigger of each .accordion_item
accordionItems.forEach(item => {
const trigger = item.querySelector('.accordion_item-trigger');
if (trigger) {
trigger.addEventListener('click', function () {
item.classList.toggle('is-active');
});
}
});
// On load, click the first .accordion_item in the first .accordion_list only
if (index === 0) {
const firstAccordionItem = accordionItems[0];
const firstTrigger = firstAccordionItem.querySelector('.accordion_item-trigger');
if (firstTrigger) {
firstTrigger.click();
}
}
}
});
}
});
var Webflow = Webflow || [];
Webflow.push(function () {
if (!document.querySelector('[cs-item="card"]')) return;
const cards = document.querySelectorAll('[cs-item="card"]');
// Loop through each card and update the number label
cards.forEach((card, index) => {
// Find the number label within the current card
const numberLabel = card.querySelector('[cs-label="number"]');
// If the number label exists, update its text content
if (numberLabel) {
// Add 1 to index to start counting from 1 instead of 0
numberLabel.textContent = (index + 1).toString();
}
});
});
Products & ServicesProducts & ServicesOverview
[H2] Enabling precision medicine for every patient
[H2] Proprietary access to multimodal data
[H2] Deep biomedical expertise
[H2] Advanced machine learning capabilities
[H2] Cutting-edge collaborations with academic partners
[H2] Products and Services
[H2] Interdisciplinary team with deep functional competency
[H2] Looking for an opportunity to work on something meaningful?
[H2] Case Studies
[H2] tags inside
if (tocElement && !tocElement.querySelector('h2')) {
// Remove the sidebar TOC if it exists
const sidebarToc = document.querySelector('.resource-content_sidebar_toc');
sidebarToc?.remove(); // Optional chaining for safety
}
});
var Webflow = Webflow || [];
Webflow.push(function () {
const FEED_URL = "https://aignostics.teamtailor.com/jobs.rss";
const NS_TT = "https://teamtailor.com/locations";
const jobsComponent = document.querySelector('[data-job-element="component"]');
if (!jobsComponent) return;
// ---------- Loader handling ----------
function removeLoader() {
jobsComponent
.querySelectorAll('[data-job-element="loader"], .jobs-loader, .careers-listing_loader')
.forEach((el) => el.remove());
const LOADER_TEXT = /Loading in available positions/i;
jobsComponent.querySelectorAll("*").forEach((el) => {
if (el.children.length === 0 && LOADER_TEXT.test((el.textContent || "").trim())) {
el.remove();
}
});
document.querySelectorAll('[data-job-element="loader"]').forEach((el) => el.remove());
document.querySelectorAll("*").forEach((el) => {
if (el.children && el.children.length === 0) {
const t = (el.textContent || "").trim();
if (LOADER_TEXT.test(t)) el.remove();
}
});
}
// ---------- Helpers ----------
function clearSymbolsFromText(string) {
return (string || "").replace(/[^a-zA-Z0-9\. \-]/g, "").trim();
}
function cleanHTMLTags(string) {
const addDotAfterClosingLi = (string || "").replace(//g, ". ");
return clearSymbolsFromText(addDotAfterClosingLi.replace(/(]+)>)/gi, ""));
}
function parseDate(pubDateStr) {
const d = new Date(pubDateStr);
return isNaN(d.getTime()) ? new Date(0) : d;
}
function nsText(parent, ns, tag) {
const el = parent?.getElementsByTagNameNS?.(ns, tag)?.[0];
return el ? el.textContent.trim() : "";
}
function qText(parent, tag) {
const el = parent?.getElementsByTagName?.(tag)?.[0];
return el ? el.textContent.trim() : "";
}
function sortPositionsByCategory(positions) {
const sortedCategories = Object.keys(positions).sort((a, b) => {
if (a === "Others") return 1;
if (b === "Others") return -1;
return a.localeCompare(b);
});
const acc = {};
for (const cat of sortedCategories) {
acc[cat] = positions[cat].sort((a, b) => b.createdAt - a.createdAt);
}
return acc;
}
function ensureJobsList() {
const list = jobsComponent.querySelector('[data-job-element="list"]');
if (list) return list;
const created = document.createElement("div");
created.setAttribute("data-job-element", "list");
jobsComponent.appendChild(created);
return created;
}
// ---------- Render ----------
function renderJobs(positionsWithCategories) {
removeLoader();
const jobsList = ensureJobsList();
const referenceGroup = jobsList.querySelector?.('[data-job-element="group"]');
const referenceCard = referenceGroup?.querySelector?.('[data-job-element="card"]');
const referenceCategory = referenceCard?.querySelector?.('[data-job-element="category"]');
const referenceTitle = referenceCard?.querySelector?.('[data-job-element="title"]');
const referenceLocation = referenceCard?.querySelector?.('[data-job-element="location"]');
jobsComponent.style.display = "none";
jobsList.innerHTML = "";
const categories = Object.entries(positionsWithCategories);
if (!categories.length) {
const msg = document.createElement("div");
msg.textContent = "No open positions found.";
jobsList.appendChild(msg);
jobsComponent.style.display = "block";
removeLoader();
return;
}
for (const [category, positions] of categories) {
const groupElement = document.createElement("div");
groupElement.setAttribute("data-job-element", "group");
if (referenceGroup) groupElement.className = referenceGroup.className;
positions.forEach((position) => {
const cardElement = document.createElement("div");
cardElement.setAttribute("data-job-element", "card");
if (referenceCard) cardElement.className = referenceCard.className;
const categoryElement = document.createElement("div");
categoryElement.setAttribute("data-job-element", "category");
if (referenceCategory) categoryElement.className = referenceCategory.className;
categoryElement.textContent = position.category;
const titleElement = document.createElement("a");
titleElement.setAttribute("data-job-element", "title");
titleElement.setAttribute("href", position.link || "#");
titleElement.setAttribute("target", "_blank");
titleElement.rel = "noopener noreferrer";
if (referenceTitle) titleElement.className = referenceTitle.className;
titleElement.textContent = position.name || "Untitled position";
const locationElement = document.createElement("div");
locationElement.setAttribute("data-job-element", "location");
if (referenceLocation) locationElement.className = referenceLocation.className;
const parts = [];
if (position.remoteStatus) {
const rs = position.remoteStatus.charAt(0).toUpperCase() + position.remoteStatus.slice(1);
parts.push(rs);
}
if (position.office) parts.push(position.office);
locationElement.textContent = parts.join(" - ") || "";
cardElement.appendChild(categoryElement);
cardElement.appendChild(titleElement);
cardElement.appendChild(locationElement);
groupElement.appendChild(cardElement);
});
jobsList.appendChild(groupElement);
}
jobsComponent.style.display = "block";
removeLoader();
}
// ---------- Fetch helpers (CORS fallback) ----------
async function fetchTextWithCorsFallback(url) {
try {
const res = await fetch(url, { credentials: "omit", cache: "no-store" });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.text();
} catch (e) {
const proxy = "https://api.allorigins.win/raw?url=" + encodeURIComponent(url);
const res2 = await fetch(proxy, { credentials: "omit", cache: "no-store" });
if (!res2.ok) throw new Error(`Proxy HTTP ${res2.status}`);
return await res2.text();
}
}
// ---------- Parse ----------
function parseFeedItems(xmlString) {
const doc = new window.DOMParser().parseFromString(xmlString, "application/xml");
if (doc.getElementsByTagName("parsererror").length) {
throw new Error("Invalid XML in feed");
}
let items = Array.from(doc.getElementsByTagName("item"));
let mode = "rss";
if (!items.length) {
items = Array.from(doc.getElementsByTagName("entry"));
mode = "atom";
}
return { doc, items, mode };
}
function extractJobFromItem(item, mode) {
let title, link, description, pubDate;
if (mode === "rss") {
title = qText(item, "title");
link = qText(item, "link");
description = qText(item, "description");
pubDate = qText(item, "pubDate") || qText(item, "date");
} else {
title = qText(item, "title");
const linkEl = item.getElementsByTagName("link")[0];
link = linkEl ? (linkEl.getAttribute("href") || linkEl.textContent || "") : "";
description = qText(item, "content") || qText(item, "summary");
pubDate = qText(item, "updated") || qText(item, "published");
}
const departmentName = nsText(item, NS_TT, "department") || qText(item, "department") || "";
let office = "";
const locNS = item.getElementsByTagNameNS?.(NS_TT, "location")?.[0];
if (locNS) {
const city = locNS.getElementsByTagNameNS(NS_TT, "city")[0]?.textContent?.trim();
const country = locNS.getElementsByTagNameNS(NS_TT, "country")[0]?.textContent?.trim();
office = [city, country].filter(Boolean).join(", ");
} else {
const city = qText(item, "city");
const country = qText(item, "country");
const locationText = qText(item, "location");
office = [city, country].filter(Boolean).join(", ") || locationText || "";
}
const remoteStatus = qText(item, "remoteStatus") || "";
let category = departmentName;
if (!category) {
const catEl = item.getElementsByTagName("category")[0];
category = catEl ? (catEl.getAttribute?.("term") || catEl.textContent || "").trim() : "";
}
if (!category) category = "Others";
return {
id: qText(item, "guid") || link || title,
name: title || "",
office,
type: remoteStatus || "",
seniority: "",
employmentType: "",
jobDescription: cleanHTMLTags(description || ""),
link,
createdAt: parseDate(pubDate),
category,
role: "",
remoteStatus
};
}
// ---------- Fetch & render ----------
async function fetchData() {
try {
const xmlString = await fetchTextWithCorsFallback(FEED_URL);
const { items, mode } = parseFeedItems(xmlString);
let positionsByCategory = {};
items.forEach((item) => {
const job = extractJobFromItem(item, mode);
if (!positionsByCategory.hasOwnProperty(job.category)) {
positionsByCategory[job.category] = [];
}
positionsByCategory[job.category].push(job);
});
positionsByCategory = sortPositionsByCategory(positionsByCategory);
renderJobs(positionsByCategory);
} catch (err) {
console.error("Error loading RSS:", err);
const jobsList = ensureJobsList();
jobsList.innerHTML = "";
const alert = document.createElement("div");
alert.textContent = "Unable to load job listings right now.";
jobsList.appendChild(alert);
jobsComponent.style.display = "block";
removeLoader();
}
}
fetchData();
});
var Webflow = Webflow || [];
Webflow.push(function () {
if (!document.querySelector('[data-custom-clipPath="element"]')) return;
const customClipPathElements = document.querySelectorAll('[data-custom-clipPath="element"]');
customClipPathElements.forEach((customClipPathElement) => {
// Find the sibling element using a more reliable selector
const siblingElement = customClipPathElement.parentElement.querySelector(
'[data-mobile-clipPath]');
if (siblingElement) {
const mobileClipPath = siblingElement.getAttribute('data-mobile-clipPath');
const breakpointClipPath = parseInt(siblingElement.getAttribute('data-breakpoint-clipPath'),
10);
const svgPath = customClipPathElement.querySelector('path');
if (svgPath && mobileClipPath && breakpointClipPath) {
const originalClipPath = svgPath.getAttribute('d');
const handleResize = () => {
const viewportWidth = window.innerWidth;
if (viewportWidth = 992) {
// Check if any element already has .is-active
const hasActiveItem = Array.from(caseStudyItems).some(item =>
item.classList.contains('is-active')
);
// If no active item exists and there are items, activate the first one
if (!hasActiveItem && caseStudyItems.length > 0) {
caseStudyItems[0].classList.add('is-active');
}
} else {
// Remove .is-active from all items when below 992px
caseStudyItems.forEach(item => item.classList.remove('is-active'));
}
}
// Click handler function
function handleClick(e) {
if (window.innerWidth >= 992) {
caseStudyItems.forEach(item => item.classList.remove('is-active'));
e.currentTarget.classList.add('is-active');
}
}
// Add click handlers
caseStudyItems.forEach(item => {
item.addEventListener('click', handleClick);
});
// Initialize on load
initializeItems();
// Handle resize
let resizeTimer;
window.addEventListener('resize', () => {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
initializeItems();
}, 250); // Debounce resize events
});
// Return cleanup function
return () => {
window.removeEventListener('resize', initializeItems);
caseStudyItems.forEach(item => {
item.removeEventListener('click', handleClick);
});
};
}
// Initial setup
handleCaseStudies();
});
var Webflow = Webflow || [];
Webflow.push(function () {
if (!document.querySelector('[data-back-top]')) return;
const scrollBtn = document.querySelector('[data-back-top]');
const rootElement = document.documentElement;
function smoothScrollToTop(duration) {
const startPosition = window.pageYOffset;
const targetPosition = 0;
const distance = targetPosition - startPosition;
const startTime = performance.now();
function ease(t, b, c, d) {
// Easing function (optional)
t /= d / 2;
if (t < 1) return c / 2 * t * t + b;
t--;
return -c / 2 * (t * (t - 2) - 1) + b;
}
function scroll() {
const currentTime = Math.min(performance.now() - startTime, duration);
window.scrollTo(0, ease(currentTime, startPosition, distance, duration));
if (currentTime < duration) {
requestAnimationFrame(scroll);
}
}
scroll();
}
// Attach smoothScrollToTop function to the click event of the scroll button
scrollBtn.addEventListener('click', function () {
smoothScrollToTop(1000); // Adjust duration as needed (in milliseconds)
});
// Show or hide the scroll button based on scroll position
window.addEventListener('scroll', function () {
const scrollPercentage = (window.scrollY / rootElement.scrollHeight) * 100;
if (scrollPercentage > 5) {
scrollBtn.style.pointerEvents = 'auto';
scrollBtn.style.opacity = '1';
} else {
scrollBtn.style.pointerEvents = 'none';
scrollBtn.style.opacity = '0';
}
});
});
var Webflow = Webflow || [];
Webflow.push(function () {
function replaceAndScrollTo(elementId) {
var targetElement = document.getElementById(elementId);
if (targetElement) {
targetElement.removeAttribute("id");
var newTarget = document.createElement("div");
newTarget.classList.add("anchor-offset");
newTarget.id = elementId;
targetElement.prepend(newTarget);
newTarget.scrollIntoView({ behavior: "smooth" });
setTimeout(() => {
newTarget.remove();
targetElement.id = elementId;
}, 500);
}
}
// Function to extract the ID from any href format
function getElementIdFromHref(href) {
const hashIndex = href.indexOf('#');
return hashIndex !== -1 ? href.substring(hashIndex + 1) : null;
}
// Handle all anchor links, including full URLs
document.querySelectorAll('a[href*="#"]').forEach(anchor => {
anchor.addEventListener("click", event => {
const href = anchor.getAttribute("href");
const elementId = getElementIdFromHref(href);
// Only handle if we're on the correct page or it's a same-page anchor
if (elementId && (
href.startsWith('#') ||
(href.includes('/services') && window.location.pathname === '/services')
)) {
event.preventDefault();
replaceAndScrollTo(elementId);
}
});
});
// Optional: Handle scroll events if needed
const windowHeight = window.innerHeight;
window.addEventListener("scroll", () => {
Array.from(document.querySelectorAll("div[id^='section']")).find(section => {
var rect = section.getBoundingClientRect();
return rect.top >= 0 && rect.top 0) {
// Process each .accordion_list
accordionLists.forEach((list, index) => {
// Find all .accordion_item elements within the list that do not have the .is-header class
const accordionItems = list.querySelectorAll('.accordion_item:not(.is-header)');
if (accordionItems.length > 0) {
// Add event listener to the child .accordion_item-trigger of each .accordion_item
accordionItems.forEach(item => {
const trigger = item.querySelector('.accordion_item-trigger');
if (trigger) {
trigger.addEventListener('click', function () {
item.classList.toggle('is-active');
});
}
});
// On load, click the first .accordion_item in the first .accordion_list only
if (index === 0) {
const firstAccordionItem = accordionItems[0];
const firstTrigger = firstAccordionItem.querySelector('.accordion_item-trigger');
if (firstTrigger) {
firstTrigger.click();
}
}
}
});
}
});
var Webflow = Webflow || [];
Webflow.push(function () {
if (!document.querySelector('[cs-item="card"]')) return;
const cards = document.querySelectorAll('[cs-item="card"]');
// Loop through each card and update the number label
cards.forEach((card, index) => {
// Find the number label within the current card
const numberLabel = card.querySelector('[cs-label="number"]');
// If the number label exists, update its text content
if (numberLabel) {
// Add 1 to index to start counting from 1 instead of 0
numberLabel.textContent = (index + 1).toString();
}
});
});
In the news
[H2] Unlock the power of your data.
[H3] Products
[H3] Services
[H3] About Us
[H3] Careers
[H3] Featured Content
[H3] Products
[H3] Pathology Foundation Models
[H3] Aignostics Atlas Product Series
[H3] Services
[H3] Target & Biomarker Discovery
[H3] Translational Research
[H3] Digital Diagnostics
[H3] ISO 13485 and 27001 certified
[H3] GCP-ready clinical trial platform
[H3] Anomaly Detection for Rare Diseases
[H3] Enhanced Generalizability of Digital Pathology AI
[H3] Improved Performance and Label Efficiency
[H3] Aignostics and Bayer to Present on Joint Target ID Platform at ESMO AI
[H3] Aignostics Launches AI-Powered Application for Tumor Microenvironment Profiling
[H3] Aignostics obtains ISO 27001 recertification, underscoring commitment to information security
Bilder
Es konnten 37 Bilder auf dieser Webseite gefunden werden.
Die Bilder von aignostics.de sollten nachgearbeitet werden: 37 ALT-Attribute fehlen. Sinnvolle ALT-Texte erklären, was auf den Bildern zu sehen ist, und machen den Inhalt robuster für SEO und Barrierefreiheit.
Text/HTML Verhältnis
Anteil : 3%
Das Text-zu-HTML-Verhältnis von aignostics.de liegt nur bei 3% und damit unter dem empfohlenen Mindestwert von 15%. Mehr eigener, sichtbarer Inhalt würde der Seite helfen, ihr Thema klarer zu vermitteln.
Flash
aignostics.de verzichtet auf Flash-Inhalte. Dadurch bleibt die Seite technisch zeitgemäßer und für Nutzer wie Suchmaschinen leichter zugänglich.
IFrame
aignostics.de verwendet keine IFrames. Dadurch liegen die wichtigsten Inhalte direkt im Dokument und sind für Suchmaschinen einfacher zu erfassen.
SEO Links
Eine klare Linkstruktur erleichtert Suchmaschinen das Crawlen, verteilt interne Relevanz und hilft Besuchern, wichtige Inhalte schnell zu finden.
URL Rewrite
aignostics.de verwendet lesbare URL-Strukturen. Das ist ein Vorteil für Navigation, Teilen von Links und die schnelle thematische Einordnung einzelner Seiten.
Underscores in the URLs
aignostics.de verwendet keine Unterstriche in den geprüften Links. Das unterstützt eine klare und übliche URL-Schreibweise.
In-page links
We found a total of 19 links including 0 link(s) to files
Die Suchbegriffsauswertung zeigt, welche Themen die Seite tatsächlich vermittelt und ob wichtige Begriffe in Inhalt und Seitenelementen konsistent vorkommen.
Gute Benutzerfreundlichkeit stärkt Vertrauen und erleichtert die Nutzung. Geprüft werden unter anderem URL, Favicon, Sprache und Druckdarstellung.
URL
Domain : aignostics.de
Länge : 13
Favoriten Icon
aignostics.de stellt ein Favicon bereit. Dieses kleine Symbol verbessert Wiedererkennung in Browser-Tabs, Lesezeichen und Suchergebnisumgebungen.
Druckeigenschaften
aignostics.de hat offenbar keine druckfreundliche CSS-Variante. Wenn Inhalte häufig ausgedruckt werden, lohnt sich eine angepasste Print-Darstellung.
Sprache
aignostics.de deklariert die Sprache als en. Das hilft Browsern, Suchmaschinen und Hilfstechnologien bei Aussprache, Darstellung und regionaler Einordnung.
Dublin Core
Bei aignostics.de wurden keine Dublin-Core-Elemente gefunden. Das ist nicht für jede Website zwingend, kann aber bei dokumentenartigen oder redaktionellen Inhalten nützlich sein.
Dokument
Sauberes HTML, eine korrekte Zeichencodierung und moderne Standards verbessern Kompatibilität, Zugänglichkeit und die zuverlässige Verarbeitung der Seite.
Doctype
HTML 5
Verschlüsselung
Der Zeichensatz von aignostics.de ist angegeben: UTF-8. Dadurch sinkt das Risiko fehlerhafter Zeichenanzeige in Browsern und Auswertungssystemen.
W3C Validität
Fehler : 0
Warnungen : 0
E-Mail Datenschutz
aignostics.de sollte offen sichtbare E-Mail-Adressen absichern. Eine geschützte Darstellung verringert die Wahrscheinlichkeit automatisierter Spam-Erfassung. Mit diesem kostenlosen Werkzeug lassen sich Adressen besser schützen.
Veraltetes HTML
Im Quelltext von aignostics.de wurden keine deprecated HTML-Tags erkannt. Aktuelle HTML-Strukturen sind robuster für Browser und Validatoren.
Tipps zur Webseitengeschwindigkeit
aignostics.de nutzt keine verschachtelten Tabellen. Das macht Layout und Quelltext leichter wartbar und besser zugänglich.
aignostics.de nutzt CSS direkt in HTML-Elementen. Eine Auslagerung in CSS-Dateien kann den Quelltext übersichtlicher und besser wartbar machen.
aignostics.de verwendet mit 5 CSS-Dateien eine überschaubare Stylesheet-Struktur. Das kann Ladezeit und Wartung positiv beeinflussen.
Bei aignostics.de wurden viele JavaScript-Dateien erkannt. Prüfen Sie, ob nicht benötigte Skripte entfernt oder zusammengefasst werden können.
Gzip ist für aignostics.de aktiv. Komprimierte Antworten sparen Datenvolumen und beschleunigen die Auslieferung der Seite.
Mobile
Mobile Optimierung ist wichtig, weil viele Besucher Smartphones nutzen. Viewport, Icons und ungeeignete Technologien beeinflussen Darstellung und Bedienbarkeit.
Mobile Optimierung
Apple Icon
META Viewport Tag
Flash Inhalt
Optimierung
Sitemap, robots.txt, Komprimierung und Analysesysteme beeinflussen, wie effizient eine Website gecrawlt, ausgeliefert und gezielt weiterentwickelt werden kann.
XML-Sitemap
Fehlt
Für aignostics.de wurde keine XML-Sitemap gefunden. Eine Sitemap listet wichtige URLs und kann Suchmaschinen Hinweise zu Aktualisierung und Struktur der Website geben.
Robots.txt
http://aignostics.de/robots.txt
aignostics.de enthält eine robots.txt-Datei. Damit lassen sich Crawler-Regeln und der Hinweis auf die Sitemap zentral steuern.
Analytics
Fehlt
aignostics.de scheint kein Analytics-System einzusetzen. Ein datenschutzkonform eingebundenes Analyse-Tool kann helfen, Optimierungen gezielter zu planen.
PageSpeed Insights
PageSpeed Insights bewertet Leistung, Barrierefreiheit, bewährte Verfahren und SEO für Desktop und Mobilgeräte und macht technische Bremsen sichtbar.
Gerät
Kategorien
Website-Überprüfung
Website-Überprüfung ist ein kostenloses SEO Werkzeug zur Analyse Ihrer Webseite