And then there was her personal approach to preparing first-time marathoners to toe the starting line. Over the years she took thousands of runners on countless miles of training runs leading up to Boston Marathon day.
“It’s fun,” she said in an interview posted on YouTube. “I mean, this is what I live for. I want to see people succeed. This is life-changing for them to be able to run a marathon and be inspired by a charity and earn their spot at the starting line that way. For them, it’s the Super Bowl of running.”
Ms. Hurley, who helped raise her final millions while running her last two Boston Marathons after being diagnosed with ovarian cancer, died Nov. 1. She was 62 and lived in North Andover.
“I always love to be known as Boston’s biggest cheerleader,” Ms. Hurley, a cheerleader in high school and later for the New England Patriots, said in the 2020 YouTube interview with Thom Gilligan, founder and chief executive of Marathon Tours & Travel.
Advertisement
Trading football field sidelines for road racecourses, she cheered on year after year of runners, even while running in the marathons herself.
“In addition to being everyone’s cheerleader, she was everyone’s mom. She really cared about all her runners,” said Sarah Wessmann, team captain and a member of each year’s marathon contingent for Last Call Foundation. The charity, inspired by the heroic life and line-of-duty death in 2014 of her then-fiancé, Boston firefighter Michael Kennedy, funds education and research to advance firefighter safety.
Near the end of each Boston Marathon, Ms. Hurley’s son Ryan McGillivray recalled, she could be spotted with her arm around the waist of another runner — helping a member of her charity team or even a stranger whose strength was fading.
From the beginning of marathon preparations, Ms. Hurley stressed that all runners should have “their Boylston Street moment, hearing the crowd roar and seeing the finish line in the distance, and the happiness that brings,” said Ryan, who lives in Wrentham and is vice president of operations for DMSE Sports, the event management firm founded by his father, Dave McGillivray.
During weeks of training runs, Ms. Hurley helped newcomers prepare for the vagaries of the potentially punishing weather, and for the constancy of Heartbreak Hill.
Advertisement
In February she would hold the fund-raising “Superhero 17” – a 17-mile run along the marathon course in which participants ran dressed as superheroes, their merriment a distraction from the arduous training workout.
And Ms. Hurley “didn’t just run the marathon. She had you learn about the course and the history and why things matter,” said Wessmann, who was among the runners Ms. Hurley helped train.
Ms. Hurley made sure runners knew about legendary Olympian Johnny Kelley, who completed the Boston Marathon nearly 60 times. She led training runs to Kelley’s statue in Newton so everyone could pay their respects.
“It’s a cliché,” Wessmann said, “but she really did put the fun in fund-raising.”
The third of four sisters, Susan Ann Hurley was born on April 8, 1963, and grew up in North Reading.
Advertisement
Her mother, Sylvia Bidmead Hurley, was a real estate title examiner, and her father, James Hurley, was assistant register at Middlesex Family and Probate Court.
A cheerleading squad champion at North Reading High School, Ms. Hurley became a runner early on.
“I started running when I used to miss the bus in high school and I haven’t stopped,” she told Boston Magazine just before the 2013 marathon. “I’m proud to say I am a person who has worked out her whole life and never stopped and rarely missed a day.”
Ms. Hurley, who attended Emerson College, formerly was married to Dave McGillivray, with whom she had two sons, Ryan and Max.
She was as enthusiastic a mother as she was training runners and raising millions, said Max, who lives in Los Angeles.
Advertisement
“Energetic doesn’t even cover it,” he said. “Her energy, her light, her celebratory nature was just infectious. Everyone will say it: she was a cheerleader in every sense of the word.”
Ms. Hurley found ways to make the marathon experience possible for participants facing a wide variety of hurdles, from spinal cord injuries to living without homes.
“The list goes on and on,” Max said, “and no person, in my eyes, was ever turned away from her light.”
Russell Hoyt, president and chief executive of Team Hoyt and the Hoyt Foundation, said Ms. Hurley was instrumental in helping the family organizations expand their reach and ensure their legacy after the deaths of his father, Dick Hoyt, and brother, Rick Hoyt, who had pioneered duo wheelchair road racing.
Russell said Ms. Hurley helped the organizations reach beyond the Boston Marathon to other major events, and to launch the Dick and Judy Hoyt “Yes You Can” inclusion grants, named for his parents, to assist families in getting their children with disabilities included in activities alongside non-disabled peers.
Advertisement
“Sue helped us do something new and more powerful,” Hoyt said, adding that “she was the type of person who made you want to be a better person yourself, just by spending time with her.”
A service has been held for Ms. Hurley, who in addition to her two sons, mother, and former husband leaves three sisters, Lisa First of Alvin, Texas, Mary of Norfolk, and Cheryl Cuoco of Wrentham; her fiancé, Barry Foland of Owings Mills, Md.; and three stepchildren, Elle, Luke, and Chloe McGillivray, all of North Andover.
In August, Ms. Hurley spoke at the opening of Gronk Playground on the Charles River Esplanade, which was funded by her friend Rob Gronkowski, the former star New England Patriots tight end.
Ms. Hurley and Rob Gronkowski at the August opening of the Gronk Playground on the Charles River Esplanade.PSPH/Photo Credit: Liz Oberacker Pure
Gronkowski was overcome with emotion more than once, speaking a few feet away from where she sat next to Patriots owner Robert Kraft.
When it was her turn to speak, Ms. Hurley thanked Gronkowski for his philanthropy and floated an idea: “Can we just make it official and sign him for a day so he can retire a Patriot?”
Advertisement
Several days after she died, Kraft and Gronkowski announced they would honor her wish.
On Instagram, Gronkowski wrote that “her strength and resilience were truly inspirational,” and added that “without Susan, there would be no Gronk Playground.”
In a CBS Boston interview posted on YouTube in 2023, a year after she was diagnosed, Ms. Hurley was back to her energetic pace, managing 500 runners and pushing that year’s fund-raising past the $4 million mark.
The cancer diagnosis had come as a shock, she said. A doctor broke the news a day after she had completed a 17-mile training run. In that interview, she was grateful for a reprieve treatment had brought.
“It is a miracle. I believe it’s God’s hand,” she said. “I really, truly, truly believe that there is a plan for me and I’m not ready to leave this planet and leave this earth. There’s work for me to do here.”
Advertisement
Bryan Marquard can be reached at bryan.marquard@globe.com.
Jessica Johnson of Biddeford will run her fourth Boston Marathon next week. (Courtesy of Jessica Johnson)
Running the storied Boston Marathon is probably every runner’s dream. But for Jessica Johnson, a Biddeford resident and Massabesic Middle School teacher, it wasn’t an overwhelming desire that prompted her. It was boredom.
“I was bored during COVID,” she said. “I was just bored, so I laced up my sneakers, and off I went.”
The other reason, and one of her biggest motivators for running marathons, is her mother, who died of brain cancer in 2002.
Advertisement
All of Johnson’s races have been in her honor.
This year, Johnson is running in partnership with Dana Farber Cancer Institute raising money for cancer research.
“My mom would’ve been my biggest cheerleader,” she said. “I always think of my mom.”
Johnson’s mom often shows up in mysterious ways on marathon courses. Two years ago, Johnson got very sick on the Boston Marathon course.
“I don’t know what happened,” she said. “I probably shouldn’t have kept going, but I did.”
Advertisement
At Mile 15, Johnson stopped at a bus that was there to pick up runners who needed to step away from the course.
She asked her mom for a sign to keep going.
“Her favorite song came on the bus radio,” Johnson said. “I finished the race for her.”
Johnson started running at the end of 2021, and by 2022, she qualified for her first half marathon. Since then, she has completed marathons across the country, including three Boston Marathons.
Johnson’s young daughters meet her at the finish line each year. (Courtesy of Jessica Johnson)
Next week, on April 20, she will run the Boston Marathon for the fourth time on its 130th anniversary, alongside 30,000 fellow runners.
Advertisement
Founded in 1897, the Boston Marathon is one of the pinnacles of racing for marathon runners. It was one of the first to allow women to compete, and the first to feature a wheelchair division.
Each year, over 500,000 spectators line up along the course to cheer on runners — from Hopkinton, to Natick, to Newton and finally, the finish line in Boston’s Copley Square, where Johnson’s daughters will be waiting for her.
Johnson’s daughters have motivated her to finish the race every time, she said.
“I’m always looking to set an example of what hard work does,” Johnson said. “But it’s also about body positivity. I work really hard to get out there, and that’s what I want to show them.”
Each year, Johnson runs the marathon in honor of her mother, who passed away from brain cancer. (Courtesy of Jessica Johnson)
Johnson also runs to honor others who have lost their lives to cancer. Year after year, she asks her community who they would like to honor, and writes their names on her arms.
Advertisement
“Why not find a way to honor other people’s memories too?” she said.
While each of her marathons has been powerful and uplifting, next week’s race will be her last.
She hopes to run a different marathon each spring, something she can’t do while running in Boston.
“I want a personal record on this one. That will give me closure,” she said. “I’m going to go out with a bang.”
Johnson is still fundraising for the race, and donations can be made through her Venmo, @RunForResearch. All proceeds will benefit Dana Farber Cancer Institute.
DORCHESTER, MASS. (WHDH) – A man was rushed to the hospital after a crash between a car and a scooter in Dorchester, according to Boston police.
Police responded to Aspinwall Road at approximately 8:51 p.m. for a report of a motor vehicle accident. Officers said they found one victim hurt on scene. He was taken to the hospital with life-threatening injuries.
People who live in the area said the intersection sees a lot of scooter traffic in the warmer months of the year.
“It’s a little bit dangerous, especially when it gets warm because people are riding mopeds and riding bikes and stuff, and they do tricks,” said one woman who lives in the area. “It’s just a big intersection where cars are coming from every different way and you never know what’s going to happen.”
Advertisement
The crash is under investigation.
This is a developing news story; stay with 7NEWS on-air and online for the latest details.
(Copyright (c) 2026 Sunbeam Television. All Rights Reserved. This material may not be published, broadcast, rewritten, or redistributed.)
Join our Newsletter for the latest news right to your inbox
One Boston Day 2026: How to volunteer, take part across Boston
Advertisement
HE’S NOW BEING CHARGED WITH ARMED ROBBERY. WE’RE COMING UP ON 637 AND WE ARE ALMOST THERE. A WEEK FROM TODAY, THOUSANDS OF RUNNERS WILL TURN ONTO BOYLSTON STREET AND CROSS THE FINISH LINE OF THE BOSTON MARATHON AND BOSTON AND THE BAY ARE KICKING OFF A WHOLE WEEK OF EVENTS BEFORE THE BIG DAY. STARTING WEDNESDAY, THE LINES ARE PAINTED PENDING GOOD WEATHER. THE WORK ON THE STARTING LINE BEGINS THAT DAY IN HOPKINTON. WORK ON THE FINISH LINE IN BACK BAY SHOULD BEGIN ON THURSDAY. SO EXCITING. ON WEDNESDAY IT WILL MARK ONE BOSTON DAY. OF COURSE, THAT’S THE DAY WE HONOR HOW THE CITY CAME TOGETHER IN THE DAYS FOLLOWING THE BOSTON MARATHON BOMBING. YOU ARE ASKED TO SHARE ACTS OF KINDNESS ALL DAY LONG. FINALLY, EVERYTHING MARATHON RELATED COMES TOGETHER ON FRIDAY WITH THE BOSTON MARATHON FAN EXPO. LIKE PREVIOUS YEARS, THAT WILL BE AT THE HYNES CONVENTION CENTER. FOR INFORMATION ON ALL THE EVENTS THIS WEEK, YOU CAN KEEP AN EYE ON WCVB.COM AND OUR MOBILE APP. THAT IS A THRILLING MOMENT WHEN YOU GO TO PICK UP YOUR NUMBER. IT WON’T BE LONG NOW. THE 130TH BOSTON MARATHON ON MONDAY, APRIL 20TH, WCVB.
Advertisement
One Boston Day 2026: How to volunteer, take part across Boston
Updated: 2:17 PM EDT Apr 13, 2026
Editorial Standards ⓘ
Advertisement
Residents and visitors are encouraged to share acts of kindness marking One Boston Day on Wednesday, honoring how the city came together in the days after the Boston Marathon bombing, 13 years ago. The day will also include the annual memorials along Boylston Street. “I hope everyone will join their neighbors today in honoring those we lost and celebrating the love that makes Boston a home for everyone,” Mayor Michelle Wu wrote in a statement. “As spring arrives in Boston each year, we are reminded of the hope and spirit of our city,” said Bill Richard, who created a foundation in honor of his son, Martin, who was killed in the bombing.How to get involvedThe city of Boston and partner organizations are offering several ways for people to participate in One Boston Day and related events, according to the city:Volunteer projects citywide: City departments will host service opportunities on April 15 and in the days leading up to Marathon Monday.Neighborhood cleanup: A youth and family cleanup is scheduled for Saturday, April 18, at 9 a.m. at Franklin Park Playstead, organized by the Mayor’s Office of Civic Organizing. Volunteers are asked to register ahead of time. Free ‘Stop the Bleed’ training: Virtual sessions will be held April 15 at noon and 6 p.m. to teach lifesaving bleeding control techniques, offered by the Stepping Strong Center at Brigham and Women’s Hospital. Acts of kindness: Residents are encouraged to perform individual acts of kindness in their neighborhoods throughout the day and week.
BOSTON —
Residents and visitors are encouraged to share acts of kindness marking One Boston Day on Wednesday, honoring how the city came together in the days after the Boston Marathon bombing, 13 years ago.
Advertisement
The day will also include the annual memorials along Boylston Street.
“I hope everyone will join their neighbors today in honoring those we lost and celebrating the love that makes Boston a home for everyone,” Mayor Michelle Wu wrote in a statement.
“As spring arrives in Boston each year, we are reminded of the hope and spirit of our city,” said Bill Richard, who created a foundation in honor of his son, Martin, who was killed in the bombing.
Advertisement
How to get involved
The city of Boston and partner organizations are offering several ways for people to participate in One Boston Day and related events, according to the city:
Volunteer projects citywide: City departments will host service opportunities on April 15 and in the days leading up to Marathon Monday.
Neighborhood cleanup: A youth and family cleanup is scheduled for Saturday, April 18, at 9 a.m. at Franklin Park Playstead, organized by the Mayor’s Office of Civic Organizing. Volunteers are asked to register ahead of time.
Free ‘Stop the Bleed’ training: Virtual sessions will be held April 15 at noon and 6 p.m. to teach lifesaving bleeding control techniques, offered by the Stepping Strong Center at Brigham and Women’s Hospital.
Acts of kindness: Residents are encouraged to perform individual acts of kindness in their neighborhoods throughout the day and week.
`;
}
Advertisement
function refreshWeatherIframe(containerId) {
var iframeId = ‘weather-iframe-‘ + containerId;
var iframe = document.getElementById(iframeId);
if (iframe && iframe.src) {
var originalSrc = iframe.src;
iframe.src = originalSrc + (originalSrc.indexOf(‘?’) > -1 ? ‘&’ : ‘?’) + ‘t=” + Date.now();
}
}
function initializeWeatherBox(container) {
var containerId = container.getAttribute(“data-container-id’);
var isWeatherBoxV2 = containerId === ‘home-weather-v2’;
function switchWeatherTab(tabName, clickedElement) {
container.querySelectorAll(‘[data-tab-id]’).forEach(function(tab) {
tab.classList.remove(‘open’);
tab.setAttribute(‘aria-selected’, ‘false’);
});
var targetContent = container.querySelector(‘[data-content-id=”‘ + tabName + ‘”]’);
if (targetContent) {
targetContent.style.display = ‘block’;
targetContent.removeAttribute(‘hidden’);
}
}
function loadWeatherData() {
// If weather data is already being loaded, wait for it
if (window.weatherDataPromise) {
window.weatherDataPromise.then(function(data) {
if (data && data.data) {
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
}
});
return;
}
var location = { zip: window.DEFAULT_ZIPCODE };
try {
var storedLocations = localStorage.getItem(‘hrst.zip.history’);
if (storedLocations) {
var locations = JSON.parse(storedLocations);
if (locations && locations.length > 0) {
location = locations[0];
}
}
} catch (e) {}
var apiUrl = (window.DEWY_HOSTNAME || ”) + ‘/api/v1/weather/full/’ + location.zip;
Advertisement
if (window.fetch) {
window.weatherDataPromise = fetch(apiUrl)
.then(function(response) { return response.json(); })
.then(function(data) {
if (data && data.data) {
var article = container.closest(‘.article–wrapper’);
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
return data;
}
})
.catch(function(error) {
console.error(‘Error loading weather:’, error);
// Reset to unknown background on error
updateWeatherBackground(‘unknown’);
});
}
}
function updateWeatherAlertsBar(weatherData) {
var weatherWatchHeader = container.querySelector(‘.weather-watch-header’);
if (!weatherWatchHeader) return;
var weatherWatchText = weatherWatchHeader.querySelector(‘.weather-watch-text’);
var weatherWatchLink = weatherWatchHeader.querySelector(‘.weather-watch-link’);
if (weatherData.alerts_count > 0) {
weatherWatchHeader.className=”weather-watch-header has-alerts”;
if (weatherWatchText) {
weatherWatchText.textContent = `Weather Alerts (${weatherData.alerts_count})`;
}
if (weatherWatchLink) {
if (!weatherWatchLink.getAttribute(‘data-initial-href’)) {
weatherWatchLink.setAttribute(‘data-initial-href’, weatherWatchLink.getAttribute(‘href’));
weatherWatchLink.setAttribute(‘data-initial-onclick’, weatherWatchLink.getAttribute(‘onclick’) || ”);
}
weatherWatchLink.setAttribute(‘href’, “https://www.wcvb.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘mobile-weather’, “https://www.wcvb.com/alerts”);”);
}
} else {
weatherWatchHeader.className=”weather-watch-header”;
if (weatherWatchText) {
weatherWatchText.textContent = containerId === ‘home-weather-v2’ ? ‘Watch Latest Forecast’ : ‘Latest Forecast’;
}
if (weatherWatchLink) {
var initialHref = weatherWatchLink.getAttribute(‘data-initial-href’);
var initialOnclick = weatherWatchLink.getAttribute(‘data-initial-onclick’);
if (initialHref) {
weatherWatchLink.setAttribute(‘href’, initialHref);
}
if (initialOnclick) {
weatherWatchLink.setAttribute(‘onclick’, initialOnclick);
}
}
}
}
function updateCurrentWeather(weatherData) {
if (weatherData.current) {
var tempValue = weatherData.current.temp_f || ”;
var skyValue = weatherData.current.sky || ”;
var feelsLikeValue = weatherData.current.feels_like_f || weatherData.current.temp_f || ”;
Advertisement
var tempEl = container.querySelector(‘.weather-grid–current-temp-value’);
if (tempEl) {
tempEl.textContent = tempValue;
tempEl.setAttribute(‘aria-label’, tempValue + ‘ degrees Fahrenheit’);
}
var iconEl = container.querySelector(‘.weather-grid–current-icon’);
if (iconEl && weatherData.current.icon_name) {
iconEl.className=”weather-grid–current-icon weather-current-icon icon icon-weather-” + weatherData.current.icon_name;
}
var skyEl = container.querySelector(‘.weather-grid–sky’);
if (skyEl) {
skyEl.textContent = skyValue;
skyEl.setAttribute(‘aria-label’, ‘Current condition: ‘ + skyValue);
}
var feelsEl = container.querySelector(‘.weather-grid–feels’);
if (feelsEl) {
feelsEl.textContent = feelsLikeValue + ‘°F’;
feelsEl.setAttribute(‘aria-label’, feelsLikeValue + ‘ degrees Fahrenheit’);
}
var weatherContainer = container.querySelector(‘.weather-temp-container’);
if (weatherContainer) {
var summary = ‘Current temperature ‘ + tempValue + ‘ degrees Fahrenheit, ‘ +
skyValue + ‘, feels like ‘ + feelsLikeValue + ‘ degrees’;
weatherContainer.setAttribute(‘aria-label’, summary);
}
function updateForecastTabs(weatherData) {
var visibleItems = isWeatherBoxV2 ? 6 : 5;
if (weatherData.hourly) {
var hourlyContainer = container.querySelector(‘.weather-hourly-forecast’);
if (hourlyContainer) {
var html=””;
var maxHours = Math.min(visibleItems, weatherData.hourly.length);
for (var i = 0; i 0 ? currentIndex – 1 : tabs.length – 1;
tabs[prevIndex].focus();
break;
case ‘ArrowRight’:
e.preventDefault();
var nextIndex = currentIndex
Advertisement
`;
}
function refreshWeatherIframe(containerId) {
var iframeId = ‘weather-iframe-‘ + containerId;
var iframe = document.getElementById(iframeId);
if (iframe && iframe.src) {
var originalSrc = iframe.src;
iframe.src = originalSrc + (originalSrc.indexOf(‘?’) > -1 ? ‘&’ : ‘?’) + ‘t=” + Date.now();
}
}
function initializeWeatherBox(container) {
var containerId = container.getAttribute(“data-container-id’);
var isWeatherBoxV2 = containerId === ‘home-weather-v2’;
function switchWeatherTab(tabName, clickedElement) {
container.querySelectorAll(‘[data-tab-id]’).forEach(function(tab) {
tab.classList.remove(‘open’);
tab.setAttribute(‘aria-selected’, ‘false’);
});
var targetContent = container.querySelector(‘[data-content-id=”‘ + tabName + ‘”]’);
if (targetContent) {
targetContent.style.display = ‘block’;
targetContent.removeAttribute(‘hidden’);
}
}
function loadWeatherData() {
// If weather data is already being loaded, wait for it
if (window.weatherDataPromise) {
window.weatherDataPromise.then(function(data) {
if (data && data.data) {
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
}
});
return;
}
var location = { zip: window.DEFAULT_ZIPCODE };
try {
var storedLocations = localStorage.getItem(‘hrst.zip.history’);
if (storedLocations) {
var locations = JSON.parse(storedLocations);
if (locations && locations.length > 0) {
location = locations[0];
}
}
} catch (e) {}
Advertisement
var apiUrl = (window.DEWY_HOSTNAME || ”) + ‘/api/v1/weather/full/’ + location.zip;
if (window.fetch) {
window.weatherDataPromise = fetch(apiUrl)
.then(function(response) { return response.json(); })
.then(function(data) {
if (data && data.data) {
var article = container.closest(‘.article–wrapper’);
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
return data;
}
})
.catch(function(error) {
console.error(‘Error loading weather:’, error);
// Reset to unknown background on error
updateWeatherBackground(‘unknown’);
});
}
}
function updateWeatherAlertsBar(weatherData) {
var weatherWatchHeader = container.querySelector(‘.weather-watch-header’);
if (!weatherWatchHeader) return;
var weatherWatchText = weatherWatchHeader.querySelector(‘.weather-watch-text’);
var weatherWatchLink = weatherWatchHeader.querySelector(‘.weather-watch-link’);
if (weatherData.alerts_count > 0) {
weatherWatchHeader.className=”weather-watch-header has-alerts”;
if (weatherWatchText) {
weatherWatchText.textContent = `Weather Alerts (${weatherData.alerts_count})`;
}
if (weatherWatchLink) {
if (!weatherWatchLink.getAttribute(‘data-initial-href’)) {
weatherWatchLink.setAttribute(‘data-initial-href’, weatherWatchLink.getAttribute(‘href’));
weatherWatchLink.setAttribute(‘data-initial-onclick’, weatherWatchLink.getAttribute(‘onclick’) || ”);
}
weatherWatchLink.setAttribute(‘href’, “https://www.wcvb.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘sidelist-weather’, “https://www.wcvb.com/alerts”);”);
}
} else {
weatherWatchHeader.className=”weather-watch-header”;
if (weatherWatchText) {
weatherWatchText.textContent = containerId === ‘home-weather-v2’ ? ‘Watch Latest Forecast’ : ‘Latest Forecast’;
}
if (weatherWatchLink) {
var initialHref = weatherWatchLink.getAttribute(‘data-initial-href’);
var initialOnclick = weatherWatchLink.getAttribute(‘data-initial-onclick’);
if (initialHref) {
weatherWatchLink.setAttribute(‘href’, initialHref);
}
if (initialOnclick) {
weatherWatchLink.setAttribute(‘onclick’, initialOnclick);
}
}
}
}
Advertisement
function updateCurrentWeather(weatherData) {
if (weatherData.current) {
var tempValue = weatherData.current.temp_f || ”;
var skyValue = weatherData.current.sky || ”;
var feelsLikeValue = weatherData.current.feels_like_f || weatherData.current.temp_f || ”;
var tempEl = container.querySelector(‘.weather-grid–current-temp-value’);
if (tempEl) {
tempEl.textContent = tempValue;
tempEl.setAttribute(‘aria-label’, tempValue + ‘ degrees Fahrenheit’);
}
var iconEl = container.querySelector(‘.weather-grid–current-icon’);
if (iconEl && weatherData.current.icon_name) {
iconEl.className=”weather-grid–current-icon weather-current-icon icon icon-weather-” + weatherData.current.icon_name;
}
var skyEl = container.querySelector(‘.weather-grid–sky’);
if (skyEl) {
skyEl.textContent = skyValue;
skyEl.setAttribute(‘aria-label’, ‘Current condition: ‘ + skyValue);
}
var feelsEl = container.querySelector(‘.weather-grid–feels’);
if (feelsEl) {
feelsEl.textContent = feelsLikeValue + ‘°F’;
feelsEl.setAttribute(‘aria-label’, feelsLikeValue + ‘ degrees Fahrenheit’);
}
Advertisement
var weatherContainer = container.querySelector(‘.weather-temp-container’);
if (weatherContainer) {
var summary = ‘Current temperature ‘ + tempValue + ‘ degrees Fahrenheit, ‘ +
skyValue + ‘, feels like ‘ + feelsLikeValue + ‘ degrees’;
weatherContainer.setAttribute(‘aria-label’, summary);
}
function updateForecastTabs(weatherData) {
var visibleItems = isWeatherBoxV2 ? 6 : 5;
if (weatherData.hourly) {
var hourlyContainer = container.querySelector(‘.weather-hourly-forecast’);
if (hourlyContainer) {
var html=””;
var maxHours = Math.min(visibleItems, weatherData.hourly.length);
Advertisement
for (var i = 0; i 0 ? currentIndex – 1 : tabs.length – 1;
tabs[prevIndex].focus();
break;
case ‘ArrowRight’:
e.preventDefault();
var nextIndex = currentIndex