我正在测试jquery-oembed-all作为another question的解决方案。该脚本是一个加载在页面中的小javascript文件,并提供用于获取媒体嵌入代码的oembed
函数。
我很容易从链接中获取oEmbed iframe:
<script>
$(function(){
tag = $(document.createElement('div')).oembed('https://vimeo.com/40179668');
$('.header').append(tag);
});
</script>
这很有效,并将oEmbed生成的iframe元素添加到页面上的.header
。但是我需要将生成的HTML作为字符串。在tag[0].outerHTML
甚至是tag[0].parent()[0].outerHTML
中进行了调查,只显示tag
是脚本中创建的原始空div
,但它显然包含所有嵌入代码,因为嵌入的视频在页面上加载。
如何将oembed
函数返回的HTML作为文本字符串?我是否需要从创建的div
标记中遍历DOM才能找到它?
修改
我添加了一些警报,这与时间有关。因为它是一个网络调用,所以当我查询outerHTML
时,oEmbed函数还没有返回HTML块。
编辑2: 看起来这可以通过JS回调来解决,因为oEmbed调用是异步的。当我有时间寻找解决方案时,我会将其作为答案发布回来。
答案 0 :(得分:0)
<强> SOLUTION:强>
由于这是一个Rails应用程序,我决定使用oembed gem并在显示文本时解析视频链接,而不是在输入时解析。这对我来说是最好的解决方案,因为存储裸视频URL比存储oembed返回的完整嵌入iframe代码更具有前瞻性,并希望它永远不会改变。
这段代码很快被黑客攻击,很快就需要重构,但它现在正常运行,而且失败对应用程序来说并不重要。
在显示课程时,我在parse_media_embeds
上运行lesson.notes
,找到所有链接,对于任何匹配的媒体网站,它都会获取oEmbed代码(错误为rescue
)和用iframe替换链接。完全是janky,但它允许我继续使用该应用程序。
我会在重构时发布新代码。
查看:lesson.html.rb
...
<section class='lesson-notes'>
<p><%= lesson.parse_media_embeds.html_safe %></p>
</section>
...
MODEL:lesson.rb
def parse_media_embeds
# get an array of links in the notes
links = URI.extract self.notes, /http(s)?/
# due to wysihtml5 parsing each link is stored twice, once as url and once as text
# like <a href='http://google.com'>http://google.com</a>
# so remove the double references
for pos in (0..links.count)
link.delete_at(pos)
end
# now replace each link that matches the Regexp pattern with oembed version
links.each do |link|
# only replace links for YouTube, Vimeo and Soundcloud
if link.match(/youtu\.be|youtube|vimeo|soundcloud/)
# get the full link tag, which includes both instances of the link text
string = /(<a\w*[^>]*>#{Regexp.escape(link)}[^<]*<\/a>)/
embed = get_oembed(link)
self.notes = self.notes.gsub(string, embed) if embed
end
end
self.notes
end
MODEL:lesson.rb
def get_oembed(link)
# each provider has a different set of params
if link.match(/youtu\.be|youtube/)
begin
resource = OEmbed::Providers::Youtube.get(link, {maxwidth: 320})
rescue
return
end
resource.html
elsif link.match(/vimeo/)
begin
resource = OEmbed::Providers::Vimeo.get(link, {maxwidth: 320})
rescue
return
end
resource.html
elsif link.match(/soundcloud/)
begin
resource = OEmbed::Providers::SoundCloud.get(link, {color: '39d', show_comments: false})
rescue
return
end
resource.html
else
return
end
end