-2

我正在使用立即调用函数模式,但这没有传递 id

1.用户点击$user时,传入id,出现聊天窗口

echo "<div class='boxbottom'><a href='#' onclick=chat_com_one($id);> >$user</a><br></div>";

2.函数 chatcom_load_one 继续检查,如果有任何消息从 id 传递给 chatcom_load_one 函数。

但问题是 onclick 函数确实传递了 id 但立即调用的函数没有将 id 传递给 post 函数。

发送消息也很慢?

请帮助或建议任何替代方法,我认为错误在 chat_load_one 模式中。

function chat_com_one(id) {

    $('#chatcom').show('fast');
    (function chatcom_load_one(id) {
        $.post('sendchat2.php', {
            option: 'chatcom_load_one',
            tocom: id
        }, function (data) {
            $('#chatcom #commid #commidwin').html(data);
            setTimeout(chatcom_load_one(id), 1000);
        });
    }());
    $('#chatcom_send').click(function () {
        var text = document.getElementById('chatcom_text').value;
        $.post('sendchat2.php', {
            option: 'chat_com_send_one',
            text: text,
            tocom: id
        }, f
        function (data) {
            document.getElementById('chatcom_text').value = '';
        });
    });
}

我的服务器上的发送功能

    if($_REQUEST['option']=='chat_com_send_one'){
    $session=new $session;
    $text=mysqli_real_escape_string($db3->connection,$_POST['text']);
    $tocom=mysqli_real_escape_string($db3->connection,$_POST['tocom']);
    $sql=mysqli_query($db3->connection,"INSERT INTO chat_com(fro,tocom,mesg,time) VALUES ('$session->userid','$tocom','$text',CURRENT_TIMESTAMP)");
}
4

2 回答 2

1

首先,我注意到两个问题:

  • 您在参数列表中有语法错误$.post
  • 你可能不想这样做:setTimeout(chatcom_load_one(id), 1000);

这是修复了这些错误的代码的更新版本:

function chat_com_one(id) {

    $('#chatcom').show('fast');
    (function chatcom_load_one(id) {
        $.post('sendchat2.php', {
            option: 'chatcom_load_one',
            tocom: id
        }, function (data) {
            $('#chatcom #commid #commidwin').html(data);
            setTimeout(function () {
                chatcom_load_one(id);
            }, 1000);
        });
    }());

    $('#chatcom_send').click(function () {
        var text = document.getElementById('chatcom_text').value;
        $.post('sendchat2.php', {
            option: 'chat_com_send_one',
            text: text,
            tocom: id
        },
        function (data) {
            document.getElementById('chatcom_text').value = '';
        });
    });
}

此外,由于您使用的是 jQuery,因此您可以简化document.getElementById.... 另一个更新版本(进行了一些更改以使其更具可读性):

function chat_com_one(id) {
    $('#chatcom').show('fast');

    (function chatcom_load_one(id) {
        $.post('sendchat2.php', {
            option: 'chatcom_load_one',
            tocom: id
        }, function (data) {
            $('#commidwin').html(data);
            setTimeout(function () {
                chatcom_load_one(id);
            }, 1000);
        });
    }(id));

    $('#chatcom_send').click(function () {
        var text = $('#chatcom_text').val();
        $.post('sendchat2.php', {
            option: 'chat_com_send_one',
            text: text,
            tocom: id
        },
        function (data) {
            $('#chatcom_text').val('');
        });
    });
}

这些只是一些清理工作,可能还有其他清理工作。

编辑:

在我最终更新的代码中添加了 devnull69 的见解。希望它有用(如果这是问题,请接受他的回答)。

编辑:其他注释

你为什么$.post在里面chatcom_load_one?作为 ,它会更有意义$.get,并且仍然会发送查询参数。这本身并不是一个真正的问题,但它的风格很糟糕。这可能应该在一个名为getchat.php或其他东西的文件中,而不是做我期望的寻找text参数。

另外,我不知道 的实现sendchat2.php,但您可能应该减少超时。试试 250 毫秒左右的时间。这不会使服务器超载,并且会缩短响应时间。

于 2012-11-25T10:47:07.263 回答
1

除了前面提到的问题之外,您还可以在没有任何参数的情况下调用立即执行的函数。您必须将(id)参数添加到函数调用中,以便将 id 元素移交给函数内部的本地副本。

(function chatcom_load_one(id) {
   ...
}(id));
于 2012-11-25T10:51:26.337 回答