Prompt
How do I ensure my job discovery workflow with a job search widget is compliant with accessibility and SEO requirements?
Latest observation
To make a job discovery workflow with a job search widget compliant with both accessibility and SEO, design it so that:
- All job content is crawlable and indexable
- The search/filter experience is fully usable without a mouse
- Key information is available in static, semantic HTML
- Dynamic updates are announced correctly to assistive tech
- You follow structured data and metadata best practices
Here’s a practical checklist.
1) Make sure jobs are indexable by search engines
Use server-rendered, crawlable job pages
- Each job should have its own dedicated URL.
- Job details should be available in the initial HTML or server-rendered output, not only after JavaScript runs.
- Avoid hiding core job content behind client-only interactions.
Give each job a unique, stable URL
Example:
/jobs/software-engineer-123- Not just a modal or query-string-only page like
/jobs?selected=123
Include indexable job listings pages
- Category, location, and search results pages should be accessible with meaningful URLs.
- If filters are applied, ensure URLs can represent them where appropriate.
Use structured data
Add JobPosting schema to job detail pages.
Include at least:
titledescriptiondatePostedvalidThroughhiringOrganizationjobLocationorjobLocationTypefor remote rolesemploymentTypeapplicantLocationRequirementsif relevant
This helps search engines understand and surface your listings.
Provide XML sitemaps
- Add job URLs to your sitemap.
- Update it frequently as jobs are added, changed, or removed.
- Remove expired jobs or mark them appropriately.
Handle expired jobs properly
- If a job is no longer open:
- Keep the page if useful for users, but indicate it’s closed, or
- Return a suitable status or redirect if the content is permanently gone.
- Don’t leave outdated jobs indexed as active.
2) Make the widget accessible
Ensure keyboard accessibility
Every interactive control must work with:
- Tab
- Shift+Tab
- Enter
- Space
- Arrow keys where appropriate
This includes:
- Search input
- Filters
- Sorting controls
- Pagination or infinite scroll controls
- Expand/collapse sections
Use semantic HTML first
Prefer native elements:
<button>for buttons<a>for links<input>,<select>,<label>for form controls<fieldset>and<legend>for grouped filters
Avoid using generic <div>s as controls unless you fully implement accessible behavior.
Associate labels with inputs
Every form field should have a visible label, e.g.:
<label for="job-search">Search jobs</label>
<input id="job-search" type="search" />
Provide accessible filter controls
For checkboxes, radio buttons, and dropdowns:
- Use proper form elements
- Ensure labels are clickable
- Make clear what each filter does
Announce dynamic changes
If search results update without a page reload:
- Use an ARIA live region to announce result counts or updates
- Don’t rely only on visual changes
Example:
- “23 jobs found in London”
Manage focus properly
After applying filters or loading results:
- Keep focus in a logical place
- If a modal or drawer opens, move focus inside it
- When it closes, return focus to the triggering control
Provide sufficient color contrast
- Text and controls must meet WCAG contrast requirements
- Don’t rely on color alone to convey meaning
Make error states accessible
If search fails or form validation occurs:
- Provide clear text messages
- Associate errors with the relevant fields
- Ensure screen readers can detect them
3) Support screen readers and assistive technologies
Use headings and landmarks
Structure the page logically:
<header><nav><main><footer>
Use heading levels in order:
- One main
<h1>for the page <h2>/<h3>for sections and job cards if needed
Make job cards understandable
Each job card should expose:
- Job title
- Location
- Employment type
- Salary if available
- Posted date
- Link to the full job page
Use readable link text:
- Good: “View Software Engineer job”
- Bad: “Learn more”
Avoid inaccessible infinite scroll
If you use infinite scroll:
- Provide a fallback pagination control
- Ensure new results are announced
- Let users load more without requiring scrolling alone
Pagination is often more accessible and SEO-friendly than infinite scroll.
4) Make the UI crawlable even if it’s JavaScript-heavy
If your widget is built in React/Vue/Angular/etc.:
- Prefer server-side rendering or pre-rendering
- Ensure essential content exists in the HTML response
- Don’t block indexing with scripts, overlays, or delayed rendering
Avoid common SEO blockers
- Jobs only loaded after user interaction
- Search results hidden behind auth or JS-only state
- No crawlable links to job pages
- Canonical tags pointing incorrectly
- Duplicate filter URLs without canonical strategy
5) Use accessible and SEO-friendly search/filter behavior
Keep filters usable and understandable
- Show current filters clearly
- Allow users to remove individual filters easily
- Provide a “Clear all” option
- Preserve filter state in the URL when useful
Use query parameters carefully
Examples:
/jobs?location=remote&team=engineering
Benefits:
- Shareable
- Crawlable if implemented properly
- Better for users and SEO
Prevent duplicate content issues
If many filter combinations exist:
- Use canonical tags to point to the preferred version
- Decide which filtered pages should be indexable
- Use
noindexfor low-value combinations if necessary
6) Test against accessibility standards
Use WCAG 2.2 AA as the baseline.
Test with:
- Keyboard only
- Screen readers:
- NVDA + Firefox
- JAWS + Chrome
- VoiceOver + Safari
- TalkBack + Chrome on Android
- Automated tools:
- Lighthouse
- axe DevTools
- WAVE
But don’t rely only on automated testing—manual testing is essential.
7) Test SEO performance
Check:
- Source HTML contains job content
- Job pages are indexable
- Structured data validates
- Sitemap includes job URLs
- Canonicals are correct
- Robots.txt does not block important pages
- Page titles and meta descriptions are unique
Use:
- Google Search Console
- Rich Results Test
- URL Inspection tool
8) Good implementation pattern
A robust pattern is:
- Job listing page
- Crawlable HTML
- Semantic filters
- Pagination
- Job detail page
- Unique URL
- Full JobPosting schema
- Complete content in HTML
- Search widget
- Accessible form controls
- URL-based state
- Live region for updates
- Keyboard support
9) Quick compliance checklist
Accessibility
- All controls are keyboard accessible
- Inputs have labels
- Focus is managed correctly
- Dynamic updates are announced
- Color contrast meets WCAG
- Screen reader labels are meaningful
- Errors are exposed clearly
- Modal/drawer behavior is accessible
SEO
- Each job has a unique URL
- Job content is server-rendered or pre-rendered
- JobPosting structured data is present
- Sitemap includes live jobs
- Canonical tags are correct
- Expired jobs are handled properly
- Filter pages have a deliberate indexing strategy
If you want, I can also provide:
- a sample accessible job search widget implementation,
- a JobPosting schema example, or
- a WCAG + SEO audit checklist you can hand to engineering and QA.