【问题标题】:Why this mmediately invoked functions is not working properly为什么这个立即调用的函数不能正常工作
【发布时间】:2012-11-25 10:35:58
【问题描述】:

我正在使用立即调用函数模式,但这没有传递 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)");
}

【问题讨论】:

  • 你在最后一个$.post:f function有语法错误。
  • @tjameson 我怎样才能消除这个错误
  • 我在回答中做了一系列修复,希望对您有所帮助。

标签: php javascript


【解决方案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 的见解。希望它有用(如果这是问题,请接受他的回答)。

编辑:其他注释

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

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

【讨论】:

  • 谢谢,但 tocom id 仍未通过。
  • 看看@devnull69 的回答。我将它添加到我的,但如果这解决了它,请接受他。
  • @tjameson 现在工作正常,但为什么发送消息很慢(大约需要 2-3 秒才能出现在聊天窗口中)。请帮助。
  • @tjameson 发送速度很慢。你会在你的答案中添加 $.get 或其他方法吗?谢谢
  • 这将需要更改您的服务器代码,而我无权访问。既然您的问题已经得到解答,也许是时候提出一个新问题了?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多