【问题标题】:Replace random youtube link in text to embed code using javascript使用 javascript 替换文本中的随机 youtube 链接以嵌入代码
【发布时间】:2012-07-22 04:55:10
【问题描述】:

我有一些 HTML 代码 - 例如:

<div>Text</div> 
http://www.youtube.com/watch?v=QZ2ekuCu4gM&feature=relmfu 
<div>Text</div> 
youtube.com/watch?v=adrJx864olE&feature=g-logo-xit
<div>Text</div>
<a href="#">LINK</a>

我需要将所有 YouTube 网址自动替换为在该网址嵌入视频的 iframe,如下所示:

<div>Text</div> 
<iframe width="560" height="315" 
src="http://www.youtube.com/embed/QZ2ekuCu4gM" frameborder="0" 
allowfullscreen></iframe>
<div>Text</div> 
<iframe width="560" height="315" 
src="http://www.youtube.com/embed/adrJx864olE" frameborder="0" 
allowfullscreen></iframe>
<div>Text</div>
<a href="#">LINK</a>

如何在 HTML 代码中搜索来自 YouTube 的链接并将其替换为使用 JavaScript 的等效 iframe 代码?

【问题讨论】:

  • 我从数据库中读取了 html 文本,我想在客户端使用 javascript 进行以下重写。

标签: javascript parsing url search replace


【解决方案1】:

这是一种方法:

function linkYT(el) {
    if (!el) {
        return false;
    }
    else {
        var children = el.childNodes,
            text = [];
        for (var i=0, len=children.length; i<len; i++){
            var cur = children[i],
                nType = cur.nodeType,
                content = cur.nodeValue,
                url = 'http://www.youtube.com/embed/';
            if (nType == 3 && content.indexOf('youtube.com') > -1) {
                var embed = content.trim().match(/v=(\w+)/)[1],
                    iframe = document.createElement('iframe');
                iframe.src = url + embed;
                el.insertBefore(iframe, cur.nextSibling);
                cur.parentNode.removeChild(cur);
            }
        }
    }
}

var el = document.getElementById('content');
linkYT(el);​

JS Fiddle demo.

请注意,根本没有健全性检查,这种方法要求视频的标识符以v=开头并以非字母数字结尾字符。

我仅在 Opera 12 和 Chromium 19 中进行了测试和验证。

考虑一个其他形式的 YouTube URL 格式:

function createIframe(embed, parent, after, url){
    if (!embed || !parent || !after) {
        return false;
    }
    else {
        url = url ? url : 'http://www.youtube.com/embed/';
        var iframe = document.createElement('iframe');
        iframe.src = url + embed;
        parent.insertBefore(iframe, after.nextSibling);
        parent.removeChild(after);
    }
}

function linkYT(el) {
    if (!el) {
        return false;
    }
    else {
        var children = el.childNodes,
            text = [];
        for (var i=0, len=children.length; i<len; i++){
            var cur = children[i],
                nType = cur.nodeType,
                content = cur.nodeValue,
                url = 'http://www.youtube.com/embed/';
            if (nType == 3) {
                if (content.indexOf('youtube.com') > -1) {
                    var embed = content.trim().match(/v=(\w+)/)[1];
                    createIframe(embed, el, cur);
                }
                else if (content.indexOf('youtu.be') > -1) {
                    var embed = content.trim().match(/be\/(\w+)/)[1];
                    createIframe(embed, el, cur);
                }
            }
        }
    }
}

var el = document.getElementById('content');
linkYT(el);​

JS Fiddle demo.

实际上是相同的过程,只是正则表达式略有不同。

因为有两个地方必须找到nodeType 等于3 两个地方正在创建iframes,所以我已经包装了两个indexOf() if 内部的评估以测试 nodeType 并将 iframe-creation 抽象为单独的函数,这两者都是为了避免不必要的重复。

参考资料:

【讨论】:

  • 大卫我有问题。我使用 ajax 将数据读取到 div 中,现在无法正常工作。 :( 我有一个空的 div:
    如何修改您的解决方案?
  • 在加载 Ajax 内容后,您是否再次调用了该函数?该函数只会运行一次,不会连续运行,如果添加了新内容,则必须调用该函数来解析该内容。
  • Url 在 html 代码中 - 这是一个问题。我该如何解决?帮我取悦大卫。 :-)
  • 我愿意;我被困在你的演示中,因为只有一个元素被附加到页面上,没有文本。会发生什么?
  • 据我所见,这应该有效,并且在我的(perhaps limited) demo中有效。
猜你喜欢
  • 2011-06-27
  • 2015-02-12
  • 2011-06-10
  • 2012-01-02
  • 2011-03-15
  • 2014-01-21
  • 2012-08-09
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多