2

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

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

有时,我从 websocket 收到一条消息,并尝试访问 web 服务器中可能受保护的资源。

我为此有一些自定义的 http 服务器事件(例如 406),否则浏览器会弹出一个对话框,用于摘要身份验证登录

我想知道是否有办法将所有 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);
}




//
4

1 回答 1

1

onerror 并没有告诉我失败的原因,所以我必须制作一个 XHR 才能找到它。这是小事

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

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

这不可能。事件errorMDNMSDN)不会冒泡,它直接触发并且仅在<img>元素上触发。wrapUrlInErrorHandler但是,如果您不使用内联事件属性,而是使用(传统的)高级事件处理,您可以绕过这个丑陋的问题:

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);
}
于 2012-12-18T15:51:10.363 回答