{"id":28308,"date":"2021-04-14T17:22:14","date_gmt":"2021-04-14T17:22:14","guid":{"rendered":"http:\/\/Video-events-trigger-on-a-Next.js-Page"},"modified":"2025-03-02T15:25:07","modified_gmt":"2025-03-02T23:25:07","slug":"video-events-trigger-on-a-next-js-page","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/","title":{"rendered":"Video events trigger on a Next.js Page"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Interactivity is at the backbone of modern web pages. This includes collecting information on user interaction, handling form submissions, and managing interactivity on media assets.<\/p>\n<p>This post discusses how to handle user interface interactions with events from a Video on a Next.js web page.<\/p>\n<p>Next.js is a modern React.js framework for building high-performance web applications.<\/p>\n<h2>Try it out<\/h2>\n<p>We completed this project in <a href=\"https:\/\/codesandbox.io\/s\/mj-5-events-triggers-u643n?file=\/pages\/index.js\">CodeSandbox<\/a>. You can fork the CodeSandbox project or run the code to get started quickly.<\/p>\n<\/div>\n  \n  <div class=\"wp-block-cloudinary-code-sandbox \">\n    <iframe\n      src=\"https:\/\/codesandbox.io\/embed\/mj-5-events-triggers-u643n?theme=dark&amp;codemirror=1&amp;highlights=&amp;editorsize=50&amp;fontsize=14&amp;expanddevtools=0&amp;hidedevtools=0&amp;eslint=0&amp;forcerefresh=0&amp;hidenavigation=0&amp;initialpath=%2F&amp;module=&amp;moduleview=0&amp;previewwindow=&amp;view=&amp;runonclick=1\"\n      height=\"500\"\n      style=\"width: 100%;\"\n      title=\"Video events trigger on a Next.js page\"\n      loading=\"lazy\"\n      allow=\"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking\"\n      sandbox=\"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\"\n    ><\/iframe>\n  <\/div>\n\n  <div class=\"wp-block-cloudinary-markdown \"><h2>Prerequisites &amp; Installation<\/h2>\n<p>For this post, knowledge of JavaScript and React.js is required. The knowledge of Next.js isn\u2019t mandatory, but preferred.<\/p>\n<p>To create a new project, we use the <code>create next-app<\/code> command to scaffold a new project. Using yarn, we run:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    yarn create next-app\n<\/code><\/span><\/pre>\n<p>A prompt appears to enter the project name, which we do to complete the project creation.<\/p>\n<p>Alternatively, we could use NPX with the command:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    npx create-next-app\n<\/code><\/span><\/pre>\n<p>The boilerplate project scaffolds a landing page with styling using CSS modules.<\/p>\n<p>For this project, we\u2019ll use the <a href=\"https:\/\/github.com\/cloudinary\/cloudinary-react\">Cloudinary-React package<\/a> to render a video player whose video source is a video stored on Cloudinary. The video is delivered via an optimized content delivery network (CDN), and can be modified using Cloudinary\u2019s robust transformation features.<\/p>\n<p>We install the cloudinary-react package using yarn:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    yarn add cloudinary-react\n<\/code><\/span><\/pre>\n<h2>Video player utilization<\/h2>\n<p>The cloudinary-react package exports two named components, <code>Video<\/code> and <code>CloudinaryContext<\/code>, which we\u2019ll use to render the video player.<\/p>\n<p>On the home page whose component is defined in <code>pages\/index.js<\/code>, we import and render the video player with:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    <span class=\"hljs-keyword\">import<\/span> { Video, CloudinaryContext, Transformation } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"cloudinary-react\"<\/span>;\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">IndexPage<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          Hello World.{\" \"}\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CloudinaryContext<\/span> <span class=\"hljs-attr\">cloudName<\/span>=<span class=\"hljs-string\">\"chuloo\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Video<\/span> <span class=\"hljs-attr\">publicId<\/span>=<span class=\"hljs-string\">\"video-blog\/cat\"<\/span> <span class=\"hljs-attr\">controls<\/span> <span class=\"hljs-attr\">muted<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"500px\"<\/span>\/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">CloudinaryContext<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n      );\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><code>CloudinaryContext<\/code> receives props of any data we would like to make available to the Cloudinary child components. In this case, we passed our Cloudinary cloud name. You can obtain yours by <a href=\"https:\/\/cloudinary.com\/signup\">creating an account on Cloudinary<\/a>.<\/p>\n<p>We use the <code>Video<\/code> component to render the video player with a width of 500px. We also specified the video\u2019s public ID, which is stored on Cloudinary. Lastly, we included props that give the video player controls and make it muted on render.<\/p>\n<p>The video player currently looks like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_B7EBF86D17AA8AC7122B67141F6CAC3F321B1E508A73F54461B13DC3F11E6FEF_1617034505134_image.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"518\" height=\"323\"\/><\/p>\n<p>The cloudinary-react video player is a wrapper on the traditional HTML5 video element with enhanced properties. It provides an <code>innerRef<\/code> prop that grants us access to the underlying video element\u2019s methods and properties.<\/p>\n<p>With this, we will use React\u2019s <code>useRef()<\/code> hook to reference the video element.<\/p>\n<h2>Video events handling<\/h2>\n<p>With the <code>Video<\/code> component\u2019s ref, we\u2019ll be able to utilize the <code>onpause<\/code> and <code>onended<\/code> events along with all other video events and properties. We create a ref and assign it to the <code>innerRef<\/code> prop of the <code>Video<\/code> with:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    <span class=\"hljs-keyword\">import<\/span> { Video, CloudinaryContext, Transformation } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"cloudinary-react\"<\/span>;\n    <span class=\"hljs-keyword\">import<\/span> { useRef } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react\"<\/span>;\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">IndexPage<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n      <span class=\"hljs-keyword\">const<\/span> videoRef = useRef();\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          Hello World.{\" \"}\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CloudinaryContext<\/span> <span class=\"hljs-attr\">cloudName<\/span>=<span class=\"hljs-string\">\"chuloo\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Video<\/span> <span class=\"hljs-attr\">publicId<\/span>=<span class=\"hljs-string\">\"video-blog\/cat\"<\/span> <span class=\"hljs-attr\">controls<\/span> <span class=\"hljs-attr\">muted<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"500px\"<\/span> \n                   <span class=\"hljs-attr\">innerRef<\/span>=<span class=\"hljs-string\">{videoRef}\/<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">CloudinaryContext<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n      );\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>With the ref in place, we will handle actions when video events are triggered. We assign two functions, which we call when the video is paused, and the video ends. We do this in a <code>useEffect<\/code> hook with:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    <span class=\"hljs-keyword\">import<\/span> { useRef, useEffect, useState } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react\"<\/span>;\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">IndexPage<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n      <span class=\"hljs-keyword\">const<\/span> &#91;videoEnded, setVideoEnded] = useState(<span class=\"hljs-literal\">undefined<\/span>)\n        <span class=\"hljs-keyword\">const<\/span> videoRef = useRef()\n        useEffect(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n            <span class=\"hljs-keyword\">const<\/span> video = videoRef.current;\n            video.onpause = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n                <span class=\"hljs-comment\">\/\/ logic goes in here<\/span>\n            }\n            video.onended = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n                setVideoEnded(<span class=\"hljs-literal\">true<\/span>)\n                <span class=\"hljs-comment\">\/\/ logic goes in here<\/span>\n            }\n        }, &#91;])\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"hljs-comment\">\/\/ render component here<\/span>\n      );\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>In the imported <code>useEffect<\/code> hook, we created a function that triggers when the video is paused or ended.<\/p>\n<p>When the video ends, we store a <code>true<\/code> boolean value in the component\u2019s state. With this state value, we can handle multiple UI updates. These interactions include:<\/p>\n<ul>\n<li>Toasts to display status updates<\/li>\n<li>Modals to communicate important information<\/li>\n<li>Ads<\/li>\n<li>Call to action buttons when a video ends<\/li>\n<li>Handle navigation on specific video events<\/li>\n<li>Fetch or post data<\/li>\n<\/ul>\n<p>The interactivity opportunities are boundless.<\/p>\n<p>We will be rendering a timed toast component that fires when the video is paused or ends for this project. We use react-hot-toast for this.<\/p>\n<p>React-hot-toast is a lightweight toast package that is seamless to use. We install it using yarn with the command:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    yarn add react-hot-toast\n<\/code><\/span><\/pre>\n<p>In the <code>.onpause<\/code> and <code>.onended<\/code> functions, we trigger success toasts using the <code>toast<\/code> functions with:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    <span class=\"hljs-keyword\">import<\/span> { toast, Toaster } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react-hot-toast\"<\/span>;\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">IndexPage<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n      <span class=\"hljs-comment\">\/\/ component logic goes in here<\/span>\n      \n      useEffect(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n        <span class=\"hljs-keyword\">const<\/span> video = videoRef.current;\n        video.onpause = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n          toast.success(<span class=\"hljs-string\">\"The video is paused\"<\/span>);\n        };\n        video.onended = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n          setVideoEnded(<span class=\"hljs-literal\">true<\/span>);\n          toast.success(<span class=\"hljs-string\">\"The video is ended\"<\/span>);\n        };\n      }, &#91;]);\n      \n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"hljs-comment\">\/\/ rendered component goes in here<\/span>\n      );\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>To see the toasts, we render the imported <code>Toaster<\/code> component anywhere in the app.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    <span class=\"hljs-keyword\">import<\/span> { Video, CloudinaryContext, Transformation } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"cloudinary-react\"<\/span>;\n    <span class=\"hljs-keyword\">import<\/span> { useRef, useEffect, useState } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react\"<\/span>;\n    <span class=\"hljs-keyword\">import<\/span> { toast, Toaster } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react-hot-toast\"<\/span>;\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">IndexPage<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n      <span class=\"hljs-comment\">\/\/ component logic definitions go in here<\/span>\n    \n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Toaster<\/span> \/&gt;<\/span>\n          Hello World.{\" \"}\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CloudinaryContext<\/span> <span class=\"hljs-attr\">cloudName<\/span>=<span class=\"hljs-string\">\"chuloo\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Video<\/span>\n              <span class=\"hljs-attr\">publicId<\/span>=<span class=\"hljs-string\">\"video-blog\/cat\"<\/span>\n              <span class=\"hljs-attr\">controls<\/span>\n              <span class=\"hljs-attr\">muted<\/span>\n              <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"500px\"<\/span>\n              <span class=\"hljs-attr\">innerRef<\/span>=<span class=\"hljs-string\">{videoRef}<\/span>\n            \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">CloudinaryContext<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n      );\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Here\u2019s what the final video looks like with the toasts on video events:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_B7EBF86D17AA8AC7122B67141F6CAC3F321B1E508A73F54461B13DC3F11E6FEF_1617034768919_Mar-29-2021+20-18-47.gif\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"706\" height=\"380\"\/><\/p>\n<h2>Conclusion<\/h2>\n<p>This post discussed using a video player in a Next.js app, hook into the video element\u2019s native properties, events, and methods using <code>useRef<\/code>. We also handled UI changes on the page when a user fires video events.<\/p>\n<p>Furthermore, you can handle data fetching and sending, or Ad display on your Next.js page using video events.<\/p>\n<p>You may find these resources useful:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/www.w3schools.com\/tags\/ref_av_dom.asp\">HTML Audio\/Video events glossary<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/video_manipulation_and_delivery\">Video transformation guide on Cloudinary<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/nextjs.org\/docs\/getting-started\">Getting started with Next.js<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":28309,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,212,246,371,303],"class_list":["post-28308","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-next-js","tag-react","tag-under-review","tag-video"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Video events trigger on a Next.js Page<\/title>\n<meta name=\"description\" content=\"Learn to trigger UI interactions using Video events with videos from Cloudinary on a Next.js page\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Video events trigger on a Next.js Page\" \/>\n<meta property=\"og:description\" content=\"Learn to trigger UI interactions using Video events with videos from Cloudinary on a Next.js page\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-14T17:22:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-02T23:25:07+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Video events trigger on a Next.js Page\",\"datePublished\":\"2021-04-14T17:22:14+00:00\",\"dateModified\":\"2025-03-02T23:25:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA\",\"keywords\":[\"Guest Post\",\"Next.js\",\"React\",\"Under Review\",\"Video\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2021\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\",\"name\":\"Video events trigger on a Next.js Page\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA\",\"datePublished\":\"2021-04-14T17:22:14+00:00\",\"dateModified\":\"2025-03-02T23:25:07+00:00\",\"description\":\"Learn to trigger UI interactions using Video events with videos from Cloudinary on a Next.js page\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA\",\"width\":5082,\"height\":3387},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Video events trigger on a Next.js Page\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Video events trigger on a Next.js Page","description":"Learn to trigger UI interactions using Video events with videos from Cloudinary on a Next.js page","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/","og_locale":"en_US","og_type":"article","og_title":"Video events trigger on a Next.js Page","og_description":"Learn to trigger UI interactions using Video events with videos from Cloudinary on a Next.js page","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/","og_site_name":"Cloudinary Blog","article_published_time":"2021-04-14T17:22:14+00:00","article_modified_time":"2025-03-02T23:25:07+00:00","twitter_card":"summary_large_image","twitter_image":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/"},"author":{"name":"","@id":""},"headline":"Video events trigger on a Next.js Page","datePublished":"2021-04-14T17:22:14+00:00","dateModified":"2025-03-02T23:25:07+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA","keywords":["Guest Post","Next.js","React","Under Review","Video"],"inLanguage":"en-US","copyrightYear":"2021","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/","name":"Video events trigger on a Next.js Page","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA","datePublished":"2021-04-14T17:22:14+00:00","dateModified":"2025-03-02T23:25:07+00:00","description":"Learn to trigger UI interactions using Video events with videos from Cloudinary on a Next.js page","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA","width":5082,"height":3387},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-events-trigger-on-a-next-js-page\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Video events trigger on a Next.js Page"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924851\/Web_Assets\/blog\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954\/f5393b2adcc7fc22ada09ebf0b79fc20f3a89a4a-5082x3387-1_283090f954.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=28308"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28308\/revisions"}],"predecessor-version":[{"id":37103,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28308\/revisions\/37103"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/28309"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}