0

我正在进入 Web 开发的第二天,所以要温柔!

我正在尝试编写一个小网络应用程序,它允许用户访问一个站点并单击/点击屏幕以将一个点指向另一个屏幕。为此,我设置了一个 Django 服务器来处理数据,我使用 Javascript 来获取点击/点击位置,通过 POST 数据将其发送到服务器,然后使用 Processing.js 绘制它(我的老板很大关于处理,这实际上是对通过手机等在大屏幕上处理的交互性的测试)。

我不是网络开发人员,所以即使是这个简单的任务也很有挑战性。直到此时我都感觉很舒服。当用户加载交互网页时,他们会被分配给应用程序的任意用户 ID,这让他们可以控制他们的特定点。我希望在用户离开页面时删除该点。我计划稍后实施备份超时,但我希望首先进行即时删除以获得最佳体验,最接近预期。(我认为我们的最终目标是有一个漂亮的大屏幕运行一个简单的游戏,人们可以走过,使用屏幕上的二维码启动交互站点,然后加入游戏。当他们感到无聊时,他们只需关闭网站并从游戏​​屏幕中删除它们,简单)。

在我的交互页面中,我有这段代码(对糟糕的变量名表示歉意):

<body onload="load()" onbeforeunload="unload()"> 
<canvas id="canv" width="1000" height="1000"/>

<script type="text/jscript">
    var userid;
    
    function load() {       
        userid = Math.floor(Math.random()*1000) //this will of course be changed
        var canv = document.getElementById('canv');
        canv.addEventListener('click', onCanvasClick);
        //$(window).unload(unload());
    }
    
    function onCanvasClick(event) {
        var cx, cy;
        var canvv = document.getElementById('canv');
        
        canoffset = $(canvv).offset();
        cx = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft - Math.floor(canoffset.left);
        cy = event.clientY + document.body.scrollTop + document.documentElement.scrollTop - Math.floor(canoffset.top) + 1;
        
        cx = (((cx - 500) / 500) * 3);
        cy = (((cy - 500) / 500) * 3);
        
        var data = {
            x: cx,
            y: cy,
            id : userid,
            deleteMe : 0
        };
        $.post("", data);
    }
    
    function unload() {
    //send remove code for this user
        var data = {
            x: 0,
            y: 0,
            id: userid,
            deleteMe : 1
        };
        $.post("", data);
        //alert("test");
    }
</script>

这个 POST 数据应该被发送到 Django 服务器。从onCanvasClick函数发送的 POST 被成功接收,并且我看到点按计划移动。unload()但是,无论我是否使用beforeunloadorunload事件(或者,如您所见注释掉的 JQuery unload) ,都不会收到从函数发送的 POST 。但是,注释掉的警报仍然会触发。

我在这里想念什么?是否有一种行之有效的方法来告诉服务器用户已离开页面?

4

2 回答 2

1

没有 100% 可靠的方法来判断某人何时离开了您的页面。您可以做的最好的事情是使用一些 AJAX 轮询并假设一旦轮询停止用户已经离开,或者可能使用 Web 套接字(不是普遍可用的)来保持连接打开。

例如 - 我正在使用平板电脑浏览您的网站,但我失去了互联网连接。beforeunload在那种情况下不会帮助你。

于 2012-06-07T18:55:23.473 回答
0

基本上你有一个浏览器通常会获胜的竞争条件。

现代浏览器试图尽可能快地加速页面。人们讨厌等待下一页加载,所以他们所做的就是杀死在卸载/卸载前打开的任何请求。较旧的浏览器会等待 for 循环,但他们杀死了它。

于 2012-06-07T19:01:10.543 回答