实时更新消息 - Javascript 未加载,即使它存在 [HTML + PHP + Javascript]

Updating Messages Live - Javascript is not loaded even due its there [HTML + PHP + Javascript]

更新:问题已解决!您可以将 javascript 退出循环并向其传递一个参数,查看评论以了解完整的解决方案(:谢谢!

我尽量保持它的简短,除了这一行非常重要! :)

我的循环是这样工作的:

1) 我对找到的所有消息使用 while 循环(有效)

2) 然后我将消息数据插入到 while 循环内的 html 模板中..

3) 然后我给每条消息一个带有特殊id的onclick函数..

这是奇怪的部分,刷新后一切正常..

在我解释确切的问题之前,让我给你看源代码:

这是循环的开始,我只是获取该特定消息的数据,然后关闭 php 以继续循环内部...

    <?php
    while($inbox = mysql_fetch_array($sqlinbox))
        {

        $pm_id = $inbox['id'];
        $sender = $inbox['sender'];
        $subject = $inbox['subject'];
        $message = $inbox['message'];

        ?>

现在这是循环内部发生的事情,

首先我自己生成消息:

                   <li>
                    <a href="javascript:;" onclick="loadmsg<?php echo $pm_id; ?>()">
                      <center>
                      <div>
                        <strong>
                          <span class=" label label-danger">
                            <?php echo $sender; ?>
                          </span>
                        </strong>
                      </div>
                      </center>
                      <div style="width:80%; text-align:center; margin:auto;"><?php echo $message; ?></div>
                    </a>
                  </li>

然后我生成一个简单的 javascript 函数,用于将消息加载到 div... 我知道大话题有很多可能性,但问题非常简单超出我的知识,请帮助让我们继续..这是脚本:

 <?php
                        echo '
                        <script>
                        function loadmsg' . $pm_id . '() {
                        var xhttp = new XMLHttpRequest();
                        xhttp.onreadystatechange = function() {
                        if (this.readyState == 4 && this.status == 200) {
                        document.getElementById("page-wrapper").innerHTML =
                        this.responseText;
                        }
                        };
                        xhttp.open("GET", "/LinkMonster/viewmsg.php?msg_id=' . $pm_id . '", true);
                        xhttp.send();
                        }
                        </script>
                        ';
 ?>

当然让我们关闭 while 循环..:[=​​80=]

<?php
}
?>

所以基本上输出是:

                   <li>
                    <a href="javascript:;" onclick="loadmsg16()">
                      <center>
                      <div>
                        <strong>
                          <span class=" label label-danger">
                            orburgel222@gmail.com                              </span>
                        </strong>
                      </div>
                      </center>
                      <div style="width:80%; text-align:center; margin:auto;">lllllllllll</div>
                    </a>
                  </li>
<script>
 function loadmsg16() {
 var xhttp = new XMLHttpRequest();
 xhttp.onreadystatechange = function() {
 if (this.readyState == 4 && this.status == 200) {
 document.getElementById("page-wrapper").innerHTML =
 this.responseText;
 }
};
xhttp.open("GET", "/LinkMonster/viewmsg.php?msg_id=16", true);
xhttp.send();
}
</script>

Bigger example (more then 1 msg) - Pastebin.com

现在一切正常,当我收到一条新消息并刷新页面时,脚本将按预期生成,当我单击一条消息时,它会将名为 "page-wrapper" 的 div 更改为消息具体页面 (/LinkMonster/viewmsg.php?msg_id=16)

但是,总有一个但是,我想把事情提升到一个新的水平,并在不刷新页面本身的情况下实时刷新消息,所以当我收到一条消息时,它会在它应该出现的地方弹出,所以我这样做了:

<div id="inboxmsgs">
                    <?php
include("./UpdateMsgs.php");
    ?>
                  </div>
                  <script>
                    function updateMSGS()
                    {
                    var xhttp = new XMLHttpRequest();
                    xhttp.onreadystatechange = function() {
                    if (this.readyState == 4 && this.status == 200) {
                    document.getElementById("inboxmsgs").innerHTML =
                    this.responseText;
                    }
                    };
                    xhttp.open("GET", "/LinkMonster/UpdateMsgs.php", true);
                    xhttp.send();
                    }
                    setInterval("updateMSGS()",1000); //call updateRow() function every 1 seconds.
                  </script>

所以基本上我把这个 div 命名为 'inboxmsgs' 并且我第一次使用 include 将消息加载到那个 div 中,然后我使用相同的 javascript 每秒设置一次的函数来一次又一次地加载消息

这也行!我给自己发了一条消息,它弹出没有任何问题,直播,没有刷新...

如果一切正常,为什么我会在这里?

在每条消息后加载的 javascript 函数并没有真正加载到页面中,仅加载到 html 中,不要误会我的意思,它们在它们应该产生的地方产生,它们也有正确的值,只是 chrome 说即使它在那里也找不到函数!如果我刷新页面,它只会找到该函数,就像我需要告诉 chrome 查询该函数或其他东西一样。这对您来说有意义吗?请随时向那些只想要它的人提出任何问题,甚至是完整的系统 (:

只是为了确保您理解我的意思: 假设我的收件箱中有 3 条消息,如果我单击它们,一切正常,它会正确显示消息页面,但随后我收到一条新消息,消息显示正确,javascript 也正在加载正确地,我仍然可以点击我已经拥有的所有 3 个消息,但是如果我点击新的消息 (num4),chrome 说我找不到那个函数 [ex: loadmsg16() ],如果我仍然发送另一个消息我可以访问我已经拥有的所有 3 条消息,但现在有 2 条额外的消息我无法点击,因为它们的功能没有加载,现在如果我刷新页面,所有 5 条消息都可以完全点击!

完整源代码:

                            <?php
    while($inbox = mysql_fetch_array($sqlinbox))
        {
        $pm_id = $inbox['id'];
        $sender = $inbox['sender'];
        $subject = $inbox['subject'];
  $message = $inbox['message'];

        ?>
                  <li>
                    <a href="javascript:;" onclick="loadmsg<?php echo $pm_id; ?>()">
                      <center>
                      <div>
                        <strong>
                          <span class=" label label-danger">
                            <?php echo $sender; ?>
                          </span>
                        </strong>
                      </div>
                      </center>
                      <div style="width:80%; text-align:center; margin:auto;"><?php echo $message; ?></div>
                    </a>
                  </li>

                  <li class="divider"></li>
                        <?php
                        echo '
                        <script>
                        function loadmsg' . $pm_id . '() {
                        var xhttp = new XMLHttpRequest();
                        xhttp.onreadystatechange = function() {
                        if (this.readyState == 4 && this.status == 200) {
                        document.getElementById("page-wrapper").innerHTML =
                        this.responseText;
                        }
                        };
                        xhttp.open("GET", "/LinkMonster/viewmsg.php?msg_id=' . $pm_id . '", true);
                        xhttp.send();
                        }
                        </script>
                        ';
        }
    ?>

如果您只需将 loadmsg<?php echo $pm_id; ?>() 更改为 loadmsg(<?php echo $pm_id; ?>),它将变得更容易、更干净并且可以立即工作。请注意,我将 id 作为参数而不是函数名称的一部分传递。然后将你的函数带到循环之外,只将它声明一次为 loadmsg(id) 并在函数内部使用 id 作为

xhttp.open("GET", "/LinkMonster/viewmsg.php?msg_id="+id, true);