使用引导程序 3.0 模式在 iframe 中加载动态的远程内容 [英] Using bootstrap 3.0 modals to load dynamic, remote content within an iframe
问题描述
我已经尝试了此处针对其他问题和 stackexchange 发布的一些建议,但没有任何效果令我满意.
我正在尝试将动态内容加载到模态中.具体来说,iFrame 中的 YouTube 视频或 Soundcloud 音频.这样任何访问该站点的用户都可以输入视频或音频的链接.模态然后动态加载用户链接.每个后续用户都可以看到彼此的链接,所有这些都在一个模态中.(为每个用户单独加载模态)
我无法让它正常工作.我创建了一个名为modal.html"的单独 html 文件来测试这个,其中包括一个带有正确 YouTube/Soundcloud 剪辑的 iframe.
我也对是否需要在标签中使用data-remote="感到困惑,还是使用 href 就足够了?或者我在模态的第一个中使用数据远程.还是两者兼而有之?两者都没有奏效.
这是我的代码:
<a data-toggle="modal" href="modal.html" data-target="#myModal">点击我</a><div class="modalfade" id="myModal" tabindex="-1" role="dialog" data-remote="modal.html" aria-labelledby="myModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h4 class="modal-title" id="myModalLabel">模态标题</h4>
<div class="modal-body">
<div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><button type="button" class="btn btn-primary">保存更改</button>
</div><!--/.modal-content --></div><!--/.modal-dialog --></div><!--/.modal -->
为什么 data-remote
或 href
在 youtube 等远程网站上都不起作用
Twitter 引导程序的模态使用 AJAX 通过 data-remote
/href
加载远程内容.AJAX 受同源政策的约束,因此访问具有不同来源的网站(如 youtube)会产生以下错误:
请求的资源上不存在Access-Control-Allow-Origin"标头
所以 data-remote
或 href
都不会做你想做的事.
JSON:如果您正在获取 json 数据,那么您可能会使用 JSONP.但是由于您需要来自 youtube 等网站的 html,而不是 json,我们需要另一种方法:
使用
<iframe>
将适用于 youtube 和许多其他远程站点(即使这种解决方案也不适用于所有站点,如 Facebook,通过设置 X-Frame- 明确阻止 iframe-选项'到'拒绝').
将 iframe 用于动态内容的一种方法是:
1) 在模态正文中添加一个空的 iframe:
<iframe frameborder="0"></iframe>
2) 添加一些在单击模态对话框按钮时触发的 jquery.以下代码需要 data-src
属性中的链接目标,并且按钮具有 modalButton
类.您还可以选择指定 data-width
和 data-height
- 否则它们分别默认为 400 和 300(当然您可以轻松更改它们).
然后在 上设置属性,这会导致 iframe 加载指定的页面.
$('a.modalButton').on('click', function(e) {var src = $(this).attr('data-src');var height = $(this).attr('data-height') ||300;var width = $(this).attr('data-width') ||400;$("#myModal iframe").attr({'src':src,'高度':高度,'宽度':宽度});});
3) 将类和属性添加到模态对话框的锚标记:
<a class="modalButton" data-toggle="modal" data-src="http://www.youtube.com/embed/Oc8sWN_jNF4?rel=0&wmode=transparent&fs=0" data-height=320 data-width=450 data-target="#myModal">点击我</a>
I have tried several of the suggestions posted here on other questions and on stackexchange, and nothing is working to my satisfaction.
I am trying to load dynamic content into a modal. Specifically, YouTube videos or Soundcloud audio within an iFrame. So that any user who visits the site, can enter links for videos or audio. The modal then dynamically loads that users links. Each subsequent user can see each others links, all within a modal. (separate modal loads up for each user)
I can't get this to work quite right. I have created a separate html file called "modal.html" to test this out, which includes an iframe with the proper YouTube/Soundcloud clip.
I am also confused about whether i need to use "data-remote=" inside my tag, or does the href suffice? Or do I use the data-remote inside the first of the modal. Or Both, or either? Neither has worked.
Here's my code:
<a data-toggle="modal" href="modal.html" data-target="#myModal">Click me</a>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" data- remote="modal.html" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
Why neither data-remote
or href
work on remote sites like youtube
Twitter bootstrap's modal uses AJAX to load remote content via data-remote
/href
. AJAX is constrained by the same origin policy so accessing a site with a different origin, like youtube, will produce this error:
No 'Access-Control-Allow-Origin' header is present on the requested resource
So neither data-remote
or href
will do what you want.
JSON: If you were getting json data then you could potentially use JSONP. But since you need html, not json, from sites like youtube we need another approach:
Solution using <iFrame>
An <iframe>
will work for youtube and many other remote sites (even this solition doesn't work for all sites as some, like Facebook, explicitly block iframes by setting X-Frame-Options' to 'DENY') .
One way to use an iframe for dynamic content is to:
1) add an empty iframe inside your modal's body:
<div class="modal-body">
<iframe frameborder="0"></iframe>
</div>
2) add some jquery that is triggered when the modal dialog button is clicked. The following code expects a link destination in a data-src
attribute and for the button to have a class modalButton
. And optionally you can specify data-width
and data-height
- otherwise they default to 400 and 300 respectively (of course you can easily change those).
The attributes are then set on the <iframe>
which causes the iframe to load the specified page.
$('a.modalButton').on('click', function(e) {
var src = $(this).attr('data-src');
var height = $(this).attr('data-height') || 300;
var width = $(this).attr('data-width') || 400;
$("#myModal iframe").attr({'src':src,
'height': height,
'width': width});
});
3) add the class and attributes to the modal dialog's anchor tag:
<a class="modalButton" data-toggle="modal" data-src="http://www.youtube.com/embed/Oc8sWN_jNF4?rel=0&wmode=transparent&fs=0" data-height=320 data-width=450 data-target="#myModal">Click me</a>
这篇关于使用引导程序 3.0 模式在 iframe 中加载动态的远程内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!