javascript - 拖放后如何保存新的html位置?
问题描述
我正在做一个项目,我有只能放置在 7 个特定放置区域内的可拖动卡片。
我可以拖动卡片并将它们放置到新区域,但是一旦我重新加载页面,位置就不会保存。
在 "drop" 事件中,我尝试使用 "outerHTML" 将在我 "drop" 卡片后动态创建的整个新 div(丢弃的卡片新位置和 8 个放置区域)保存到本地存储中localstorage.setItem('newCardDashboardDiv', cardDashboard.outerHTML)
,并且数据似乎以字符串的形式正确保存在本地存储中(即它保存了整个 div,包括在将卡片拖动并放置在任何放置区域 1 到 7 之后将包含卡片的 html 元素的更新的内部 div)。
我尝试从本地存储数据中拉出整个 div 并将其设置为新的 html 值const newDashboardDiv = localstorage.getItem('newCardDashboardDiv)
$("#cardDashboardDiv).replaceWith(newDashboardDiv)
,但它不起作用。我觉得我已经尝试了一切。
一旦我从本地存储中提取了该 outerHTML 数据,使用 outerHTML 似乎会删除原始 HTML 的所有样式和功能元素。新卡的放置实际上在刷新时会保存,但它是灰色的,我不能再将卡拖到任何新的放置区域。
顺便说一句,我正在使用 Chrome。
这是我的代码
HTML
<section id="cardFrameworkDashboard">
<div id="cardDashboardRow" class="container-fluid cardDashboardRow">
<div id="replaceDash" class="row mt-5">
<div class="cardPlacementArea" style="width: 30rem; height: 20rem; margin-right: 5rem;">
<div class="card-body cardContent" draggable="false">
<h5 class="card-title">System Messages Card</h5>
<p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
<a href="#" class="card-link">Card link</a>
<a href="#" class="card-link">Another link</a>
</div>
</div>
<div id="placementArea1" class="cardPlacementArea" style="width: 30rem; height: 20rem; margin-right: 5rem;">
<div id="droppable1" class="card-body cardContent" draggable="true">
<h5 class="card-title">Content Card 1</h5>
<h6 class="card-subtitle mb-2 text-muted">Card subtitle</h6>
<p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
<a href="#" class="card-link">Card link</a>
<a href="#" class="card-link">Another link</a>
</div>
</div>
<div id="placementArea2" class="cardPlacementArea" style="width: 30rem; height: 20rem; margin-right: 5rem;">
</div>
<div id="placementArea3" class="cardPlacementArea" style="width: 30rem; height: 20rem;">
</div>
</div>
<div class="row mt-5">
<div id="placementArea4" class="cardPlacementArea" style="width: 30rem; height: 20rem; margin-right: 5rem;">
</div>
<div id="placementArea5" class="cardPlacementArea" style="width: 30rem; height: 20rem; margin-right: 5rem;">
</div>
<div id="placementArea6" class="cardPlacementArea" style="width: 30rem; height: 20rem; margin-right: 5rem;">
</div>
<div id="placementArea7" class="cardPlacementArea" style="width: 30rem; height: 20rem;">
</div>
</div>
</div>
Javascript
const cardContentDraggables = document.querySelectorAll('.cardContent')
const cardPlacements = document.querySelectorAll('.cardPlacementArea')
const cardDashboard = document.querySelector('.cardDashboardRow')
cardContentDraggables.forEach(cardContentDraggable => {
cardContentDraggable.addEventListener("dragstart", () => {
cardContentDraggable.classList.add("dragging")
})
cardContentDraggable.addEventListener("dragend", () => {
cardContentDraggable.classList.remove("dragging")
})
cardPlacements.forEach(cardPlacement => {
cardPlacement.addEventListener("dragover", event => {
event.preventDefault()
const draggable = document.querySelector(".dragging")
cardPlacement.append(draggable)
})
cardPlacement.addEventListener("dragstart", dragStart)
cardPlacement.addEventListener("dragend", dragEnd)
cardContentDraggable.addEventListener('drop', () => {
localStorage.setItem('newCardDashboardDiv', cardDashboard.outerHTML)
console.log('position saved to ls')
})
})
})
function dragStart() {
for (var i = 0; i < cardPlacements.length; i++) {
cardPlacements[i].classList.add("cardPlacementAreaDrag")
}
}
function dragEnd() {
for (var i = 0; i < cardPlacements.length; i++) {
cardPlacements[i].classList.remove("cardPlacementAreaDrag")
}
}
jQuery
$(document).ready(function () {
const newDashboardDiv = localStorage.getItem('newCardDashboardDiv')
console.log('success got div from ls')
$(window).bind("beforeunload", function (event) {
event.preventDefault()
console.log('detected refresh')
})
$(window).on('load', function (event) {
event.preventDefault()
console.log('after refresh')
$("#cardDashboardRow").replaceWith(newDashboardDiv)
})
})
解决方案
我没有通过你的所有代码工作,但基本上问题是这样的:拖动你的卡片后,dom 被更改并且页面(或它的一部分)被相应地重新渲染。
正如您已经说过的,当您重新加载页面时,这些更改就消失了。这是有道理的,因为页面再次完全呈现,从原始源代码开始。存储完整的 div 和拖动的项目对我来说似乎有点过头了,因为你想做的只是一些排序,对吧?
给您的卡片一些东西以使其可区分,例如 ID 或特定(编号?)类,怎么样?拖动后,您可以简单地存储每张卡片的位置(哪个区域,哪个位置),并在重新加载后将它们“移动”回原位……</p>
推荐阅读
- sed - 使用 sed/awk linux bash 替换字符串
- java - 泛型 - 不能用 T 扩展 Base 为 T 返回 Base
- docker - Ubuntu 14.04 几分钟后破坏了 docker 网络
- c++ - C++类继承(游戏结构)
- reactjs - modernizr 与样式组件做出反应
- java - 如何从具有多对多关系的连接表中获取对象?春天+休眠
- javascript - Google Scripts - SMS 短信脚本的延迟循环
- python-3.x - 如何根据列值将标准化一分为二?
- youtube-api - 我有一个 YouTube 视频,当它完成后,我想重定向到我网站上的另一个页面
- elastic-stack - 在哪里可以找到 _grokparsefailure 的完整详细信息