Обновление сообщений Live — Javascript не загружается даже из-за его наличия [HTML + PHP + Javascript]

Обновление: проблема исправлена! Вы можете вынуть javascript из цикла и передать ему параметр, посмотреть на комментарии, чтобы увидеть полную информацию (спасибо!

Я старался держать его как можно короче, за исключением того, что все это важно! 🙂

Вот как работает мой цикл:

1) Я использую цикл while для всех найденных сообщений (работает)

2) Затем я вставляю данные сообщения в HTML-шаблон внутри цикла while.

3) Затем я даю каждому сообщению функцию 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 ..:

<?php
}
?>

Так что в основном это выводит, что:

                   <li>
<a href="javascript:;" onclick="loadmsg16()">
<center>
<div>
<strong>
<span class=" label label-danger">
[email protected]                              </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>

Более крупный пример (более 1 сообщения) — Pastebin.com

Теперь все работает, когда я получаю новое сообщение и обновляю страницу, сценарии генерируются, как и ожидалось, и когда я нажимаю сообщение, оно меняет div с именем «page-wrapper» на страницу, специфичную для msg.
(/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 для первой загрузки msgs в этот div, затем я использую ту же функцию javascript с setIntreval каждую секунду, чтобы загружать сообщения снова и снова

Это тоже работает! Я отправляю себе сообщение и оно выскакивает без проблем, вживую, без обновления …

Итак, если все это работает, почему я здесь?

Функции 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>
';
}
?>

0

Решение

Это будет намного проще, чище и будет работать сразу же, если вы просто измените loadmsg<?php echo $pm_id; ?>() в loadmsg(<?php echo $pm_id; ?>), Обратите внимание, я передаю id в качестве параметра вместо части имени функции. Затем выведите свою функцию за пределы цикла, объявите ее только один раз как loadmsg(id) и использовать идентификатор внутри функции как

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]