Подтвердить что ты не робот

Использование 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">&times;</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 -->
4b9b3361

Ответ 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">&times;</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});
}