#javascript #jquery #html #dom #iframe
#javascript #jquery #HTML #dom #iframe
Вопрос:
Я пытаюсь поменять местами два раздела в вертикальном разделителе на основе jQuery, каждая сторона содержит веб-сайт, сохраняя при этом состояние внутри страницы. Я не могу прикрепить разделитель здесь, потому что для этого требуется автономная библиотека плагинов, но я не думаю, что это имеет большое значение для целей этого вопроса. Вот код:
<html>
<head>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
</head>
<body>
<button onclick="myFunction()">swap</button>
<div id="MySplitter">
<div class="first">
<p>A</p><iframe src="https://www.youtube.com/watch?v=QLhlCwhENzc/"></iframe>
</div>
<div class="second">
<p>B</p><iframe src="https://www.google.com/maps"></iframe>
</div>
</div>
<script>
function myFunction() {
var tempContent = $("div.first").html();
$("div.first").empty().html($("div.second").html());
$("div.second").empty().html(tempContent);
}
</script>
</body>
</html>
Предполагается, что пользователь воспроизводит видео YouTube в iframe A. Когда пользователь нажимает кнопку «поменять местами», я хочу поменять местами два iframe без перезагрузки видео на YouTube. Хотя мой код может менять местами два div, он всегда обновляет страницу и перезагружает видео. Я не смог понять, как решить эту проблему. Любой ввод будет высоко оценен. Спасибо.
Ответ №1:
Вы можете использовать отсоединение, а затем повторно присоединить.
Я также добавил контейнерные div для отсоединения.
Использование IFrame внутри фрагмента вызывает проблемы, поэтому для pretend я использовал ВХОДНЫЕ данные, например, если вы вводите что-то в один, а затем переворачиваете. Вы увидите, что текст не очищается, доказывая, что он не загружается повторно в DOM, а просто перемещается.
Обновить:
Хорошо, похоже, что перемещение iFrames из-за отсоединения / присоединения действительно вызывает обновление iFrame. Таким образом, лучший вариант — не перемещаться внутри DOM, эта версия использует flexbox для перемещения IFrame. Я полагаю, вы могли бы использовать абсолютное позиционирование, поплавки и т. Д.
function myFunction() {
$('#MySplitter').toggleClass('flip');
}
$('button').click(myFunction);
#MySplitter {
display: flex;
flex-direction: column;
}
#MySplitter.flip {
flex-direction: column-reverse;
}
.frame2 {
background-color: red;
}
iframe {
width: 100%;
}
<html>
<head>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
</head>
<body>
<button>swap</button>
<div id="MySplitter">
<div class="content">
<iframe src="."></iframe>
</div>
<div class="content">
<iframe class="frame2" src="."></iframe>
</div>
</div>
</body>
</html>
Комментарии:
1. Спасибо, Кит. Я попробовал вашу реализацию, она выглядит нормально во фрагменте, оказывается, перемещение любого <div>, содержащего объект iframe, в дереве DOM всегда приводит к обновлению содержимого iframe. Я видел, что «adoptNode» должен решить эту проблему, но это не работает. <div> <iframe id=»test1″ src=»AA.html «></iframe> </div> <div> <идентификатор iframe=»test2» src=»BB.html «></iframe> </div> функция myFunction(){ var x = document.adoptNode(document.getElementById(«test1»)); document.getElementById(«test2»).appendChild(x); }
2. Похоже, что действительно перемещение iFrame вызывает обновление. Но если вы перемещаете вещи, не перемещаясь внутри DOM, тогда все в порядке .. Просто внес изменения в использование Flexbox, который, похоже, работает нормально. Обновлен мой фрагмент.