Обновление: проблема исправлена! Вы можете вынуть 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>
';
}
?>
Это будет намного проще, чище и будет работать сразу же, если вы просто измените loadmsg<?php echo $pm_id; ?>()
в loadmsg(<?php echo $pm_id; ?>)
, Обратите внимание, я передаю id
в качестве параметра вместо части имени функции. Затем выведите свою функцию за пределы цикла, объявите ее только один раз как loadmsg(id)
и использовать идентификатор внутри функции как
xhttp.open("GET", "/LinkMonster/viewmsg.php?msg_id="+id, true);
Других решений пока нет …