【问题标题】:Question about JavaScript scope and is it possible to accomplish what I am attempting to do关于 JavaScript 范围的问题,是否有可能完成我正在尝试做的事情
【发布时间】:2020-04-30 22:00:49
【问题描述】:

我正在尝试动态更改 YouTube API onclick 的 videoID。我有一个数据 src 包含 YouTube URL 的项目列表。当用户单击链接时,会弹出一个正在播放该特定视频的模式。视频结束后,它会重定向到另一个页面。

如果我对 ID 进行硬编码,它可以很好地工作,但我做不到。

我唯一担心的是由于 JavaScript 范围,我无法获取 videoID。你有什么推荐我试试的吗?

    $(document.body).on('click', ".video-btn", function (e) {
        var $videoSrc = $(this).data("src");
        console.log($videoSrc);

        var **getVidID** = $videoSrc.substring(26);
        console.log(getVidID); 
    });

    var tag = document.createElement('script');
    tag.src = "//www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

    var player;
    function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
            playerVars: {
                'controls': 0
            },
            width: 1920,
            height: 1080,
            videoId: **getVidID,** I'd like to use the videoID here
            events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        });
    };

    function onPlayerReady(event) {
        event.target.playVideo();
    };

    var done = false;
    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.ENDED && !done) {
            alert('Taking you to Review Material Now..')
            window.location.replace("http://www.google.com");
            done = true;
        }
    };

【问题讨论】:

  • 一种选择是将 id 变量移动到全局范围,然后在函数内分配一个值。另一种选择是从函数返回 id 并将其分配给函数外部范围内的变量。
  • @devlincarnate 感谢您的回复。我可以返回 getVidID,但我想知道如何在范围之外调用该函数?你能给我一个例子吗?您不必使用我的示例。
  • 不清楚您在最后一条评论中要问什么。如果您返回其值并将其分配给变量,则该变量不会“超出范围”,如果您使用全局变量,它也不会超出范围。也许您需要更新您的帖子并向我们展示您希望在代码中的哪个位置使用 id ?
  • @devlincarnate 没问题。为混乱道歉。我有一个链接列表,这些链接都包含指向 YouTube 视频的不同 URL。当我点击链接时,我得到了 ID,但我需要在 onYouTubeIframeAPIReady() 函数中使用它。你会在我的编辑中看到确切的位置。当我对视频 ID 进行硬编码时,效果很好,但我需要它能够在用户单击链接时获取 ID。很难弄清楚。
  • 这能回答你的问题吗? Access variable outside function scope

标签: javascript jquery api frontend


【解决方案1】:

这是一种方法:

var getVidID; 
$(document.body).on('click', ".video-btn", function (e) {
    var $videoSrc = $(this).data("src");
    console.log($videoSrc);

    getVidID = $videoSrc.substring(26);
    console.log(getVidID); 
});

var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var player;
function onYouTubeIframeAPIReady() {
    console.log(getVidID);
    player = new YT.Player('player', {
        playerVars: {
            'controls': 0
        },
        width: 1920,
        height: 1080,
        videoId: **getVidID,** I'd like to use the videoID here
        events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
        }
    });
};

请注意:getVidID 可能没有值,具体取决于您调用onYouTubeIframeAPIReady() 的位置/时间。点击事件函数必须在获取 id 之前运行。因此,您可能希望在其他函数中使用它之前验证它是否具有值。另外,请注意,该变量的值仅在单击事件触发时才会更改...

【讨论】:

  • 我想我明白了,我已经适当地编码了。看来你是对的,getVidID 没有值,但 ID 从第一个函数获取 console.logged,所以它确实存在。我尝试用 $(document).ready(function () { 包装它但仍然没有运气。这个很难,伙计哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多