Я столкнулся с похожей проблемой, когда у меня были div, которые я хотел перетащить через iFrame. Проблема заключалась в том, что если указатель мыши переместился за пределы div, на iFrame, события перемещения мыши были потеряны, и div перестал перетаскивать. Если это именно то, что вы хотите сделать (в отличие от простого обнаружения пользователя, машущего мышкой над iFrame), я нашел предложение в другой ветке вопросов , которая, кажется, работает хорошо, когда я пытался это сделать. .
На странице, которая содержит объекты, которые вы хотите перетащить, также добавьте:
<div class="dragSurface" id="dragSurface">
<!-- to capture mouse-moves over the iframe-->
</div>
Установите его первоначальный стиль так:
.dragSurface
{
background-image: url('../Images/AlmostTransparent.png');
position: absolute;
z-index: 98;
width: 100%;
visibility: hidden;
}
Z-индекс '98' связан с тем, что я установил для div, который я хочу перетащить, значение z-index: 99, а для iFrame - z-index: 0.
Когда вы обнаружите mousedown в перетаскиваемом объекте (не div divSurface), вызовите следующую функцию как часть вашего обработчика событий:
function activateDragSurface ( surfaceId )
{
var surface = document.getElementById( surfaceId );
if ( surface == null ) return;
if ( typeof window.innerWidth != 'undefined' )
{ viewportheight = window.innerHeight; }
else
{ viewportheight = document.documentElement.clientHeight; }
if ( ( viewportheight > document.body.parentNode.scrollHeight ) && ( viewportheight > document.body.parentNode.clientHeight ) )
{ surface_height = viewportheight; }
else
{
if ( document.body.parentNode.clientHeight > document.body.parentNode.scrollHeight )
{ surface_height = document.body.parentNode.clientHeight; }
else
{ surface_height = document.body.parentNode.scrollHeight; }
}
var surface = document.getElementById( surfaceId );
surface.style.height = surface_height + 'px';
surface.style.visibility = "visible";
}
Примечание: большую часть этого я извлек из чужого кода, который нашел в Интернете! Большая часть логики заключается в том, чтобы просто установить размер dragSurface для заполнения фрейма.
Так, например, мой обработчик onmousedown выглядит так:
function dragBegin(elt)
{
if ( document.body.onmousemove == null )
{
dragOffX = ( event.pageX - elt.offsetLeft );
dragOffY = ( event.pageY - elt.offsetTop );
document.body.onmousemove = function () { dragTrack( elt ) };
activateDragSurface( "dragSurface" ); // capture mousemoves over the iframe.
}
}
Когда перетаскивание останавливается, ваш обработчик onmouseup должен включать вызов этого кода:
function deactivateDragSurface( surfaceId )
{
var surface = document.getElementById( surfaceId );
if ( surface != null ) surface.style.visibility = "hidden";
}
Наконец, вы создаете фоновое изображение (в моем примере - почтиTransparent.png) и делаете все, кроме полностью прозрачным. Я сделал изображение 8х8 с альфа = 2.
Я тестировал это только в Chrome . Мне нужно, чтобы он работал и в IE, и я постараюсь обновить этот ответ тем, что я там обнаружил!