【问题标题】:Trouble updating API object once instantiated in Javascript在 Javascript 中实例化后无法更新 API 对象
【发布时间】:2017-10-11 02:29:17
【问题描述】:

单击时我正在实例化一个新的 Vimeo 对象。这使我可以根据单击的元素使用事件目标来获取 videoUrl。然后 vimeo api 自动创建一个嵌入视频的 iframe。问题是一旦创建了 Vimeo 播放器,我就无法销毁它并使用另一个 videoUrl 重新创建它。它停留在我单击的第一个元素上。如果我刷新并单击另一个元素,它适用于新的 videoUrl,因此这意味着它适用于我选择的任何元素,但仅适用于第一次单击。我猜这是一个我不熟悉的JS问题。我习惯了 C++,我们可以使用指针来解决这种事情。如有任何建议,我将不胜感激。

function openModal(e) {
    var modal = document.getElementById('Modal');
    var videoUrl = e.target.dataset.videoLink;
    //JS Player Code
    alert(e.target.dataset.videoLink);
    var options = {
        url: videoUrl,
        width: 640,
        loop: false
    };
    var player = new Vimeo.Player('Modal', options);
    modal.style.display = "block";
    //Doesn't seem to do anything
    delete player;
}

【问题讨论】:

  • delete 运算符用于删除对象属性;你不能用它来删除局部变量。但无论如何,移除变量或属性与移除变量或属性所引用的对象是有区别的。

标签: javascript object dom


【解决方案1】:

与 C++ 不同,JavaScript 有一个垃圾收集器,您不必在其中管理内存。 JS 中的 delete 运算符与 C++ 中的运算符完全不同。 JS 使用无法手动销毁的“引用”而不是指针。

现在,我不太明白您在执行delete player 时会发生什么。但我假设您想删除 iframe(这实际上没有任何意义。)

但无论如何,你有两个选择。你要么

  1. 通过 display: none 使用 CSS 隐藏它
  2. 用新元素替换元素。

顺便提一下,JS中的delete操作符等价于C++中的std::map::erase方法。

【讨论】:

  • 因此,vimeo api 允许您选择一个空元素,在本例中为“模态”,它会自动在其中附加一个 iframe。当用户关闭模式时,我确实在另一个函数中删除了 iframe。那不是问题。但奇怪的是,再次点击时,openModal 函数并没有创建新对象。它什么也不做。如果我停用 iframe 删除功能,它只会停留在我首先选择的视频网址上​​。所以有些东西告诉我对象一直在浮动,而 JS 不喜欢我试图在函数中创建对象。我很困惑。
  • “JS 不喜欢我尝试在函数中创建对象” - JS 对此没有任何问题,这是标准做法。您是否尝试在调用 new Vimeo.Player(...) 之前删除 'Modal' DOM 元素并重新创建它?
  • "我确实在另一个函数中删除了 iframe" - 你确定吗?
  • @nnnnnn 就是这样!我不能只删除 iframe。我不得不删除包装它的整个容器。我在 Modal 中创建了一个空 div 来包装 iframe。现在我只是删除了整个 Div,当我再次创建对象时,它会按预期设置新的 iframe。谢谢!!现在,为什么 DOM 会这样?是 DOM 还是 JS?
  • 我不认为应该归咎于 DOM JS,因为两者都存在本质上的错误。我不熟悉Vimeo API 对象,但我猜它可能已被编码为存储对 DOM 元素或其他东西的引用,并且当您再次为同一元素调用 Vimeo.Player() 时,该信息会保留。 (也许它还有其他一些方法可以重置或重用相同的 DOM 元素。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多