JavaScript/jQuery 在两个 iframe 之间拖放元素
JavaScript/jQuery drag and drop element between two iframes
我有一个包含 2 个 iframe 的页面,它们并排来自同一个域。我想将一个元素从一个 iframe 的特定拖放区(例如 table)拖放到另一个 iframe 的特定拖放区(例如列表)。我检查了 Whosebug 和其他地方的所有相关问题,但找不到合适的解决方案。我尝试使用 jQuery UI 可拖动,但问题是返回的可拖动元素包含在 iframe 中。我无法将其拖出 iframe 边界。所以,我的下一个想法是在顶部(父级)window 创建可拖动元素,但我想我必须以某种方式从父级 window 上的 dragstart 事件触发拖动事件框架。但是,当我将鼠标悬停在下拉框上的相应元素上时,我如何检测拖放事件?
哦,如果这还不够难的话,我也想让它在 IE8 上运行:)
但是现在,我们只说我会找到一个不涉及拖放的 IE8 后备解决方案。
我不会为您写出完整的代码,因为其中涉及很多代码。但我会给你基础知识。它被称为消息元素。您可以使用 table 将消息元素传递给框架中的父 window。然后,您将使用列表将另一个消息元素从父级 window 传递给子级 window。
不幸的是,我唯一在制作中进行的网站是您必须登录才能查看的网站。而且我的 playground 服务器对外是不可见的。否则我会向您展示一个工作示例,让您从我这里窃取代码,或者至少了解它是如何工作的。
看看是否可以将下面列出的 2 组代码放在 2 个文件中,如果它们可以一起工作,
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var iframeWin = document.getElementById("da-iframe").contentWindow,
form = document.getElementById("the-form"),
myMessage = document.getElementById("my-message");
myMessage.select();
form.onsubmit = function () {
iframeWin.postMessage(myMessage.value, "http://localhost/payground/");
return false;
};
};
</script>
</head>
<body>
<form id="the-form" action="/">
<input type="text" id="my-message" value="Your message">
<input type="submit" value="postMessage">
</form>
<iframe id="da-iframe" src="frame.php"></iframe>
</body>
</html>
下一位应位于名为 frame.php
的相同目录中
<html><head>
<script>
function displayMessage (evt) {
var message;
if (evt.origin !== "http://localhost") {
message = "You are not worthy "+evt.origin;
}
else {
message = "I got " + evt.data + " from " + evt.origin;
}
document.getElementById("received-message").innerHTML = message;
}
if (window.addEventListener) {
// For standards-compliant web browsers
window.addEventListener("message", displayMessage, false);
}
else {
window.attachEvent("onmessage", displayMessage);
}
</script>
</head>
<body>
<div id="received-message">I heard nothing yet</div>
</body>
</html>
我希望这足以让您了解您想要做什么的详细信息。
您可以通过从 iframe 向父级发送鼠标消息并在父级中进行拖动来模拟拖动。这是一个代码笔,显示将列表项从一个框架拖到另一个框架:http://codepen.io/brenzy/details/zxMZmO/
由于 SO 需要一些代码,这里是 dragHandler 与父级对话:
$("li").mousedown(function (event) {
dragElement = $(this);
if(event.stopPropagation) event.stopPropagation();
if(event.preventDefault) event.preventDefault();
event.cancelBubble=true;
event.returnValue=false;
return false;
});
$(document).mousemove(function (event) {
if (dragElement) {
if (!dragStarted) {
// tell the parent to start dragging the item
parent.postMessage({
action: "dragStart", frame: myId,
itemText: dragElement.text(), itemId: dragElement.attr('id'),
offset: {left: event.pageX, top: event.pageY}
}, '*');
dragStarted = true;
} else {
parent.postMessage({action: "dragMove", frame: myId,
offset: {left: event.pageX, top: event.pageY}}, '*');
}
}
});
$(document).mouseup(function (event) {
if (dragStarted) {
parent.postMessage({
action: "cancelDrag", frame: myId,
itemText: dragElement.text(), itemId: dragElement.attr('id'),
offset: {left: event.pageX, top: event.pageY}
}, '*');
}
dragStarted = false;
dragElement = null;
});
注意:这仅适用于 Chrome,但我很确定您可以在其他浏览器中使用它。
我有一个包含 2 个 iframe 的页面,它们并排来自同一个域。我想将一个元素从一个 iframe 的特定拖放区(例如 table)拖放到另一个 iframe 的特定拖放区(例如列表)。我检查了 Whosebug 和其他地方的所有相关问题,但找不到合适的解决方案。我尝试使用 jQuery UI 可拖动,但问题是返回的可拖动元素包含在 iframe 中。我无法将其拖出 iframe 边界。所以,我的下一个想法是在顶部(父级)window 创建可拖动元素,但我想我必须以某种方式从父级 window 上的 dragstart 事件触发拖动事件框架。但是,当我将鼠标悬停在下拉框上的相应元素上时,我如何检测拖放事件?
哦,如果这还不够难的话,我也想让它在 IE8 上运行:) 但是现在,我们只说我会找到一个不涉及拖放的 IE8 后备解决方案。
我不会为您写出完整的代码,因为其中涉及很多代码。但我会给你基础知识。它被称为消息元素。您可以使用 table 将消息元素传递给框架中的父 window。然后,您将使用列表将另一个消息元素从父级 window 传递给子级 window。
不幸的是,我唯一在制作中进行的网站是您必须登录才能查看的网站。而且我的 playground 服务器对外是不可见的。否则我会向您展示一个工作示例,让您从我这里窃取代码,或者至少了解它是如何工作的。
看看是否可以将下面列出的 2 组代码放在 2 个文件中,如果它们可以一起工作,
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var iframeWin = document.getElementById("da-iframe").contentWindow,
form = document.getElementById("the-form"),
myMessage = document.getElementById("my-message");
myMessage.select();
form.onsubmit = function () {
iframeWin.postMessage(myMessage.value, "http://localhost/payground/");
return false;
};
};
</script>
</head>
<body>
<form id="the-form" action="/">
<input type="text" id="my-message" value="Your message">
<input type="submit" value="postMessage">
</form>
<iframe id="da-iframe" src="frame.php"></iframe>
</body>
</html>
下一位应位于名为 frame.php
的相同目录中<html><head>
<script>
function displayMessage (evt) {
var message;
if (evt.origin !== "http://localhost") {
message = "You are not worthy "+evt.origin;
}
else {
message = "I got " + evt.data + " from " + evt.origin;
}
document.getElementById("received-message").innerHTML = message;
}
if (window.addEventListener) {
// For standards-compliant web browsers
window.addEventListener("message", displayMessage, false);
}
else {
window.attachEvent("onmessage", displayMessage);
}
</script>
</head>
<body>
<div id="received-message">I heard nothing yet</div>
</body>
</html>
我希望这足以让您了解您想要做什么的详细信息。
您可以通过从 iframe 向父级发送鼠标消息并在父级中进行拖动来模拟拖动。这是一个代码笔,显示将列表项从一个框架拖到另一个框架:http://codepen.io/brenzy/details/zxMZmO/
由于 SO 需要一些代码,这里是 dragHandler 与父级对话:
$("li").mousedown(function (event) {
dragElement = $(this);
if(event.stopPropagation) event.stopPropagation();
if(event.preventDefault) event.preventDefault();
event.cancelBubble=true;
event.returnValue=false;
return false;
});
$(document).mousemove(function (event) {
if (dragElement) {
if (!dragStarted) {
// tell the parent to start dragging the item
parent.postMessage({
action: "dragStart", frame: myId,
itemText: dragElement.text(), itemId: dragElement.attr('id'),
offset: {left: event.pageX, top: event.pageY}
}, '*');
dragStarted = true;
} else {
parent.postMessage({action: "dragMove", frame: myId,
offset: {left: event.pageX, top: event.pageY}}, '*');
}
}
});
$(document).mouseup(function (event) {
if (dragStarted) {
parent.postMessage({
action: "cancelDrag", frame: myId,
itemText: dragElement.text(), itemId: dragElement.attr('id'),
offset: {left: event.pageX, top: event.pageY}
}, '*');
}
dragStarted = false;
dragElement = null;
});
注意:这仅适用于 Chrome,但我很确定您可以在其他浏览器中使用它。