实时更新消息 - 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);
更新:问题已解决!您可以将 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);