回答1へのコメントで提供された追加情報に従って、これにアプローチする方法(私が知っている)は、htmlネイティブのドラッグドロップサポートを破棄し、自分で実装することです。
古いブラウザー (特に IE) で問題を引き起こす原因は何かは忘れましたが、onTgtMouseDown のイベント変数または clientX/scrollLeft のいずれかであると感じています。
いずれにせよ、以下のコードは現在の Chrome と IE9 でテストされています。
あなたの目的に適していることを願っています(オブジェクトを視覚的に配置しますが、DOMツリー内のノードの位置を変更しません)
<!DOCTYPE html>
<html>
<head>
<style>
#tgt
{
position: absolute;
border: solid 1px red;
text-align: center;
display: inline-block;
}
</style>
<script>
function byId(e){return document.getElementById(e);}
function myInit()
{
var dragMe = byId('tgt');
dragMe.ondragstart = function() { return false; }
dragMe.onmousedown = onTgtMouseDown;
}
function onTgtMouseDown(e)
{
var mDlg, self=this;
var initMx, intMy, initDlgX, initDlgY, dx, dy;
var mTgt;
mTgt = this;
// mDlg = this.parentNode;
// mDlg.zIndex = 1000;
// mDlg.style.position = 'absolute';
mTgt.zIndex = 1000;
mTgt.style.position = 'absolute';
e = e || event;
initMx = e.pageX;
initMy = e.pageY;
initDlgX = mTgt.offsetLeft;
initDlgY = mTgt.offsetTop;
// offset from top left of element to mouse when button pressed
dx = initMx - initDlgX;
dy = initMy - initDlgY;
document.onmousemove = function(e)
{
e = e || event;
fixPageXY(e);
mTgt.style.left = e.pageX-dx+'px';
mTgt.style.top = e.pageY-dy+'px';
}
this.onmouseup = function()
{
document.onmousemove = null;
}
}
// e = event
function fixPageXY(e)
{
if (e.pageX == null && e.clientX != null )
{
var html = document.documentElement
var body = document.body
e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0)
e.pageX -= html.clientLeft || 0
e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0)
e.pageY -= html.clientTop || 0
}
}
</script>
</head>
<body onload='myInit();'>
<div id='tgt'>Drag Me</div>
</body>
</html>