天天看點

相容IE8、火狐的本地圖檔預覽+等比例縮放

來源網上的資源:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Firefox3,IE6,IE7,IE8上傳圖檔預覽</title>

<mce:style type="text/css"><!--

#preview_wrapper{

display:inline-block;

width:300px;

height:300px;

background-color:#CCC;

}

#preview_fake{ /* 該對象使用者在IE下顯示預覽圖檔 */

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);

}

#preview_size_fake{ /* 該對象隻用來在IE下獲得圖檔的原始尺寸,無其它用途 */

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);

visibility:hidden;

}

#preview{ /* 該對象使用者在FF下顯示預覽圖檔 */

width:300px;

height:300px;

}

--></mce:style><style type="text/css" mce_bogus="1">

#preview_wrapper{

display:inline-block;

width:300px;

height:300px;

background-color:#CCC;

}

#preview_fake{ /* 該對象使用者在IE下顯示預覽圖檔 */

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);

}

#preview_size_fake{ /* 該對象隻用來在IE下獲得圖檔的原始尺寸,無其它用途 */

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);

visibility:hidden;

}

#preview{ /* 該對象使用者在FF下顯示預覽圖檔 */

width:300px;

height:300px;

} </style>

<mce:script type="text/javascript"><!--

function onUploadImgChange(sender){

if( !sender.value.match( /.jpg|.gif|.png|.bmp/i ) ){

alert('圖檔格式無效!');

return false;

}

var objPreview = document.getElementById( 'preview' );

var objPreviewFake = document.getElementById( 'preview_fake' );

var objPreviewSizeFake = document.getElementById( 'preview_size_fake' );

if( sender.files && sender.files[0] ){

objPreview.style.display = 'block';

objPreview.style.width = 'auto';

objPreview.style.height = 'auto';

// Firefox 因安全性問題已無法直接通過 input[file].value 擷取完整的檔案路徑

objPreview.src = sender.files[0].getAsDataURL();

}else if( objPreviewFake.filters ){

// IE7,IE8 在設定本地圖檔位址為 img.src 時出現莫名其妙的後果

//(相同環境有時能顯示,有時不顯示),是以隻能用濾鏡來解決

// IE7, IE8因安全性問題已無法直接通過 input[file].value 擷取完整的檔案路徑

sender.select();

var imgSrc = document.selection.createRange().text;

objPreviewFake.filters.item(

'DXImageTransform.Microsoft.AlphaImageLoader').src = imgSrc;

objPreviewSizeFake.filters.item(

'DXImageTransform.Microsoft.AlphaImageLoader').src = imgSrc;

autoSizePreview( objPreviewFake,

objPreviewSizeFake.offsetWidth, objPreviewSizeFake.offsetHeight );

objPreview.style.display = 'none';

}

}

function onPreviewLoad(sender){

autoSizePreview( sender, sender.offsetWidth, sender.offsetHeight );

}

function autoSizePreview( objPre, originalWidth, originalHeight ){

var zoomParam = clacImgZoomParam( 300, 300, originalWidth, originalHeight );

objPre.style.width = zoomParam.width + 'px';

objPre.style.height = zoomParam.height + 'px';

objPre.style.marginTop = zoomParam.top + 'px';

objPre.style.marginLeft = zoomParam.left + 'px';

}

function clacImgZoomParam( maxWidth, maxHeight, width, height ){

var param = { width:width, height:height, top:0, left:0 };

if( width>maxWidth || height>maxHeight ){

rateWidth = width / maxWidth;

rateHeight = height / maxHeight;

if( rateWidth > rateHeight ){

param.width = maxWidth;

param.height = height / rateWidth;

}else{

param.width = width / rateHeight;

param.height = maxHeight;

}

}

param.left = (maxWidth - param.width) / 2;

param.top = (maxHeight - param.height) / 2;

return param;

}

// --></mce:script>

</head>

<body>

<div id="preview_wrapper">

<div id="preview_fake">

<img id="preview" οnlοad="onPreviewLoad(this)"/>

</div>

</div>

<br/>

<input id="upload_img" type="file" οnchange="onUploadImgChange(this)"/>

<br/>

<img id="preview_size_fake"/>

</body>

</html>

繼續閱讀