Автообновление заголовка документа? - PullRequest
4 голосов
/ 16 сентября 2011

Я пробовал много способов, чтобы заголовок страницы автоматически обновлялся каждые 3 секунды, чтобы в заголовке отображалось количество непрочитанных сообщений.

Вот что я пробовал:

setInterval(function() {
        document.title = "<?php echo $inboxcc; ?>";
    }, 3000);

и

$(function() {
setInterval(function() {
     $(this).attr("title", "<?php echo $inboxcc; ?>");
    }, 3000);
});

Но ни один из них не работает.

Ответы [ 5 ]

7 голосов
/ 16 сентября 2011

Вам необходимо обновлять данные с сервера каждый раз, когда вам нужны свежие данные, поскольку блок PHP выполняется только один раз для каждого просмотра страницы (на сервере). Сделайте страницу PHP такой:

<?php
  // data.php
  // Grab the user from the session and calculate the 'unread messages' value
  $user['inboxcc'] = the_unread_messages_value;
  echo json_encode($user);
?>

Затем потяните число динамически, как это:

var updater = function() {
    $.getJSON('data.php',function(jsonuser){
        document.title = jsonuser.inboxcc;
        setTimeout(updater,3000);
    });
};

setTimeout(updater,3000);

Обратите внимание, что я использую setTimeout вместо setInterval, поскольку вы не можете быть уверены, что каждый запрос вернется через 3 секунды. Использование setTimeout в целом лучше.

5 голосов
/ 16 сентября 2011

Этот подход не сработает. Ваш оператор PHP будет выполняться один раз на стороне сервера, поэтому независимо от того, что вы делаете в JavaScript, заголовок не будет меняться более одного раза.

Вам необходим подход на основе AJAX, который установит свойство document.title в случае успеха:

$.ajax({
  url: 'new_page_title.php',
  data: {name: 'username', password: 'userpass'},
  success: function(data) { document.title = data;},
  dataType: 'text'
});

Теперь: хотя вы, безусловно, можете использовать этот код в вызове setInterval, я бы посоветовал проверять его каждые 3 секунды, что может быть немного сложным на вашем сервере и не обязательно. Каждые 15 - 60 секунд будут мягче.

setInterval(function() {
    $.ajax({
        ...
    });
}, 30000); // milliseconds
3 голосов
/ 16 сентября 2011

В дополнение к ответу @ mblase75 (который является правильным), вот дальнейшее объяснение распространенного заблуждения, в которое вы попали.


PHP - серверный препроцессор который выводит HTML и Javascript, который отправляется в ваш браузер, а затем не имеет ничего общего с *. 1006 *

Итак, ваш PHP:

<?php $inboxcc = 'Title'; ?>
<script type="text/javascript">
setInterval(function() {
    document.title = "<?php echo $inboxcc; ?>";
}, 3000);
</script>

Выводит:

<script type="text/javascript">
setInterval(function() {
    document.title = "Title";
}, 3000);
</script>

Это то, что видит ваш браузер.И это все.

1 голос
/ 16 сентября 2011

Блок PHP внутри JavaScript не может обновлять информацию для себя. Вам необходимо обновить заголовок, используя AJAX, скрытый iframe или другой способ. В этот момент ваш код заменяет элемент <title> на то же значение.

0 голосов
/ 16 сентября 2011

Ваш php-код не может быть интерпретирован в javascript, поэтому скрыть значение в скрытом вводе:

<input type="hidden" id="inboxcc" value="<?php echo $inboxcc; ?>">

Теперь вы можете вызвать значение в JavaScript:

setInterval(function() {
        document.title = document.getElementById('inboxcc').value;
    }, 3000);
...