91³Ô¹ÏÍø

Watch CBS News

Baldwin wins Wisconsin 2024 Senate election, CBS News projects. See the race results.

Sen. Tammy Baldwin will defeat Eric Hovde in the Wisconsin Senate race, CBS News projects — holding onto a crucial seat for Democrats. Even before this race was decided, Republicans had gained enough seats on Election Day to secure control of the Senate

The race in the Badger State, among the most competitive this cycle, has been a bruising one as the two candidates each sought to portray the other as coastal elites out of step with Wisconsinites

Baldwin, 62, was first elected to the Senate in 2012 after representing Wisconsin in the House for more than a decade. She has a long history of courting rural voters in the state — in her last race, she won counties that had supported Trump, despite her progressive politics. 

Hovde, 60, also sought the GOP 91³Ô¹ÏÍø in 2012, but it went to former Wisconsin Gov. Tommy Thompson, who went on to lose the election to Baldwin. As chairman and CEO of Utah-based Sunwest Bank, Hovde is one of a number of Republican Senate candidates recruited in part for their ability to fund their own campaigns this cycle. 

On the campaign trail, Baldwin painted Hovde as an out-of-touch wealthy businessman. He campaigned on issues like immigration and criticized Baldwin for her record in Washington.

Sen. Tammy Baldwin (D-Wisconsin) and Republican challenger Eric Hovde.
Sen. Tammy Baldwin (D-Wisconsin) and Republican challenger Eric Hovde. Getty Images

The race grew personal in the campaign's final stages, as Republicans ads raised innuendoes about Baldwin's long-term partner, a financial adviser, and her business ties. While Republicans have demanded that Baldwin disclose her partner's assets, claiming in advertisements that Baldwin is "in bed with Wall Street" and dubbing her the "third senator from New York," Democrats accused the GOP of trying to draw attention to her sexuality. Baldwin is the first openly LGBTQ senator in history.

Meanwhile, Democrats worked to highlight Hovde's connections to California. They've also zeroed in on a number of controversial comments by Hovde, including the suggestion that people in nursing homes don't have the capacity to vote.

The Cook Political Report rated the race as a toss-up heading into Election Day, shifting its rating from lean-Democrat in early October as the state appeared to tighten. Baldwin was considered the most vulnerable of the Democratic Senate candidates in the "blue wall" states of Wisconsin, Michigan and Pennsylvania, and Hovde saw some momentum in the late stages of the campaign.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=fd53910ecf4604072044ab7c46d9b028'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });