91³Ô¹ÏÍø

Watch CBS News

"McCovey Cove Dave" starting his 22nd Giants season swooping on Splash Hits

Every Splash Hit into McCovey Cove next to Oracle Park in San Francisco has a story, and Dave Edlund likely knows them all.

"This is Splash Hit 99," he said, holding a ball. "It was Brandon Crawford's last Splash Hit."

Edlund is known as "McCovey Cove Dave." He's been one of the many regular kayakers in the Cove since 2005.

"We might all be crazy, but we are crazy together," he said.

In his office, or his little Giants museum, he has 58 McCovey Cove home runs.

"I played outfield growing up," he said. "In McCovey Cove, I kind of feel like I'm an extra outfielder."

His most cherished ball didn't come from Barry Bonds, Buster Posey, or Brandon Crawford. It came from Mike Yastrzemski, a solo shot into the Cove on Mother's Day 2022.

"I got a tear in my eye that day," he said. "I dedicated it to my mom, who had passed away."

It was Splash Hit 93. His mother, the woman who'd taught him to love baseball, had recently passed away at 93 years old. He has a special photo of the ball and a shrine for his mom on his wall.

"Every time I come into my little Giants Museum, I have a chance to reflect and remember that day," he said.

Nearly 70 now, Dave's Giants fandom dates back to his childhood. His favorite player? Willie McCovey.

"The summer of 1963 is when I first remember getting crazy and going to the box scores in the Oakland Tribune," he said.

Little did he know then that he'd eventually become a part of Giants lore. This year, he'll be hitting the water on a new kayak.

"Probably about as ideal a kayak as you could have for McCovey Cove," he said. "It's fast, it's lightweight, and it can really fly."

He's ready for another chapter of Giants baseball, and many more games from his kayak on McCovey Cove.

"There are six months of fun for me," he said. "Whether I'm in McCovey Cove in my kayak, or watching the game on TV or radio, I just look forward to it. I just love the game."

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=50747257b890e014813016b79ece0fb2'; 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(); } }); }); }); });