91³Ô¹ÏÍø

Watch CBS News

Doug Emhoff, praising Harris as "joyful warrior," shows personal side in DNC speech

Doug Emhoff, the nation's first second gentleman, introduced himself to delegates and the nation Tuesday at the Democratic National Convention, praising his wife, Vice President Kamala Harris, for her dedication to their family and tying it to how she would approach leading the nation if elected president.

"Wherever she's needed, however she's needed, Kamala rises to the occasion. And she did it for me and my family," Emhoff told the crowd. "And now that the country needs her, she's showing you what we already know: she's ready to lead."

Emhoff recalled his childhood growing up in New Jersey and California, to his career as an entertainment lawyer, to meeting Harris in 2013. He revealed that he first called her at 8:30 a.m. 

"I got Kamala's voicemail and I just started rambling, 'Hey, it's Doug. I'm on my way to an early meeting, again, it's Doug.' I remember I was trying to grab the words out of the air and just put them back in my mouth," Emhoff said. 

Harris saved that message, and plays it for him on every anniversary, Emhoff said. 

Second gentleman Doug Emhoff
Second gentleman Doug Emhoff speaks on stage during the second day of the Democratic National Convention at the United Center on Aug. 20, 2024, in Chicago, Illinois.  Getty Images

The two will celebrate their 10th wedding anniversary Thursday, the night Harris will deliver the keynote address to accept the Democratic presidential 91³Ô¹ÏÍø.

"As I got to know her better and just fell in love fast, I learned what drives Kamala. And it's what you've seen over these past four years and especially these past four weeks," Emhoff said. "She finds joy in pursuing justice. She stands up to bullies, just like my parents taught me to. She likes to see people do well, but hates when they're treated unfairly."

He lauded Harris for standing up against antisemitism and all forms of hate.

"Her empathy is her strength," Emhoff said, calling her a "joyful warrior."

"She will lead with joy and toughness, with that laugh and that look, with compassion and conviction," he said. "She'll lead from the belief that wherever we come from, whatever we look like, we're strongest when we fight for what we believe in, not just against what we fear." 

In 2020, as Harris made history as the nation's first ever female vice president, Emhoff in turn made some history of his own as the first-ever second gentleman, as well as the first Jewish spouse of vice president or president. Emhoff has been vocal about his Jewish identity and has made battling antisemitism a key part of his platform. 

"She's the one who encouraged me as second gentleman to take up that fight, which is so personal to me," Emhoff said. 

Emhoff said that he met Harris at an "important moment" in his life. 

"And at this moment in our nation's history, she is exactly the right president," he said.

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(); } }); }); }); });