"I was having my boyfriend help me a lot; It was awful; There were a lot of tears" – Danielle Collins on physical struggles in the days leading up to Miami Open triumph – Sportskeeda
Newly crowned 2024 Miami Open champion Danielle Collins recently shed light on her injury woes in the days leading up to the tournament.
Collins, who announced 2024 as her final season earlier this year, beat repeat finalist Elena Rybakina 7-5, 6-3 to win her first title at a WTA 1000 tournament on Saturday, March 30.
In her press conference following the victory, the Floridian was asked if she saw herself as a title contender before the tournament.
“Two weeks ago looked a little different,” she responded.
It’s worth noting that just before her Sunshine Double campaign, Danielle Collins suffered a back injury in the quarterfinals of the ATX Open, which forced her to retire from the tournament mid-match.
“I was coming off a back injury that happened in Austin. I was devastated not to be able to finish out that tournament,” Collins said.
Despite the setback, the American competed in Indian Wells, bowing out against eventual champion Iga Swiatek in the second round. She shared crushing behind-the-scenes details of her run in the desert.
“I went to Indian Wells and had multiple days off in a row. I had a few days, not exaggerating, I literally couldn’t walk. I was having to have my boyfriend help me a lot.
“It was awful. There were a lot of tears about, oh, my gosh, I have played all these tournaments, I have worked so hard for this, and now we’re at Indian Wells and Miami and this is happening, like, why?” Danielle Collins recalled.
Danielle Collins on battling injury to win Miami Open: “What makes these players the best in the world is they learn how to play around those things”
Danielle Collins said that her early Indian Wells exit allowed her a few good practices before the 2024 Miami Open. She also noted that her condition improved considerably with the help of physical therapy.
“Luckily with I think the help of the physical therapy and chiropractor we were able to kind of get it under control and make some adjustments too with some of my training and recovery and got it to a place where it was more manageable. After Indian Wells I was able to get a couple good days of practice,” Danielle Collins said in the aforementioned press conference.
“I felt pretty confident, but it was still the amount of time that I was practicing on court and the type of drills that we were doing, I was, like, this is going to be hard, going into Miami,” she added.
The former World No. 7 lost her opening set of the Miami Open against first-round opponent Bernarda Pera but won her next 14 sets en route the title.
After her comeback win against Pera, she beat Anastasia Potapova, Elina Avanesyan, Sorana Cirstea, Caroline Garcia and Ekaterina Alexandrova to book her place in the title clash.
“When I came out in the first round, I had a tough match against Pera. I was happy to really get through that. But I also did a great job of putting all that fear of, oh, am I doing enough, am I not doing enough, am I too injured, am I too this, too that?” she said.
Collins said that the main takeaway for her was how she overcame the challenges along the way at the Miami Open.
“I think what makes some of these players the best in the world is that they learn how to play around those things.
“That’s the thing that I have learned the most this tournament is, okay, it’s never going to be 100% and you’ve got to figure out a way to, even though you have those challenges, work through it and get through it.”
function KeedaCarousalControlsHelper(input)
threshold: 1
;
KeedaCarousalControlsHelper.prototype.observeTarget = function() {
var self = this;
var firstItem = this.target.firstElementChild;
var lastItem = this.target.lastElementChild;
var allChildren = this.target.children;
var firstItem, lastItem;
for (var i = 0; i = 0; i–)
if (!allChildren[i].classList.contains(“hidden”))
lastItem = allChildren[i];
break;
this.firstItemObserver = new IntersectionObserver(function(entries)
entries.forEach(function(entry)
if (entry.isIntersecting)
self.whenFistItemInViewport(entry);
else
self.whenFistItemNotInViewport(entry);
)
, this.options);
this.lastItemObserver = new IntersectionObserver(function(entries)
entries.forEach(function(entry)
if (entry.isIntersecting)
self.whenLastItemInViewport(entry);
else
self.whenLastItemNotInViewport(entry);
)
, this.options);
firstItem && this.firstItemObserver.observe(firstItem);
lastItem && this.lastItemObserver.observe(lastItem);
if (typeof self.whenCarouselInViewport == “function” && typeof self.whenCarouselNotInViewport == “function”)
this.carouselObserver = new IntersectionObserver(function(entries)
entries.forEach(function(entry)
if (entry.isIntersecting)
self.whenCarouselInViewport(entry);
else
self.whenCarouselNotInViewport(entry);
)
);
function closeAllDropDown()
var nodes = $all(".drop-down-menu");
var menu = $all(".wiki-menu-item .drop-down-icon");
if (menu && menu.length)
for(var i = 0; i < menu.length; i++)
menu[i].style.transform = "scale(1.5)";
if (nodes && nodes.length)
for(var i = 0; i < nodes.length; i++)
nodes[i].classList.add("hidden");
function trackScrollableMenuClick(name, pageType)
(function()
if (typeof initScrollableMenu === “function”)
initScrollableMenu();
var addratingAPI = ‘https://gotham.sportskeeda.com/post-rating’;
var getRatingCountBaseURL = ‘https://polls.sportskeeda.com/post-rating/’;
var ratingValue = 0;
var userRatedPostIds = getCookie(‘user_rated_post_ids’);
if (!userRatedPostIds) userRatedPostIds = [];
else
try
userRatedPostIds = JSON.parse(userRatedPostIds);
catch (err)
console.error(err);
userRatedPostIds = [];
if (userRatedPostIds.indexOf(1925503) >= 0)
$(“#post-rating-layout”).classList.add(“hidden”);
function ratePost(index)
ratingValue = index;
var theStarClasses = Array.from($(“#star-” + index).classList);
if (theStarClasses.indexOf(“active”) < 0)
for (var i=1; i index; i–)
$(“#star-” + i).classList.remove(“active”);
if (index <= 3)
var ratingStars = document.getElementsByClassName("rating-star");
var modalText = "
“;
modalText += “
“;
modalText += “
“;
modalText += “
“;
modalText += “
“;
modalText += “
“;
modalText += “
“;
modalText += “
“;
modalText += “
”
modalText += “
Please select an option.
Please provide your feedback.
”
modalText += “
”
modalPopup.closeOnEsc = false;
modalPopup.setHeader(“Why did you not like this content?”);
modalPopup.setContentText(modalText);
modalPopup.addCancelOkButton(“Submit”, resetRatingAndFeedbackForm, sendRating);
modalPopup.removeCloseModalIcon();
modalPopup.disableDismissPopup();
modalPopup.open();
else
sendRating(index);
function sendRating()
var requestPayload =
“post_id”: 1925503,
“rating_value”: ratingValue
function resetRatingAndFeedbackForm()
var activeStars = Array.from($all(‘.rating span.rating-star.active’));
for (var i=0; i = 0)
return true;
else
return false;
function getRatingCountByPostId(postId) {
return new Promise(function(resolve, reject)
pureJSAjaxGet(
getRatingCountBaseURL + postId + ‘/rating/count’,
function(data)
try
data = JSON.parse(data);
if (data.meta_value)
resolve(data.meta_value);
reject(“Failed to fetch rating count for the post:” + postId);
catch (err)
reject(“Failed to fetch rating count for the post:” + postId);
,
function(err)
reject(“Failed to fetch rating count for the post:” + postId);
, true);
);
}
function showErrorMessage(messageType)
var messageContainerId = ‘#’ + messageType + ‘-error’;
$(messageContainerId).classList.remove(‘hidden’);
window.setInterval(function ()
$(messageContainerId).classList.add(“hidden”);
, 5000);
(function() {
var callFired = false;
function lazyLoadPostRating()
if (callFired) return;
callFired = true;
if (!isPostRatedByUser())
getRatingCountByPostId(1925503)
.then(function(ratingCount)
if (ratingCount < 10)
$("#post-rating-widget").classList.remove("hidden");
if ($(".comments-total-container"))
$(".comments-total-container").addEventListener("click", function ()
var gaObject =
'event_category': "Comments",
'event_label': "No_of_comments",
var sessionCookieValue = getCookie("keeda-session-uuid");
if (sessionCookieValue)
gaObject['keeda-session-uuid'] = sessionCookieValue;
var userID = getCookie("fw_ID");
if (userID)
gaObject['loggedIn_user_id'] = userID;
gtag('event', 'click', gaObject);
)
if ($(".comments-total-container-bottom"))
$(".comments-total-container-bottom").addEventListener("click", function ()
var gaObject =
'event_category': "Comments",
'event_label': "No_of_comments_bottom",
var sessionCookieValue = getCookie("keeda-session-uuid");
if (sessionCookieValue)
gaObject['keeda-session-uuid'] = sessionCookieValue;
var userID = getCookie("fw_ID");
if (userID)
gaObject['loggedIn_user_id'] = userID;
gtag('event', 'click', gaObject);
)
document.addEventListener("click", trackBelowContentFeedClick.bind(this));
var followButtons = $all('.btn-follow');
var followButtons = $all('.follow-btn');
var authorId;
var source;
/* for user profile page */
function displayFollowContent()
addClass($('.follow-pc'),'hidden');
removeClass($('.follow-content .author-profile-info'), 'hidden');
removeClass($('.follow-content .follow-author'),'hidden');
function followCallback (resp) {
data = JSON.parse(resp);
displayFollowContent();
for(i=0;i<followButtons.length;i++)
if (data.status == true)
removeClass(followButtons[i], "follow");
addClass(followButtons[i], "following");
removeClass(followButtons[i], "hidden");
if(source == "article")
followButtons[i].querySelector('span').innerText = "Following";
if (followButtons[i].querySelector('img'))
followButtons[i].querySelector('img').remove();
function logCopyEvent()
var payload = event_type: "copy", post_id: 1925503 ;
pureJSAjaxPost(trackCopyURL, payload, function() , function ()
console.error('Failed to save copy event');
, null, true);
);
(function()
var followUsCTA = $(".follow-us-cta");
function followUsGoogleNews()
window.addEventListener(“scroll”, followUsGoogleNews);
)();
var followUsCTAs = $all(“.follow-action”);
for (var i = 0; i < followUsCTAs.length; i++)
followUsCTAs[i].addEventListener("click", function(e)
var element = e.currentTarget;
var elementClass = element.getAttribute("class");
var payload = "news-i-boyfriend-help-lot-it-awful-there-lot-tears-danielle-collins-physical-struggles-miami-open-triumph",
"device": "Desktop"
if (elementClass.includes("follow-us-cta"))
payload["position"] = "header";
else if (elementClass.includes("follow-action-bottom"))
payload["position"] = "bottom";
else
payload["position"] = "top";
gtag("event", "Follow_Us", payload);
);
(function()
var article_sponserd_links = $all(“.sponsored_link”);
for (var i = 0; i < article_sponserd_links.length; i++)
article_sponserd_links[i].addEventListener("click", function(element) "news-i-boyfriend-help-lot-it-awful-there-lot-tears-danielle-collins-physical-struggles-miami-open-triumph";
var isDesktop = "1";
var payload =
"sponsed_link": element.target.href,
"sponsed_link_text": element.target.innerHTML,
"page_url": window.location.href,
"category": sportCategory,
if (isDesktop)
payload["device"] = "Desktop"
else
payload["device"] = "Mobile"
var bottom_tagline_links = document.querySelectorAll('.bottom_tagline_link');
for (var i = 0; i < bottom_tagline_links.length; i++)
bottom_tagline_links[i].addEventListener('click', trackBottomTaglineClickEvent.bind(this));
var bottom_tagline_video_links = document.querySelectorAll('.bottom-tagline-video-link');
for (var i = 0; i < bottom_tagline_video_links.length; i++)
bottom_tagline_video_links[i].addEventListener('click', trackBottomTaglineClickEvent.bind(this));
function trackBottomTaglineClickEvent(element)
var taglinePosition = element.currentTarget.getAttribute("data-tab");
var taglineUrl = element.currentTarget.getAttribute("href");
var payload =
"tagline_position": taglinePosition,
"destination_url": taglineUrl
trackGAEvent("Clicks_BottomTagline", payload);
var bottom_tagline_text_container = document.querySelectorAll('.bottom-tagline');
for (var i = 0; i < bottom_tagline_text_container.length; i++)
trackBottomTaglineImpression(bottom_tagline_text_container[i]);
var bottom_tagline_video_container = document.querySelectorAll('.bottom-tagline-video');
for (var i = 0; i < bottom_tagline_video_container.length; i++)
trackBottomTaglineImpression(bottom_tagline_video_container[i]);
var bottom_tagline_promo_container = document.querySelectorAll('.bottom-tagline-banner');
for (var i = 0; i < bottom_tagline_promo_container.length; i++)
trackPromoBannerImpression(bottom_tagline_promo_container[i]);
var bannerLink = bottom_tagline_promo_container[i].querySelector('.bottom-tagline-banner-link');
if (bannerLink)
bannerLink.addEventListener('click', trackPromoBannerClickEvent);
function trackPromoBannerClickEvent(e)
var target = e.target.closest(".bottom-tagline-banner-link");
if (!target) return;
var taglinePosition = target.getAttribute("data-tab");
var taglineUrl = target.getAttribute("href");
trackGAEvent("TAGLINE_CLICK",
"position": taglinePosition,
"variant": "promo-banner",
"destination_url": taglineUrl
);
function trackBottomTaglineImpression(element)
var taglinePosition = element.getAttribute("data-tab");
trackImpressionGAEventWhenInViewport(
element: element,
identifier: "element_" + taglinePosition,
eventName: "Tagline_Impression",
eventParams:
"tagline_position": taglinePosition,
);
function trackPromoBannerImpression(element)
var taglinePosition = element.getAttribute("data-tab");
trackImpressionGAEventWhenInViewport(
element: element,
identifier: "tagline_promo_banner_" + taglinePosition,
eventName: "TAGLINE_IMPRESSION",
eventParams:
"position": taglinePosition,
"variant": "promo-banner",
);
// this will fire ga event on anchor tag clicks in article page
var hyperLinks = $all("#article-content p a, #article-content table a");
for (var i = 0; i < hyperLinks.length; i++)
var hyperLink = hyperLinks[i];
hyperLink.addEventListener("click", sendHyperlinkClickedGAEvent);
function sendHyperlinkClickedGAEvent()
trackGAEvent("Clicks_hyperlinks",
destURL: this.href,
);
)();
(function() {
var spotifyMonitor = setInterval(function()
var elem = document.activeElement;
if (elem && elem.tagName == “IFRAME”)
var src = elem.getAttribute(“src”);
if (src && src.indexOf(“open.spotify.com”) > -1)
clearInterval(spotifyMonitor);
gtag(“event”, “ARTICLE_EMBED_CLICK__SPOTIFY”,
link: window.location.href
);
, 100);
})();
(function() {
function lazyTweetLoader()
var twitterEmbeds = document.querySelectorAll(“.hidden-lazy”);
var intersectionObserverForLazyHidden = new IntersectionObserver(
function(entries)
entries.forEach(function(entry)
if (entry.isIntersecting)
var verifiedElement = entry.target.querySelector(“.verified”);
removeClass(verifiedElement, “hidden”);
var likeElement = entry.target.querySelector(“.tweet-like-icon”);
removeClass(likeElement, “hidden”);
var retweetElement = entry.target.querySelector(“.tweet-retweet-icon”);
removeClass(retweetElement, “hidden”);
var twitterLogoElement = entry.target.querySelector(“.tweet-logo”);
removeClass(twitterLogoElement, “hidden”);
(function() {
var postId = “1925503”;
if (!postId)
return;
var commentsBadgeElements = $all(“.comments–badge”);
document.addEventListener(“DOMContentLoaded”, function()
var apiURL = “https://www.sportskeeda.com/comments/count/” + postId + “/ajax”;
pureJSAjaxGetWithPromise(apiURL).then(function(res)
try
var data = JSON.parse(res);
if (data.comments_count)
updateCommentBadgeElements(data.comments_count);
catch (e)
console.error(e);
);
);
function updateCommentBadgeElements(count)
for (var i = 0; i < commentsBadgeElements.length; i++)
}
})();
#sk-timeline #stories-list
background:#fff;
.recommended-posts
margin:20px auto 0;
var taboolaScriptLoaded = false;
window._taboola = window._taboola || [];
_taboola.push( article: ‘auto’ );
(function()
var userCountry = getCookie(“country_code”);
var IS_GDPR_APPLICABLE = getCookie(COOKIE_GDPR) == “true”;
if (![“IN”].includes(userCountry))
if (window.performance && typeof window.performance.mark == ‘function’)
window.performance.mark(‘tbl_ic’);
var scriptInput =
src: “https://cdn.taboola.com/libtrc/sportskeedaindia/loader.js”,
loadWithDefer: true,
onUserInteraction: true,
attributes: [
key: “id”,
value: “tb_loader_script”
]
;
function loadTaboolaScript()
if (!taboolaScriptLoaded)
taboolaScriptLoaded = true;
asyncScriptLoader(scriptInput);
(function() {
var isOpera = “”;
var showAlsoReadSection = “”;
var showAlsoReadSectionV2 = “”;
var showAlsoReadTagBasedRecommendation = “”;
function renderRecommendedArticles(data)
var recommendedArticlesContainer = document.querySelector(‘.recommended-articles’);
data = JSON.parse(data);
if (showAlsoReadSection && !showAlsoReadSectionV2 && !showAlsoReadTagBasedRecommendation)
if (data.recommended_posts && data.recommended_posts.length > 2)
var alsoReadArticles = data.recommended_posts.splice(0, 2);
renderAlsoReadArticles(alsoReadArticles);
var recommendedPosts = data.recommended_posts;
if (recommendedPosts && recommendedPosts.length > 0)
recommendedPosts.forEach(function (story, index)
var storyTitle = encodeURIComponent(story.title);
var permalink = story.permalink;
if (isOpera)
permalink = permalink.replace(“https://www.sportskeeda.com/”, “/”);
function recommendedArticles()
var baseUrl = “https://cf-gotham.sportskeeda.com/recommendations/post/news-i-boyfriend-help-lot-it-awful-there-lot-tears-danielle-collins-physical-struggles-miami-open-triumph?lang=en&category=tennis”;
pureJSAjaxGet(baseUrl, function(data)
renderRecommendedArticles(data);
if (isOpera)
renderOperaFeedAd();
, function() , false);
var options =
root: null,
rootMargin: “0px 0px 70% 0px”,
threshold: 0.1
;
var observer = new IntersectionObserver(function (entries)
entries.forEach(function (entry)
if (entry.isIntersecting)
recommendedArticles();
observer.unobserve(entry.target);
);
, options);
var targetElement;
if (showAlsoReadSection && !showAlsoReadSectionV2)
targetElement = document.querySelector(‘.also-read-articles-container’);
else
targetElement = document.querySelector(‘.recommended-posts’);
if (targetElement)
observer.observe(targetElement);
@media screen and (max-width: 768px)
.spotlight-layout, .timless-posts-layout
margin: 8px 0;
Fetching more content…
var socialStoriesObserved = ;
var videoPlayedEventTriggered =
var socialStoriesIOConfig =
root: null,
rootMargin: “0px”,
threshold: 0.5
var socialStoriesIntersectionObserver = new IntersectionObserver(handlerForSocialStoryIO, socialStoriesIOConfig);
function handlerForSocialStoryIO(entries)
entries.forEach(function(entry)
var targetEle = entry.target;
if (entry.isIntersecting)
var videoEle = targetEle.querySelector(“video”);
if (videoEle)
var postId = targetEle.dataset.id;
socialStoriesIntersectionObserver.unobserve(targetEle);
setEventListenerForVideoPlay(videoEle, postId, targetEle.dataset);
else
targetEle.setAttribute(“data-visible-start”, Date.now());
targetEle.removeAttribute(“data-visible-end”);
return
if (entry.boundingClientRect.top 2000)
// post viewed for more than 2 seconds
sendPageViewTracking(dataset);
socialStoriesIntersectionObserver.unobserve(targetEle);
)
}
function sendPageViewTracking(dataset) “”) +
‘&tt_id_json=’ + (dataset.ttIds
// sends page view event for the social post to GA
function sendGAPageViewEventForSocialPost(url)
if (!gtag) return;
gtag(‘config’, ‘G-T41EZF14QW’, ‘page_path’: url );
function setIntersectionObserverSocialPosts()
var socialStories = $all(“.social-story-wrapper .list-story-link”);
for (var i = 0; i < socialStories.length; i++)
function setEventListenerForVideoPlay(videoEle, postId, dataset) !postId) return;
videoEle.addEventListener("play", function()
if (!!videoPlayedEventTriggered[postId])
return;
function getScrollHeight(elm)
var savedValue = elm.value;
elm.value = "";
elm._baseScrollHeight = elm.scrollHeight;
elm.value = savedValue;
function initGifTagScroll()
var tagsContainer = document.querySelector(".gif-display-tags");
var leftScrollButton = document.querySelector(".scroll-left-button");
var rightScrollButton = document.querySelector(".scroll-right-button");
leftScrollButton.onclick = function ()
tagsContainer.scrollBy(
behavior:"smooth",
top: 0,
left: -450
);
var isCommentsScriptLazyLoaded = false;
var isCommentPopupVisible = false;
var currentShownId = null;
function isValidURL(string)
var res = string.match(/(http(s)?://.)?(www.)?[-a-zA-Z0-9@:%._+~#=]2,256.[a-z]2,6b([-a-zA-Z0-9@:%_+.~#?&//=]*)/g);
return (res !== null)
;
function setUrlParam(key, value)
var url = new URL(window.location.href);
url.searchParams.set(key, value);
window.history.replaceState(null, null, url);
function getUrlParamByKey(key)
var url = new URL(window.location.href);
return url.searchParams.get(key);
function deleteUrlParam(key)
var url = new URL(window.location.href);
url.searchParams.delete(key);
window.history.replaceState(null, null, url);
function storeStoryDetailsAndToggleFeedComment(element, story)
var id = element.dataset.id;
if (!id) return;
var ssKey = new Date().getTime();
sessionStorage.setItem(“comment_meta_” + ssKey, JSON.stringify());
setUrlParam(“comment-meta-id”, ssKey);
setUrlParam(“comment-popup”, “1”);
toggleCommentsPopup(ssKey, false);
function toggleCommentsPopup(ssKey, doScroll)
var sessionStorageData = sessionStorage.getItem(“comment_meta_” + ssKey);
if (!sessionStorageData) return;
var commentData = ;
try
commentData = JSON.parse(sessionStorageData);
catch (e)
console.error(e);
return;
if (!commentData.id) return;
if (isCommentPopupVisible && commentData.id == currentShownId)
hideCommentsContainer(true);
return;
var popover = document.getElementById(“feed-comments-popover”);
if (!popover) return;
popover.classList.remove(“inactive”);
showCommentPopupArticleInfo(commentData.title, commentData.href);
var articleLink = commentData.href + window.location.search;
if (!isValidURL(articleLink))
articleLink = window.location.origin + articleLink;
var isDesktop = “1”;
if (commentData.id)
payload[“post_id”] = commentData.id;
if (articleLink)
payload[“destination_url”] = window.location.origin + commentData.href;
if (isDesktop)
payload[“device”] = “Desktop”;
else
payload[“device”] = “Mobile”;
if (typeof trackGAEvent != “undefined”)
trackGAEvent(“comment_icon_click”, payload);
if (doScroll && commentData.scrollY)
window.scrollTo(0, commentData.scrollY);
addListenerToCommentBox();
function getGALabelForFeedCommentClick(type)
if (type === “tweet”)
return “Social_Twitter_Comment_Button”;
else if (type === “youtube”)
return “Social_Youtube_Comment_Button”;
else if (type === “instagram”)
return “Social_Instagram_Comment_Button”;
return “Article_Comment_Button”;
function hideCommentsContainer(fromWindowPop)
if (!isCommentPopupVisible)
return;
isCommentPopupVisible = false;
currentShownId = null;
var popover = document.getElementById(“feed-comments-popover”);
if (!popover) return;
deleteUrlParam(‘comment-meta-id’);
deleteUrlParam(‘comment-popup’);
popover.classList.add(“inactive”);
if (!fromWindowPop)
window.history.back();
if (typeof trackGAEvent != “undefined”)
trackGAEvent(“comment_popup_close”);
function showCommentPopupArticleInfo(title, href)
var articleInfoContainer = document.getElementById(“comments-article-info”);
if (!articleInfoContainer) return;
if (!title)
articleInfoContainer.classList.add(“hidden”);
else
articleInfoContainer.classList.remove(“hidden”);
var titleEle = articleInfoContainer.querySelector(“.comments-article-title”);
if (titleEle)
try
titleEle.innerText = decodeURIComponent(title);
catch (e)
titleEle.innerText = title;
titleEle.dataset.href = href;
function toggleCommentsPopupOnPageLoad()
if (!getUrlParamByKey(“comment-popup”) == “1”)
return
var ssKey = getUrlParamByKey(‘comment-meta-id’);
if (!ssKey)
return;
toggleCommentsPopup(ssKey, true);
window.onpopstate = function()
// Back button handler, along with hash it’ll hide the popover comments UI
hideCommentsContainer(true);
function getScrollHeight(elm)
var savedValue = elm.value;
elm.value = “”;
elm._baseScrollHeight = elm.scrollHeight;
elm.value = savedValue;
var SKCampaignVideoPlayerManager = (function() {
var USER_COUNTRY = getCookie(“country_code”);
var PLAYERS_ON_INTERACTION = “”;
var SHOW_ADS = “”;
var videoPlayerInitObserver = new IntersectionObserver(function(entries)
entries.forEach(function(entry)
if (entry.target && entry.isIntersecting)
videoPlayerInitObserver.unobserve(entry.target);
loadVideoPlayer(entry.target);
);
,
threshold: 0.3
);
var videoPlayerIntersectionObserver = new IntersectionObserver(function(entries)
entries.forEach(function(entry)
if (entry.target)
if (entry.isIntersecting)
playVideo(entry.target);
else
pausePlayer(entry.target);
);
,
threshold: 0.0
);
function getPlayerById(playerId)
var player = videojs.players[playerId];
return player;
function playVideo(playerContainer)
var playerId = playerContainer.querySelector(“.sk-video-player-video-js”).id;
var player = getPlayerById(playerId);
player.play();
function pausePlayer(playerContainer)
var playerId = playerContainer.querySelector(“.sk-video-player-video-js”).id;
var player = getPlayerById(playerId);
player.pause();
function shuffleVideos(videos)
// Uses the Durstenfeld Shulffle Algo
for (var i = videos.length – 1; i > 0; i–)
var j = Math.floor(Math.random() * (i + 1));
var temp = videos[i];
videos[i] = videos[j];
videos[j] = temp;
function trackPlayerLoaded(playerId)
trackGAEvent(“sk_campaign_video_player”,
“video_player_id”: playerId,
“event_category”: “player_load”,
“country”: USER_COUNTRY
);
function trackVideoPlayed(playerId, videosConfig)
var player = getPlayerById(playerId);
var videoIdx = player.playlist.currentIndex();
var videoTitle = videosConfig[videoIdx].title;
trackGAEvent(“sk_campaign_video_player”,
“video_player_id”: playerId,
“event_category”: “video_played”,
“video_index”: videoIdx,
“video_title”: videoTitle,
“country”: USER_COUNTRY
);
function loadVideoPlayer(playerContainer) []);
var isMuted = videoPlayerElement.getAttribute(“muted”);
var autoPlay = videoPlayerElement.getAttribute(“autoplay”);
var closeBtnElement = playerContainer.querySelector(“.close-btn”);
var isPlayerApplicable = checkCountryRestriction(playerContainer, videoPlayerElement);
if (!isPlayerApplicable)
return;
if (videoPlayerElement.getAttribute(“shuffle”))
shuffleVideos(videosConfig);
player = videojs(videoPlayerId,
nativeControlsForTouch: true,
);
if (autoPlay)
videoPlayerIntersectionObserver.observe(playerContainer);
else
player.one(‘play’, function()
videoPlayerIntersectionObserver.observe(playerContainer);
);
player.fluid(true);
if (isMuted && autoPlay)
player.autoplay(‘muted’);
player.playlist(videosConfig);
player.playlist.autoadvance(0);
player.playlist.repeat(true);
player.addClass(‘vjs-sk-skin’);
player.on(‘fullscreenchange’, function(e)
if (player.isFullscreen())
screen.orientation.lock(‘landscape’);
);
player.one(‘ready’, function()
removeClass($(`#$ videoPlayerId `), “hidden”);
trackPlayerLoaded(videoPlayerId);
);
player.one(‘play’, function()
player.on(‘playlistitem’, function()
trackVideoPlayed(videoPlayerId, videosConfig);
);
// track video playing for first time
trackVideoPlayed(videoPlayerId, videosConfig);
);
closeBtnElement.addEventListener(“click”, function ()
removeVideoPlayer(playerContainer);
);
function hideVideoPlayer(playerContainer)
pausePlayer(playerContainer);
addClass(playerContainer, “hidden”);
function removeVideoPlayer(playerContainer)
playerContainer.remove();
function checkCountryRestriction(playerContainer, videoPlayerElement)
var user_country = getCookie(“country_code”);
var includeCountries = videoPlayerElement.getAttribute(“data-include-countries”);
var excludeCountries = videoPlayerElement.getAttribute(“data-exclude-countries”);
if (includeCountries)
includeCountries = includeCountries.split(“,”);
if (includeCountries.indexOf(user_country) == -1)
hideVideoPlayer(playerContainer);
return false;
else if (excludeCountries)
excludeCountries = excludeCountries.split(“,”);
if (excludeCountries.indexOf(user_country) >= 0)
hideVideoPlayer(playerContainer);
return false;
return true;
function initVideoPlayers(videoContainers)
videoContainers.forEach(function(videoContainer)
videoPlayerInitObserver.observe(videoContainer);
);
function init()
var videoContainers = $all(“.sk-video-player-container”);
if (!videoContainers)
return;
;
var promisesToEvaluate = [
asyncScriptLoader(
src: “https://www.sportskeeda.com/js/videojs/videojs-common-v1.js”,
loadWithDefer: true,
onUserInteraction: PLAYERS_ON_INTERACTION
)
];
if (SHOW_ADS)
promisesToEvaluate.push(asyncScriptLoader(
src: “https://imasdk.googleapis.com/js/sdkloader/ima3.js”,
loadWithDefer: true,
onUserInteraction: PLAYERS_ON_INTERACTION
));
(function()
function isPlayerApplicable()
var countryCode = getCookie(“country_code”);
if ([“IN”].includes(countryCode))
addClass($(“.sidebar-ad-top”), “hidden”);
addClass($(“.player_games-of-future-campaign-player_sidebar”), “active”);
var SKTrackingModule = (function () {
var COOKIE_NAME = ‘HP_ALGO_DATA_V2’;
var DATASET_SIZE = 10;
var CLIPPING_SIZE = 100;
function getTrackingCookie(cname, defaultValue)
var name = cname + “=”;
var ca = document.cookie.split(‘;’);
for(var i = 0; i = CLIPPING_SIZE)
item[‘value’] = CLIPPING_SIZE.toString();
var clipAll = true;
else
item[‘value’] = item[‘value’].toString();
return
‘value’: item,
‘clipAll’: clipAll
;
function clippingMechanism(data, key)
if (data[key].length >= DATASET_SIZE * 2)
return data[key].slice(0, DATASET_SIZE);
else
return data[key];
function track(cname, key, identifier, title) {
var data = getTrackingCookie(cname, ”);
data = JSON.parse(data);
if (!data.hasOwnProperty(key) || key == ‘sport’)
data = initializeJSONDataStructure(data, key, identifier, title);
else
var item = data[key].filter(function(item)
return item.name == identifier;
);
if (item.length > 0)
item = item[0];
var incrementResponse = incrementTrackingLogic(item);
item = incrementResponse[‘value’];
if (incrementResponse[‘clipAll’])
data[key].forEach(function(item)
item[‘value’] = parseInt(item[‘value’] / 2).toString();
);
else
data = initializeJSONDataStructure(data, key, identifier, title);
//see more logic
var contentHolder = $(‘.event-content’) || $(‘.taxonomy-content’);
var taxonomyImg = $(‘.taxonomy-img’);
var taxonomyInfo = $(‘.taxonomy-info’);
$(‘#hp_feed_select’) && $(‘#hp_feed_select’).addEventListener(‘change’, function()
document.body.scrollTop = document.documentElement.scrollTop = 0;
);
function seeMoreStats(ele) //show all stats rows
var rows = $all(‘.season-stats-tr’);
for (i in rows)
if(hasClass(rows[i], “hidden”))
removeClass(rows[i], “hidden”);
var toggleButton = $(‘.see-less-stats’);
if(hasClass(toggleButton, “hidden”))
removeClass(toggleButton, “hidden”);
addClass(ele, “hidden”);
function seeLessStats(ele) //show less stats rows
var rows = $all(‘.season-stats-tr’);
for (i in rows)
if(!hasClass(rows[i], “hidden”) && i >= 5)
addClass(rows[i], “hidden”);
var toggleButton = $(‘.see-more-stats’);
if(hasClass(toggleButton, “hidden”))
removeClass(toggleButton, “hidden”);
var NewCommentNotification = (function () {
var commentsLoaded = false;
var COMMENT_ACTION_STATUS =
APPROVED: “approved”,
REJECTED: “rejected”,
DELETE: “delete”
var commentsCount = 0;
var COMMENT_ACTION_RESPONSE_ITEMS =
“approved”:
“text”: “This comment is approved ????”,
“class”: “approved-text”
,
“delete”:
“text”: “This comment is deleted ❌”,
“class”: “rejected-text”
var moderationCountHTMLElement;
function getPendingCommentsCount()
return new Promise(function (resolve, reject)
pureJSAjaxGetWithCredentialsFlag(‘https://a-login.sportskeeda.com/en/comment-moderation/pending/count’, function (data)
try
var parsedData = JSON.parse(data);
resolve(parsedData);
catch (exception)
reject(exception)
, function (err)
reject(err)
, true)
)
function getIncomingComments()
return new Promise(function (resolve, reject)
pureJSAjaxGetWithCredentialsFlag(‘https://a-login.sportskeeda.com/en/comment-moderation/incoming’, function (data)
if (typeof data === “string”)
data = JSON.parse(data);
resolve(data);
, function (err)
reject(err)
, true)
);
function onCommentActionClick(container, comment, statusToBeUpdated)
// invalid status update check
if (!Object.values(COMMENT_ACTION_STATUS).includes(statusToBeUpdated))
return;
pureJSAjaxPut(‘https://a-login.sportskeeda.com/en/comment-moderation/update-status’,
Object.assign(comment, id: comment.ID, status: statusToBeUpdated ),
function (result)
commentsCount = Math.max(0, commentsCount – 1);
moderationCountHTMLElement.innerText = commentsCount > 0 ? commentsCount : ”;
var commentResponseItem = COMMENT_ACTION_RESPONSE_ITEMS && COMMENT_ACTION_RESPONSE_ITEMS[statusToBeUpdated];
if (commentResponseItem)
var card = container.querySelector(‘div[data-notification-id=”‘ + comment.ID + ‘”]’);
var cardActionResult = card.getElementsByClassName(‘kcn-action’)[0];
if (cardActionResult)
cardActionResult.innerText = commentResponseItem.text;
cardActionResult.classList.add(commentResponseItem.class);
,
function (err)
console.log(err);
,
null, true
);
function displayNewCommentNotifications(container) {
getIncomingComments().then(function (comments)
if (comments.error == true)
container.style.display = “none”;
return;
var cardsContainer = container.querySelector(‘.kcn-card-container’);
if(comments.length > 0)
container.style.display = “block”;
cardsContainer.innerHTML = ”;
comments.forEach(function (comment, index)
var notificationCardTemplate = container.querySelector(‘#kcn-card’);
var notificationCard = notificationCardTemplate.content.cloneNode(true);
var notificationCardWrapper = notificationCard.querySelector(‘.kcn-card-wrapper’);
notificationCardWrapper.setAttribute(‘data-notification-id’, comment.ID);
var notificationText = notificationCard.querySelector(‘.kcn-comment-text’);
notificationText.innerHTML = comment.comment_text;
var keedaPostLink = notificationCard.querySelector(‘.keeda-posts-link’);
keedaPostLink.href = comment.permalink;
notificationCardWrapper.querySelector(‘.approve’).addEventListener(‘click’, function ()
onCommentActionClick(container, comment, COMMENT_ACTION_STATUS.APPROVED);
);
notificationCardWrapper.querySelector(‘.delete’).addEventListener(‘click’, function ()
onCommentActionClick(container, comment, COMMENT_ACTION_STATUS.DELETE);
);
cardsContainer.appendChild(notificationCard);
);
else
container.style.display = “block”;
cardsContainer.innerHTML = “No new comments”;
function toggleContainerVisibility(container)
var kcnContentContainer = container.querySelector(‘#kcn-comment-container’);
var kcnPointer = container.querySelector(‘#kcn-pointer’);
if (kcnContentContainer)
kcnContentContainer.classList.toggle(‘hidden’);
if (kcnPointer)
kcnPointer.classList.toggle(‘hidden’);
function addClickHandler(container, clickCallback)
var iconContainerElement = container.querySelector(‘#kcn-comment-info-holder’);
iconContainerElement.addEventListener(“click”, function (event)
toggleContainerVisibility(container);
if (!commentsLoaded)
commentsLoaded = true;
var cardsContainer = container.querySelector(‘.kcn-card-container’);
if (cardsContainer)
cardsContainer.innerHTML = “Loading comments…”;
displayNewCommentNotifications(container);
);
function init (element)
addClickHandler(element);
displayPendingCommentsCount(element);
moderationCountHTMLElement = document.getElementById(“kcn-comment-count”);
return
init: init
})();
function initCommentNotifications(capabilities)
if(window.innerWidth < 340
GUADALAJARA, Mexico – Canada’s Marina Stakusic fell 6-4, 6-3 to Poland’s Magdalena Frech in the quarterfinals of the Guadalajara Open tennis tournament on Friday.
The 19-year-old from Mississauga, Ont., won 61 per cent of her first-serve points and broke on just one of her six opportunities.
Stakusic had upset top-seeded Jelena Ostapenko of Latvia 6-3, 5-7, 7-6 (0) on Thursday night to advance.
In the opening round, Stakusic defeated Slovakia’s Anna Karolína Schmiedlová 6-2, 6-4 on Tuesday.
The fifth-seeded Frech won 62 per cent of her first-serve points and converted on three of her nine break point opportunities.
This report by The Canadian Press was first published Sept. 13, 2024.
TORONTO – Alejandro Kirk’s long single with the bases loaded provided the Toronto Blue Jays with a walk-off 4-3 win in the 11th inning of their series opener against the St. Louis Cardinals on Friday.
With the Cardinals outfield in, Kirk drove a shot off the base of the left-field wall to give the Blue Jays (70-78) their fourth win in 11 outings and halt the Cardinals’ (74-73) two-game win streak before 30,380 at Rogers Centre.
Kirk enjoyed a two-hit, two-RBI outing.
Erik Swanson (2-2) pitched a perfect 11th inning for the win, while Cardinals reliever Ryan Fernandez (1-5) took the loss.
Blue Jays starter Kevin Gausman enjoyed a seven-inning, 104-pitch outing. He surrendered his two runs on nine hits and two walks and fanned only two Cardinals.
He gave way to reliever Genesis Cabrera, who gave up a one-out homer to Thomas Saggese, his first in 2024, that tied the game in the eighth.
The Cardinals started swiftly with four straight singles to open the game. But they exited the first inning with only two runs on an RBI single to centre from Nolan Arendao and a fielder’s choice from Saggese.
Gausman required 28 pitches to escape the first inning but settled down to allow his teammates to snatch the lead in the fourth.
He also deftly pitched out of threats from the visitors in the fifth, sixth and seventh thanks to some solid defence, including Will Wagner’s diving stop, which led to a double play to end the fifth inning.
George Springer led off with a walk and stole second base. He advanced to third on Nathan Lukes’s single and scored when Vladimir Guerrero Jr. knocked in his 95th run with a double off the left-field wall.
Lukes scored on a sacrifice fly to left field from Spencer Horwitz. Guerrero touched home on Kirk’s two-out single to right.
In the ninth, Guerrero made a critical diving catch on an Arenado grounder to throw out the Cardinals’ infielder, with reliever Tommy Nance covering first. The defensive gem ended the inning with a runner on second base.
St. Louis starter Erick Fedde faced the minimum night batters in the first three innings thanks to a pair of double plays. He lasted five innings, giving up three runs on six hits and a walk with three strikeouts.
ON DECK
Toronto ace Jose Berrios (15-9) will start the second of the three-game series on Saturday. He has a six-game win streak.
The Cardinals will counter with righty Kyle Gibson (8-6).
This report by The Canadian Press was first published Sept. 13, 2024.
CALGARY – Mired in their first four-game losing skid in 20 years, the Calgary Stampeders are going back to Jake Maier at quarterback on Saturday after he was benched for a game.
It won’t be an easy assignment.
Visiting McMahon Stadium are the Eastern Conference-leading Montreal Alouettes (10-2) who own the CFL’s best record. The Stampeders (4-8) have fallen to last in the Western Conference.
“Six games is plenty of time, but also it is just six games,” said Maier. “We’ve got to be able to get on the right track.”
Calgary is in danger of missing the playoffs for the first time since 2004.
“I do still believe in this team,” said Stampeders’ head coach and general manager Dave Dickenson. “I want to see improvement, though. I want to see guys on a weekly basis elevating their game, and we haven’t been doing that.”
Maier is one of the guys under the microscope. Two weeks ago, the second-year starter threw four interceptions in a 35-20 home loss to the Edmonton Elks.
After his replacement, rookie Logan Bonner, threw five picks in last week’s 37-16 loss to the Elks in Edmonton, the football is back in Maier’s hands.
“Any time you fail or something doesn’t go your way in life, does it stink in the moment? Yeah. But then the days go on and you learn things about yourself and you learn how to prepare a little bit better,” said Maier. “It makes you mentally tougher.”
Dickenson wants to see his quarterback making better decisions with the football.
“Things are going to happen, interceptions will happen, but try to take calculated risks, rather than just putting the ball up there and hoping that we catch it,” said Dickenson.
A former quarterback himself, he knows the importance of that vital position.
“You cannot win without good quarterback play,” Dickenson said. “You’ve got to be able to make some plays — off-schedule plays, move-around plays, plays that break down, plays that aren’t designed perfectly, but somehow you found the right guy, and then those big throws where you’re taking that hit.”
But it’s going to take a team effort, and that includes the club’s receiving corp.
“We always have to band together because we need everything to go right for our receivers to get the ball,” said Nik Lewis, the Stampeders’ receivers coach. “The running back has to pick up the blitz, the o-line has to block, the quarterback has to make the right reads, and then give us a catchable ball.”
Lewis brings a unique perspective to this season’s frustrations as he was a 22-year-old rookie in Calgary in 2004 when the Stamps went 4-14 under coach Matt Dunigan. They turned it around the next season and haven’t missed the playoffs since.”
“Thinking back and just looking at it, there’s just got to be an ultimate belief that you can get it done. Look at Montreal, they were 6-7 last year and they’ve gone 18-2 since then,” said Lewis.
Montreal is also looking to rebound from a 37-23 loss to the B.C. Lions last week. But for head coach Jason Maas, he says his team’s mindset doesn’t change, regardless of what happened the previous week.
“Last year when we went through a four-game losing streak, you couldn’t tell if we were on a four-game winning streak or a four-game losing streak by the way the guys were in the building, the way we prepared, the type of work ethic we have,” said Maas. “All our standards are set, so that’s all we focus on.”
While they may have already clinched a playoff spot, Alouettes’ quarterback Cody Fajardo says this closing stretch remains critical because they want to finish the season strong, just like last year when they won their final five regular-season games before ultimately winning the Grey Cup.
“It doesn’t matter about what you do at the beginning of the year,” said Fajardo. “All that matters is how you end the year and how well you’re playing going into the playoffs so that’s what these games are about.”
The Alouettes’ are kicking off a three-game road stretch, one Fajardo looks forward to.
“You understand what kind of team you have when you play on the road because it’s us versus the world mentality and you can feel everybody against you,” said Fajardo. “Plus, I always tend to find more joy in silencing thousands of people than bringing thousands of people to their feet.”
This report by The Canadian Press was first published Sept. 13, 2024.
GIF