有没有办法将一些HTTP服务器事件传递到单个javascript函数中?

时间:2012-12-18 13:37:28

标签: javascript html httpexception

我有一个C#webserver,它为基于浏览器的客户端提供了一些html / js / css和图像。

我使用javascript动态创建页面,在从websocket C#服务器接收消息时填充图像和div。

有时,我收到来自websocket的消息,我尝试访问可能受保护的网络服务器中的资源。

我有一些自定义的http服务器事件(比方说406),因为否则the browser pops up a dialog box for digest auth login

我想知道是否有办法将所有406个事件引导到同一个函数中,比如说

RegisterHttpEventHandler(406,myFunction);

我想我可以在try和catch中包装任何请求/动态负载,虽然我喜欢这种方式更清晰。

修改

以下是我目前实施的工作流程示例,该工作流程正常。

// Websocket definition
var conn = new WebSocket('ws://' + addressIP);
// Websocket receiver callback

conn.onmessage = function (event) {
        // my messages are json-formatted
        var mObj = JSON.parse(event.data);
        // check if we have something nice
        if(mObj.message == "I have got a nice image for you"){
        showImageInANiceDiv(mObj.ImageUrl);
        }
    };

// Dynamic load image
function showImageInANiceDiv(imgUrl )
{
    var imgHtml = wrapUrlInErrorHandler(imgUrl);
    $("#imageBox").html(imgHtml);
}    

// function to wrap everything in an error handler
function wrapUrlInErrorHandler(Url)
{
    return '<img src="' + Url + '" onerror="errorHandler(\''+ Url +'\');"/>';
}

// function to handle errors
function errorHandler(imgUrl)
{
     console.log("this guy triggered an error : "  + imgUrl);
}




//

1 个答案:

答案 0 :(得分:1)

  

onerror并没有告诉我失败了什么,所以我必须让XHR找到它。这是一件小事

你可以先试试XHR。如果失败,您就知道发生了什么,如果成功,您可以显示缓存中的图像(另请参阅here)。当然,您也可以让它为特殊状态代码调用一些全局定义的自定义挂钩 - 但您需要手动调用它,没有预定义的全局事件源。

  

我希望有类似document.onerror处理程序的东西,以避免每次我必须在页面中放置图像时使用wrapUrlInErrorHandler函数

那是不可能的。 error事件(MDNMSDN)不会冒泡,只会直接触发<img>元素。但是,如果您没有使用内联事件属性,那么您可以绕过那个丑陋的wrapUrlInErrorHandler(traditional) advanced event handling

function showImageInANiceDiv(imgUrl) {
    var img = new Image();
    img.src = imgUrl;
    img.onerror = errorHandler; // here
    $("#imageBox").empty().append(img);
}
// function to handle errors
function errorHandler(event) {
     var img = event.srcElement; // or use the "this" keyword
     console.log("this guy triggered an "+event.type+": "  + img.src);
}