【问题标题】:jQuery AJAX call on mousemovejQuery AJAX 调用 mousemove
【发布时间】:2011-01-31 18:29:53
【问题描述】:

我有一个使用 gdimage 创建的图像,它有 40000 个 5x5 块链接到不同的用户配置文件,我希望当您将鼠标悬停在其中一个块上时,AJAX 将通过检测 x 和y 在图像上移动时的坐标。

然后当它被点击时,它获得的信息会链接到该用户的个人资料。

这是我目前得到的:

Javascript/jQuery:

<script type="text/javascript">

    jQuery.fn.elementlocation = function() {

        var curleft = 0;
        var curtop = 0;

        var obj = this;

        do {

        curleft += obj.attr('offsetLeft');
        curtop += obj.attr('offsetTop');

        obj = obj.offsetParent();

        } while ( obj.attr('tagName') != 'BODY' );


            return ( {x:curleft, y:curtop} );

    };


    $(document).ready( function() {

        $("#gdimage").mousemove( function( eventObj ) {

            var location = $("#gdimage").elementlocation();
            var x = eventObj.pageX - location.x;
            var x_org = eventObj.pageX - location.x;
            var y = eventObj.pageY - location.y;
            var y_org = eventObj.pageY - location.y;

            x = x / 5;
            y = y / 5;

            x = (Math.floor( x ) + 1);
            y = (Math.floor( y ) + 1);

            if (y > 1) {

                block = (y * 200) - 200;
                block = block + x;

            } else {

                block = x;

            }

            $("#block").text( block );
            $("#x_coords").text( x );
            $("#y_coords").text( y );

                $.ajax({
                    type: "GET",
                    url: "fetch.php",
                    data: "x=" + x + "&y=" + y + "",
                    dataType: "json",
                    async: false,
                    success: function(data) {
                        $("#user_name_area").html(data.username);
                    }
                });

        });

    });

</script>

PHP:

<?

    require('connect.php');

    $mouse_x = $_GET['x'];
    $mouse_y = $_GET['y'];

    $grid_search = mysql_query("SELECT * FROM project WHERE project_x_cood = '$mouse_x' AND project_y_cood = '$mouse_y'") or die(mysql_error());

    $user_exists = mysql_num_rows($grid_search);

    if ($user_exists == 1) {

        $row_grid_search = mysql_fetch_array($grid_search);

        $user_id = $row_grid_search['project_user_id'];


        $get_user = mysql_query("SELECT * FROM users WHERE user_id = '$user_id'") or die(mysql_error());

        $row_get_user = mysql_fetch_array($get_user);

        $user_name = $row_get_user['user_name'];
        $user_online = $row_get_user['user_online'];

        $json['username'] = $user_name;
        echo json_encode($json);

    } else {

        $json['username'] = $blank;
        echo json_encode($json);

    }

?>

HTML

<div class="tip_trigger" style="cursor: pointer;">

    <img src="gd_image.php" width="1000" height="1000" id="gdimage" />

    <div id="hover" class="tip" style="text-align: left;">
        Block No. <span id="block"></span><br />
        X Co-ords: <span id="x_coords"></span><br />
        Y Co-ords: <span id="y_coords"></span><br />
        User: <span id="user_name_area">&nbsp;</span>
    </div>

</div>

现在,来自 mousemove 位置的 'block'、'x_coords' 和 'y_coords' 变量工作正常并显示在 span 标签中,但它没有从 AJAX 函数获取 PHP 变量,我不明白为什么。

我也不知道怎么做,所以当点击鼠标时,它会从 fetch.php 获取变量并将用户引导到诸如“/user/view/?id=VAR_ID_NUMBER”之类的页面

我是在用错误的方式处理这个问题,还是做错了?任何人都可以帮忙吗? :)

【问题讨论】:

  • 为了网络服务器的爱,请不要在不受限制的 mousemove 回调中执行网络活动!
  • 鼠标移动 AJAX 调用可以快速杀死您的服务器。您是使用从 mousemove Ajax 调用返回的数据,还是想让它为鼠标单击做好准备?因为,最好只用鼠标点击来获取它的数据并重定向。
  • 哦,忽略我最后的评论。我看到您使用的是一个图像 div。
  • 你能发布你的 fetch.php 代码吗?它是否返回格式有效的 JSON 结果?
  • 但是拜托拜托,请限制mousemove功能。

标签: php jquery html ajax mousemove


【解决方案1】:

请参阅有关每次鼠标移动都进行抓取的 cmets。坏坏坏主意。使用一些限制。

也就是说,问题是,您没有以任何方式在成功函数中使用结果。

您的 PHP 函数不会向浏览器返回任何内容。 PHP 变量不会神奇地对您的客户端 JavaScript 可用。 PHP 只是简单地运行,生成一个 HTML 页面作为输出,然后将其发送到浏览器。然后,浏览器会根据需要解析发送给它的信息。

您需要修改您的 fetch.php 以使用您需要的数据生成一些格式正确的 JSON 字符串。它看起来像{ userid: 2837 }。例如,尝试:

echo "{ userid: $user_id, username: $user_name }";

在您的成功回调中,jQuery 将传递给该函数的第一个参数将是解析(希望格式正确)JSON 结果的结果,以便它成为正确的 JavaScript 对象。然后,在成功回调中,您可以使用结果,例如:

//data will contain a JavaScript object that was generate from the JSON
//string the fetch.php produce, *iff* it generated a properly formatted
//JSON string.
function(data) { 
  $("#user_id_area").html(data.user_id);
}

如下修改您的 HTML 示例:

User ID: <span id="user_id_area">&nbsp;</span>

其中 showHover 是实际显示悬停的辅助函数。

这是一个限制 mousemove 函数的模式:

jQuery.fn.elementlocation = function() {

    var curleft = 0;
    var curtop = 0;

    var obj = this;

    do {

    curleft += obj.attr('offsetLeft');
    curtop += obj.attr('offsetTop');

    obj = obj.offsetParent();

    } while ( obj.attr('tagName') != 'BODY' );


        return ( {x:curleft, y:curtop} );

};


$(document).ready( function() {

    var updatetimer = null;
    $("#gdimage").mousemove( function( eventObj ) {
        clearTimer(updatetimer);
        setTimeout(function() { update_hover(eventObj.pageX, eventObj.pageY); }, 500);
    }


    var update_hover = function(pageX, pageY) {
        var location = $("#gdimage").elementlocation();
        var x = pageX - location.x;
        var y = pageY - location.y;

        x = x / 5;
        y = y / 5;

        x = (Math.floor( x ) + 1);
        y = (Math.floor( y ) + 1);

        if (y > 1) {

            block = (y * 200) - 200;
            block = block + x;

        } else {

            block = x;

        }

        $("#block").text( block );
        $("#x_coords").text( x );
        $("#y_coords").text( y );

        $.ajax({
            type: "GET",
            url: "fetch.php",
            data: "x=" + x + "&y=" + y + "",
            dataType: "json",
            async: false,
            success: function(data) {
                //If you're using Chrome or Firefox+Firebug
                //Uncomment the following line to get debugging info
                //console.log("Name: "+data.username);
                $("#user_name_area").html(data.username);
            }
        });

    });

});

【讨论】:

  • 所以我在 echo - "{ userid: $user_id, username: $user_name }"; - 到 PHP,然后在 jQuery 中更改 - 成功:function(data) { } - TO - function(data) { showHover(data.userid, data.username); } - ALSO - 添加 -
    - 在 HTML 中用于显示信息的位置?是对的吗?因为 div 在那里,但没有信息放在里面。
  • 前几天我也尝试过这种方式:stackoverflow.com/questions/4820303/… - 但加载时间比我想要的要长一点。这可能是另一种可行的方法。顺便说一句,谢谢你们到目前为止的帮助! :D
  • 不不,showHover 是您自己实现的一个函数,用于更新悬停 div 并使其可见。 ---- 所以,我更新了我的示例,向您展示了一种可以修改悬停 div 中信息的可能方式。
  • 嗯...我已经用我现在拥有的代码更新了我的问题 - 尚未添加鼠标移动的时间延迟。到目前为止,我没有在 user_name_area 中看到任何信息?我对您发布的时间延迟代码的放置位置也有些困惑。我知道在 jQuery 中,但我不确定要保留什么以及删除什么。对不起! ://
  • 抱歉,我只是想引导您朝着正确的方向制作您需要的代码。我已经更新了示例,使其更加明确。我没有测试它,所以可能有错字或错误。顺便说一句,我会强烈建议花一些时间来了解更多关于 JavaScript 和客户端编程的知识,以及对你有帮助的调试技术。这将使您的生活更加轻松。
【解决方案2】:

你能告诉我们PHP代码吗?你在返回数据上使用json_encode吗?

另一种方法是简单地将图像作为&lt;div&gt; 容器的背景并将&lt;a&gt; 元素排列在您需要它们的&lt;div&gt; 中,然后简单地使用jQuery 绑定到它们的点击处理程序。

如果浏览器不支持 jQuery 或 javascript,这也有好处,因为您实际上可以将所需的 URL 放在锚点的 HREF 属性中。这样,如果没有启用 jQuery,链接将正常加载。

框架实现如下所示:

示例 CSS

#imagecontainer {
background-image: url('gd_image.php'); 
width: 1000px; 
height: 1000px;
position: relative;
}

#imagecontainer a {
height: 100px;
width: 100px;
position: absolute;
}

#block1 {
left: 0px;
top: 0px;
}

#block2 {
left: 100px;
top: 0px;
}

示例 HTML

<div id="imagecontainer">
<a href="" id="block1"></a>
<a href="" id="block2"></a>
</div>

示例 jQuery

$(document).ready(function(){
$("#block1").click(function(){ /* do what you need here */ });
});

【讨论】:

  • 加载会不会需要一些时间,因为 CSS 中有 40000 个#block ID,HTML 中有 40000 个 标签,PHP/MySQL 中有 40000 个查询?
  • 它会比包含 4000 张用户个人资料图片的图片小!您可以使用 CSS 选择器压缩 CSS,也可以使 &lt;a&gt; 标签向左浮动,以便它们自然填充
  • 这将像一个带有“DDoS 我,拜托!”的红色大按钮。标签。
  • 我可以通过浮动它们来填充它们,除非用户在注册时选择了位置,因此该选项不起作用。 @Radoslav,我不确定你为什么写 DDoS,是用户注册我的网站并成为会员。并且被放置在主页图片上,这样人们就可以保持联系并查看在线游戏中当前活跃的人......除非我被误解了?
  • 虽然它的数据比大图像少,但渲染这么多单独的 DOM 元素对用户浏览器的负担会大得多。
猜你喜欢
相关资源
最近更新 更多
热门标签