我有一个图像目录,它位于我需要向用户提供的Web应用程序的上下文之外。目前我正在使用IHttpHandler来提供图像并使用一些javascript来浏览一组图像(导航现在是原始的)。我按照示例使用IHttpHandler来密切提供图像但是当我在firefox中查看图像时,浏览器挂起,当我在IE中查看时,我得到一个“堆栈溢出在行:0”。
IHttpHandler的代码
Public Class ShowImage : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest
Dim picid As String
If context.Request.QueryString("id") IsNot Nothing Then
picid = context.Request.QueryString("id")
Else
Throw New ArgumentException("No parameter specified")
End If
'' Convert Byte[] to Bitmap
context.Response.Cache.SetCacheability(HttpCacheability.NoCache)
context.Response.Cache.SetNoStore()
context.Response.Cache.SetExpires(DateTime.MinValue)
Dim newBmp As Bitmap = GetPhoto(picid)
If newBmp IsNot Nothing Then
Dim imgGraphics As Graphics = Graphics.FromImage(newBmp)
imgGraphics.DrawImageUnscaled(newBmp, 0, 0, 640, 480)
context.Response.StatusCode = 200
context.Response.ContentType = "image/jpeg"
newBmp.Save(context.Response.OutputStream, ImageFormat.Jpeg)
newBmp.Dispose()
Else
'' Return 404
context.Response.StatusCode = 404
context.Response.End()
End If
End Sub
...
Public ReadOnly Property IsReusable() As Boolean _
Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property
End Class
以下是调用上面定义的IHttpHandler的javascript代码:
function updateImage(){
var ddlPhotos = document.getElementById("ddlPhotos");
var selected = ddlPhotos.options[ddlPhotos.selectedIndex].value;
if( selected != -1 ){
// Update the image
retrievePicture(document.getElementById("propertyImage"), selected)
}
}
function retrievePicture(imgCtrl, picid)
{
imgCtrl.src = 'ShowImage.ashx?id=' + picid;
}
最后这里是img标签,即“占位符”:
<img src="#"
alt="Property Photo"
width="640px"
height="480px"
id="propertyImage"
onload="retrievePicture(this, '<%= pictureId.value %>');"
/>
我很困惑为什么javascript似乎螺旋式失控......
答案 0 :(得分:2)
我的猜测 - 不是JavaScript专家 - 是每次图片加载完成后都会触发onload
事件。换句话说,一旦图像被加载,它就会触发加载一个新图像...这会触发加载一个新图像......这会触发加载一个新图像等。
您可能会在多次调用服务器时看到相同的图像 - 当然,除非浏览器正在缓存它。无论如何,您需要以其他方式触发它,或者让触发器检测到已加载的图像已经是正确的图像,并且无需替换它。
答案 1 :(得分:0)
我怀疑更改src并加载新图像的行为可能会再次触发图像的“onload”事件。
在设置源之前尝试清除事件,可能看起来类似于:
function retrievePicture(imgCtrl, picid)
{
imgCtrl.onload = null;
imgCtrl.src = 'ShowImage.ashx?id=' + picid;
}