問題を解決しました
説明したように、入力画像をズームすると、Internet Exploder は正しいクリック座標を送信できません。代わりに、実際のズームされていない画像領域の外側にある実際のクリック座標をピクセル単位で送信します。
(私が知る限り)JavaScriptからクリック座標にアクセスすることはできません。これは、送信プロセス中に自動的に割り当てられて送信されます。
解決策は、最後の瞬間まで待って「ズーム係数」を計算し、それをサーバーに送信してから、サーバー上の座標を調整することです。
フォームに次の JavaScript を追加します (jquery を想定)
注: deviceXDPI は、IE 6 から使用されています。
<script>
// return the screens scale factor used for IE
function getScaleFactorX(elem_id) {
var nscalefactor = 1;
try {
if (screen.deviceXDPI){
nscalefactor = screen.deviceXDPI / screen.logicalXDPI;
$("#" + elem_id).val( nscalefactor );
} else {
$("#" + elem_id).val( 1 );
}
} catch (e) {
// fail silently
}
return nscalefactor;
}
</script>
適切な非表示フィールドを追加して、スケーリングをサーバーに戻します
<input type="hidden" id="scalefactor" name="scalefactor" value="1">
画像がクリックされたときに倍率が計算されるように操作を追加します
<input name="img" type="image" src="image.png" width="400" height="200" alt="Please click" onclick="getScaleFactorX('scalefactor'); return true;" />
画像の onclick ハンドラーでこれを行うと、ユーザーはフォームが読み込まれた後、送信される前に画面をズームできます。このフィールドへの入力が早すぎると、後でユーザーが画像をズームする可能性があり、倍率が正しくない可能性があります。
サーバー上
// scale the click points
if ($scalefactor) {
$x = (int)($x / $scalefactor);
$y = (int)($y / $scalefactor);
}
これは、スケーリングが x 方向と y 方向の両方で同じであることを前提としています。これは、ズームされた Web ページの適切な前提です。丸め誤差もあるため、ピクセルパーフェクトが必要な場合は、それを考慮する必要があります
DC