Использование bootstrap 3.0 для загрузки динамического, удаленного контента в iframe
Я попробовал несколько предложений, размещенных здесь, по другим вопросам и по stackexchange, и ничто не подходит для моего удовлетворения.
Я пытаюсь загрузить динамический контент в модальный. В частности, видео YouTube или звук Soundcloud в iFrame. Чтобы любой пользователь, посетивший сайт, мог вводить ссылки на видео или аудио. Затем модальная динамически загружает ссылки пользователей. Каждый последующий пользователь может видеть ссылки друг друга, все в пределах модального. (отдельные модальные нагрузки для каждого пользователя)
Я не могу заставить это работать совершенно правильно. Я создал отдельный html файл под названием "modal.html", чтобы проверить это, включая iframe с соответствующим клипом YouTube/Soundcloud.
Я также смущен тем, нужно ли мне использовать "data-remote =" внутри моего тега или достаточно href? Или я использую data-remote внутри первого модального. Или и то, и другое? Ни один из них не работал.
Здесь мой код:
<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 -->
Ответы
Ответ 1
Почему ни data-remote
, либо href
не работают на удаленных сайтах, таких как youtube
Twitter bootstrap modal использует AJAX для загрузки удаленного контента через data-remote
/href
. AJAX сдерживается той же политикой происхождения, поэтому доступ к сайту с другим происхождением, например youtube, приведет к возникновению этой ошибки:
Нет заголовка "Access-Control-Allow-Origin" присутствует на запрошенном ресурсе
Таким образом, ни data-remote
, ни href
не будут делать то, что вы хотите.
JSON:
Если вы получаете данные json, вы можете использовать JSONP. Но так как вам нужен html, а не json, из таких сайтов, как youtube, нам нужен другой подход:
Решение с использованием <iFrame>
An <iFrame>
будет работать для youtube и многих других удаленных сайтов (даже это решение не работает для всех сайтов, так как некоторые, например Facebook, явно блокируют iframe, устанавливая X-Frame-Options 'в DENY).
Один из способов использования iframe для динамического содержимого состоит в следующем:
1) добавьте пустой фрейм внутри вашего модального тела:
<div class="modal-body">
<iframe frameborder="0"></iframe>
</div>
2) добавить несколько jquery, которые запускаются при нажатии кнопки модального диалога. Следующий код ожидает назначение ссылки в атрибуте data-src
, а для кнопки - класс modalButton
. И необязательно вы можете указать data-width
и data-height
- в противном случае они по умолчанию равны 400 и 300 соответственно (конечно, вы можете легко их изменить).
Затем атрибуты устанавливаются на <iFrame>
, который заставляет 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,
'height': height,
'width': width});
});
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">Click me</a>
Демо-скрипт с использованием youtube
Ответ 2
если вам нужно показать предварительно отформатированную веб-страницу, нужно что-то вроде этого
$('#btn').click(function() {
$.ajax({
url: 'url-src/dialog.html',
dataType: 'json',
type: 'POST',
success: function(data) {
if (data.check) {
var $modal = $(data.dialog);
$('body').append($modal);
$modal.filter('.modal').modal();
} else {
alert(data.dialog);
}
}
});
});
html диалога dialog.html
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" 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>
<h3>Dialog</h3>
</div>
<div class="modal-body">
<form role="form" class="form-horizontal">
<div class="form-group">
<label class="col-sm-3 control-label" for="mutual">Example: </label>
<div class="col-sm-6">
<input type="text" id="example-form" value="" class="form-control">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button id="edit-form" data-id-mutual="" class="btn btn-primary">Save</button>
<button class="btn btn-danger" data-dismiss="modal" aria-hidden="true">Cancel</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
В этом html есть пример формы, вы должны добавить html с видео внутри.
Ответ 3
Вероятно, старый пост, у меня была аналогичная проблема, я хотел нажать ссылку, которая передала бы href текстового файла (или любого другого файла) в iframe внутри модального окна, я решил как это:
function loadiframe(htmlHref) //load iframe
{
document.getElementById('targetiframe').src = htmlHref;
}
function unloadiframe() //just for the kicks of it
{
var frame = document.getElementById("targetiframe"),
frameHTML = frame.contentDocument || frame.contentWindow.document;
frameHTML.removeChild(frameDoc.documentElement);
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<a class=" btn btn-danger" onClick="loadiframe('https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css')" data-toggle="modal" data-target="#myModal">LINK</a><!--link to iframe-->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header" style="border:hidden">
<button type="button" class="close" onClick="unloadiframe()" data-dismiss="modal" aria-label="Close"><span aria- hidden="true">×</span></button>
</div>
<div class="modal-body" style="padding-top:10px; padding-left:5px; padding-right:0px; padding-bottom:0px;">
<iframe src="" frameborder="0" id="targetiframe" style=" height:500px; width:100%;" name="targetframe" allowtransparency="true"></iframe> <!-- target iframe -->
</div> <!--modal-body-->
<div class="modal-footer" style="margin-top:0px;">
<button type="button" class="btn btn-default pull-right" data-dismiss="modal" onClick="unloadiframe()">close</button>
</div>
</div>
</div>
</div>
Ответ 4
вы можете попробовать этот помощник бутстрапа для диалогов
у него есть поддержка запроса ajax, iframes, общих диалогов, подтверждения и подсказки!
вы можете использовать его как:
eModal.iframe('http://someUrl.com', 'This is a tile for iframe', callbackIfNeeded);
eModal.alert('The message', 'This title');
eModal.ajax('/mypage.html', 'This is a ajax', callbackIfNeeded);
eModal.confirm('the question', 'The title', theMandatoryCallback);
eModal.prompt('Form question', 'This is a ajax', theMandatoryCallback);
это обеспечивает прогресс загрузки при загрузке iframe!
Не требуется html.
Вы можете использовать литерал объекта как параметр для дополнительных параметров.
Подробнее проверьте форму сайта.
лучше
Ответ 5
function javascript_function(item_code)
{
var d = new Date();
var url_to_zoom='http://localhost.com/application/page.php?id=2&item_code='+item_code+'&reqdate='+d.getTime();
$('#modal_box').modal({keyboard:true,backdrop:true,show:true,remote:url_to_zoom});
}