【问题标题】:Unable to target embedded Flickr video iframe with jQuery无法使用 jQuery 定位嵌入式 Flickr 视频 iframe
【发布时间】:2016-05-24 13:22:20
【问题描述】:

我正在尝试使嵌入的 Flickr 视频在我正在为 Tumblr 开发的响应式主题上流畅。我对任何其他嵌入式视频或音频播放器(Youtube、Vimeo、Soundcloud、Spotify 等)都做得很好,但 Flickr 视频重叠,无法将它们包含在其父容器中。

Flickr 视频 iframe 及其一些子元素具有内联 css 声明,这会导致内容溢出。 Here's a screenshot with the iframe structure

首先,我尝试用 CSS 简单地覆盖这些样式,但没有任何效果。 然后我尝试使用 jQuery,但无法定位 iframe

<iframe frameborder="0" allowfullscreen="" class="flickr-embed-frame" webkitallowfullscreen="" mozallowfullscreen="" oallowfullscreen="" msallowfullscreen="" width="700" height="393" data-natural-width="1024" data-natural-height="576" style="overflow: hidden; padding: 0px; margin: 0px; width: 700px; height: 393px; max-width: none;" data-loaded="true"></iframe>

尽管 iframe 有一个 css 类 .flickr-embed-frame 我既不能定位它,也不能定位它的子元素。我已经在$(document).ready()$(window).load() 中尝试了我的函数,结果不一样。

$('.flickr-embed-frame').contents().find('.child-class'); 之类的选择器也没有用。

iframe 内部有一个video 元素:

<video src="https://www.flickr.com/photos/138041208@N02/27214754585/play/hd/9ecf29781c/" width="699" height="393" poster="https://farm8.staticflickr.com/7776/27214754585_9ecf29781c_c.jpg" controls=""></video>

还尝试使用 $('video[src^="https://www.flickr.com"]') 之类的选择器来定位它,但没有结果。

找不到任何相关的问题,所以希望有人能提供解决方案。谢谢。

编辑 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

好的,我尝试在 JSFiddle 而不是 Tumblr 上手动嵌入 Flickr 视频(您只需将 URL 链接粘贴到视频)。这是 Flickr 要求您添加代码以显示视频的代码:

<a data-flickr-embed="true"          href="https://www.flickr.com/photos/138041208@N02/27214754585/in/dateposted-public/" title="Test video"><img src="https://c2.staticflickr.com/8/7776/27214754585_9ecf29781c_b.jpg" width="1024" height="576" alt="Test video"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

似乎是iframe是后来添加的,通过javascript注入到DOM中。这一定是我不能通过 CSS 和 jQuery 定位 iframe 的原因,因为最初它不存在。

现在我的问题是:我如何检查这个iframe 何时被注入到 DOM 中?这样我可以定位它并通过 jQuery 进行我需要的更改。

已解决 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

我终于找到了解决这个问题的方法,请查看下面的评论。

【问题讨论】:

    标签: javascript jquery html css iframe


    【解决方案1】:

    感谢 David Walsh (davidwalsh.name/detect-node-insertion) 公开的一个非常巧妙的技巧,我设法解决了这个问题。

    首先我们添加一个动画,它会在插入 iframe 时开始:

    /* set up the keyframes; remember to create prefixed keyframes too! */
    @keyframes nodeInserted {  
        from { opacity: 0.99; }
        to { opacity: 1; }  
    }
    

    动画需要应用于您想要监听的元素(在本例中为 iframe)。

    .parent-container iframe {
        animation-duration: 0.001s;
        animation-name: nodeInserted;
    }
    

    当动画结束时,插入事件会触发。

    首先,您必须创建一个充当事件侦听器回调的函数:

    var insertListener = function(event){
        if (event.animationName == "nodeInserted") {
            // This is the debug for knowing our listener worked!
            // event.target is the new node!
            console.warn("Another node has been inserted! ", event, event.target);
        }
    }
    

    如果动画名称与所需的动画匹配,我们就知道已经注入了一个 DOM 节点。现在我们将事件监听器添加到父级:

    document.addEventListener("animationstart", insertListener, false); // standard + firefox
    document.addEventListener("MSAnimationStart", insertListener, false); // IE
    document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari
    

    Here's a demo我嵌入了 Flickr 视频,工作正常:

    【讨论】:

    • 非常聪明的解决方案!很高兴你把它整理好了!在您对我链接到不起作用的解决方案发表评论后,我在 jsfiddle 上尝试了一些与延迟检测 DOM 更改有关的想法,但它似乎没有任何效果,理论上它应该有。我想网络标准不断发展的本质有时意味着巧妙的概念,非直观的解决方案是要走的路。在这些边缘情况下找到解决方案要复杂得多,但成功解决问题的回报是惊人的。干杯。
    【解决方案2】:

    查看之前关于 SO 的帖子:How to access the content of an iframe with jQuery?

    解决方案似乎是使用jQuery的contents()

    $("#myiframe").contents().find("#myContent")
    

    【讨论】:

    • 感谢 Sami Stark,但我已经尝试过这个解决方案,但对我没有用。问题似乎出在 iframe 本身。无法定位它,所以我想尝试定位它的任何孩子都行不通。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2017-05-11
    • 2017-06-04
    • 2016-10-09
    相关资源
    最近更新 更多