これを行う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フィドルデモ。
健全性チェックはまったく行われていないことに注意してください。このアプローチでは、動画の識別子の前にv=
英数字以外の文字を付けて終了する必要があります。
私はOpera12とChromium19でのみテストと検証を行いました。
YouTube URL形式のもう1つの形式を説明するには、次のようにします。
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フィドルデモ。
事実上、これは同じプロセスですが、正規表現がわずかに異なります。
がnodeType
等しいと3
見なされる場所が2つあり、iframe
sが作成される場所が2つあるため、2つのindexOf()
評価をaの中にラップして、抽象化された作成を別の関数if
にテストします。どちらも単純に不必要な繰り返しを避けてください。nodeType
iframe
参照: