为什么这个立即调用的函数无法正常工作

时间:2012-11-25 10:35:58

标签: php javascript

我正在使用立即调用的函数模式,但这不是传递id

1.当用户点击$ user时,会传递ID并显示聊天窗口

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

2.功能chatcom_load_one继续检查,如果有任何消息传递给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)");
}

2 个答案:

答案 0 :(得分: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的实现,但你应该减少超时。尝试250ms左右的时间。这不会使服务器过载,也会缩短响应时间。

答案 1 :(得分:1)

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

(function chatcom_load_one(id) {
   ...
}(id));