相关疑难解决方法(0)

window.onbeforeunload和window.onunload在Firefox,Safari,Opera中不起作用?

在我的聊天应用程序中,当我的应用程序关闭时,我需要得到用户的确认.

所以我使用了window.onbeforeunload确认警报和window.onunloadlogout().

  1. 但这两个功能都在IE和Chrome中运行.(应用程序运行正常)

  2. window.onbeforeunload 没有在Opera工作,我的消息将不会在Firefox中显示.

  3. window.onunload 不适用于Safari,Opera和Firefox.

我的javaScript代码将是,

// Used for confirmation , to closing the window 
window.onbeforeunload = function () {

    return  "Are you sure want to LOGOUT the session ?";
}; 

// Used to logout the session , when browser window was closed 
window.onunload = function () {

    if((sessionId != null)&&(sessionId!="null")&& (sessionId != ""))
        logout();
};
Run Code Online (Sandbox Code Playgroud)

我也尝试了与JQuery相同的功能,

<script type="text/javascript">

    $(window).on('beforeunload', function() {
        return 'Are you sure want to LOGOUT the session ?';
    });

    $(window).unload(function() …
Run Code Online (Sandbox Code Playgroud)

javascript jquery javascript-events

73
推荐指数
5
解决办法
18万
查看次数

WebSocket.onclose应该由用户导航或刷新触发吗?

第1部分:预期的行为?

我发现Firefox和Chrome之间的浏览器行为与onclose被调用的处理程序有关.

onclose如果它是由用户页面导航/刷新引起的,Chrome似乎不会触发.但是,Firefox确实触发了onclose.

在我看来,Firefox可能在这里表现正常:

当WebSocket连接可能干净地关闭时,用户代理必须创建一个使用CloseEvent接口的事件,事件名称为close,不会冒泡,不可取消,没有默认操作,其wasClean属性设置为true如果连接干净,则为false,否则将其code属性设置为WebSocket连接关闭代码,并将其reason属性设置为WebSocket连接关闭原因; 并将任务排队以首先将readyState属性的值更改为CLOSED(3),然后在WebSocket对象上调度该事件.

来源:http://www.w3.org/TR/2011/WD-websockets-20110419/#closeWebSocket

即使它可能导致一些偷偷摸摸的代码/意外行为.

任何人都可以确认预期的行为吗?

第2部分:如何实现自动重新连接?

如果您有一个为用户自动重新连接的库,您如何知道是否应该尝试重新连接?你检查CloseEvent.wasClean房产吗?我不得不假设'干净'意味着关闭应该通过API调用WebSocket.close()或服务器发送关闭帧发生?如果网络错误导致关闭,我猜测wasClean会是false什么?

在Pusher JavaScript库中,我们假设(关闭 - >等待 - >连接)关闭应触发重新连接,除非我们处于关闭状态 - 开发人员已选择关闭连接.似乎socket.io客户端库做出了相同的假设.

基于此,由用户导航/刷新引起的Firefox onclose事件触发了不必要的重新连接,因为两个库都没有检查该CloseEvent.wasClean属性.

示例和视频

这是一个可用于演示不一致性的示例:http: //jsbin.com/awonod/7

这是我演示问题的视频:http: //www.screenr.com/vHn8 (已经很晚了,忽略了几个漏洞:))

需要注意的一点是,我按下Escape键也可能导致WebSocket连接关闭.但是,如果您仔细观察或亲自尝试,您将看到在页面刷新之前记录关闭事件.

reconnect event-handling websocket

32
推荐指数
1
解决办法
1万
查看次数

如果从未进行关闭握手,WebSockets将不会在IE上关闭

我一直在用JavaScript实现WebSocket,但我遇到了一个问题:
我的Web应用程序所连接的端点在发送一个封闭的控制框架时没有将其发送回去。

这还不错,因为浏览器会在一段时间后关闭WebSocket连接。

但是需要注意的几件事是:

  • 浏览器只允许同时连接一定数量的WebSocket。

  • 刷新Web应用程序时,将创建一个新的WebSocket。

这会导致IE上的问题:
刷新Web应用程序超过6次时,无法建立WebSocket连接。

如果尚未完全关闭WebSocket,似乎IE不会“删除” WebSocket。奇怪的是,Web套接字的数量似乎从未因刷新或等待而减少。

仅通过关闭浏览器窗口或选项卡将WebSockets的数量重置为0。


我做了一些研究,这是我发现的:


浏览器仅支持同时连接特定数量的WebSocket。

IE支持6个websocket进行连接[链接]

Chrome支持连接255个websocket [link]

并且socket.onclose()不会在您执行操作时触发socket.close(),而是在端点以关闭消息进行响应时调用。 [链接]

IE等待15秒,以便端点发送关闭消息[link]

Chrome等待60秒钟才能收到响应消息[很抱歉,对此没有链接,通过测试发现了此消息]。

如果未收到响应消息,则浏览器将关闭WebSocket连接,并应发生TimeoutError。

如果我错了请指正我:)


我尝试过使用unbeforeload与端点的断开连接,希望浏览器在一段时间后关闭连接,但是没有运气。[链接]
也可能是IE无法在[link]unbeforeload函数内执行请求的原因。

题:

  1. 是否可以通过JavaScript重置浏览器中连接到端点的WebSocket的数量?
  2. 有没有一种方法可以立即从端点断开WebSocket而不完全关闭连接?
  3. 是唯一可行的方法来通知托管其端点的主机进行一些更改,以便他们发送关闭帧吗?
  4. 有什么我误解的东西,或者我可以尝试使其工作吗?

如果有人想了解更多关于WebSocket协议的信息,这是(我认为)很好的文档[link1] [link2]

更新:

只有刷新IE上的Web应用程序,WebSocket才会被销毁
如果您在Web应用程序中的页面之间导航,则会创建一个新的WebSocket,但最后一个WebSocket将被破坏。

javascript internet-explorer network-protocols websocket handshake

24
推荐指数
1
解决办法
570
查看次数

文件从浏览器传输到本地连接的iPhone

现在,我在My iPhone Application上创建了一个HTTP Server,并在那里托管了HTML.然后在浏览器中访问位于iPhone同一网络中的系统.我可以在浏览器上看到文件.

现在使用WebSockets我试图将文件从浏览器发送到应用程序,但它不起作用.文本消息没问题,但数据没有.作为一种解决方法,我通过Base64 String尝试了它,但在这种情况下也是套接字Get Closed.

为了使用JAVAScript上传,我编写了这段代码,在这里我尝试通过发送大小为200个字符的片段的Base64字符串.

    function sendFile() {
        var preview = document.querySelector('img');
        var file = document.querySelector('input[type=file]').files[0];
        var reader  = new FileReader();
        var rawData =  new ArrayBuffer();


        reader.onloadend = function () {
        var stringContent = reader.result;
        preview.src = stringContent;
        var array =  stringContent.match(/.{1,200}/g);
        for (var i = 0; i < array.length; i++) {
            ws.send(array[i]);
        };

      }
     if (file) {
        reader.readAsDataURL(file);
     }else {
        preview.src = "";
     }
}
Run Code Online (Sandbox Code Playgroud)

在iPhone方面,我使用了Libary CocoaHTTPServer的WebSocket

插座在此处关闭.

插座在此处关闭.

编辑

经过大量的试验和错误后,我才知道发生这种情况如果我在Mac浏览器中打开这个,不是在任何其他设备的浏览器如iPad,iPhone.这是非常奇怪的用例,但它是真的.

编辑二

经过大量的疑惑,我发现了一个线索,这对iPhone,iPad,iPod和Opera浏览器很有效,因为它们有旧的websocket支持,我从 …

javascript iphone websocket cocoahttpserver ios

11
推荐指数
1
解决办法
1647
查看次数