Обновление только одной <div>на странице только с обычным Javascript - PullRequest
11 голосов
/ 13 мая 2011

Если я не получаю какую-либо информацию с сервера, но хочу перезагружать / обновлять div каждые N секунд, как мне это сделать?

Новое в javascript: я пробовал что-то вроде

 <script type = 'text/javascript'>
    function refresh(){
        setTimeout(window.location.reload(), 10000);
    }

    </script>

    <div id='target' onLoad='refresh()'>
<?    
var =grab some rapidly changing content from the web    
print var
  ?>  
    </div>
    <div>
    some stuff that doesn't get refreshed
    </div>

Мне не ясно, что мне нужен AJAX, если я не получаю новую информацию с сервера ... поэтому сейчас я хотел бы знать, как заставить его работать только в javascript

РЕДАКТИРОВАТЬ: Я предпочитаю не использовать библиотеку для этой основной операции, поэтому в идеале я бы не использовал jquery, прототип и т. Д. РЕДАКТИРОВАТЬ II: Не уверен, почему люди говорят, что div не меняется ... его содержимое динамичносхватил (скажем, выскребал) из Интернета ... и каждый раз, когда он собирает материал, материал меняется у источника ... примером может быть получение результатов поиска из твиттера, которые меняются очень быстро ...

Ответы [ 7 ]

6 голосов
/ 14 мая 2011

Да, вам нужен Ajax, потому что по определению это Ajax. ОСОБЕННО, если вы хотите получить контент с другого сайта.

Я знаю, что вы сказали, что хотите использовать простой javascript, но проверьте это, возможно, вам понравится. Взгляните на этот удивительный плагин jQuery. https://github.com/jamespadolsey/jQuery-Plugins/tree/master/cross-domain-ajax/

Это ОЧЕНЬ ПРОСТО ИСПОЛЬЗОВАТЬ это позволяет выполнять Ajax sing jQuery с одной ОЧЕНЬ БОЛЬШОЙ РАЗНИЦЕЙ: вы можете получить контент из В ЛЮБОМ МЕСТЕ (например, другой сайт, откуда приходит ваш контент). Вы просто используете тот же метод jQuery.load () или метод .ajax (), как и на своем собственном сервере, за исключением того, что вы можете получать контент из любого места!

Просто добавьте скрипт плагина на страницу (после jQuery), затем используйте метод .load (), как описано здесь .

Так что в вашем случае вы можете сделать что-то вроде этого:

$('div#target').load('http://somewhere.com #newContent');

Это получит #newContent отwhere.com и поместит его внутри #target на вашем сайте.

Вы можете сделать что-то вроде этого, используя javascript setInterval :

setInterval( function() {
    $('div#target').load('http://somewhere.com #newContent');
}, 5000); //repeat function every 5000 milliseconds

Это будет повторять все, что находится внутри функции () {} каждые 5000 миллисекунд (или 5 секунд).

Вы также можете получить контент со своего сайта:

$('div#target').load('http://yoursite.com/some-page #someContent');

Это поместит #someContent и все, что внутри него, из http://yoursite.com/some-page в #target на http://yoursite.com/whatever-the-current-page-is

В общем, это очень простой способ загрузки контента. Размер jQuery составляет всего 31 КБ (минимизировано), и я считаю, что оно того стоит. Нет необходимости заново изобретать колесо, когда jQuery может делать то, что вы хотите, причем эффективно, если только вы не пытаетесь изучать и выводить JavaScript. Если вы просто хотите, чтобы ваш сайт работал (важен конечный результат), тогда предложите супер простой метод, который я только что объяснил.

1 голос
/ 14 мая 2011

ОК, так что вам нужен AJAX. Ну, не часть «X», вам просто нужна асинхронная часть Javascript. Сервер может возвращать XML или JSON, но в вашем случае проще всего просто вернуть двоичный объект HTML, который вы хотите поместить в div.

Но вам нужно совершить поездку на сервер, потому что в браузере ничего не изменилось, изменилось только содержимое страницы на сервере.

Вот 30-секундное руководство , которое объясняет все. Я адаптирую это к тому, что вы хотите здесь.

Во-первых, на стороне сервера у вас уже есть PHP-скрипт, назовем его «page.php», который возвращает всю HTML-страницу. Вам нужно будет сделать второй скрипт PHP, назовем его «div.php», который возвращает только содержимое div.

(Вы могли бы также заставить page.php искать параметр, например, $ _GET ['divonly'], и таким образом иметь только один скрипт PHP, который обрабатывает обе задачи. Это не имеет значения ... вы можете сделать это однако вы хотите, до тех пор, пока у вас есть второй URL, чтобы попасть на серверную часть, чтобы получить новый контент для div.)

В HTML-коде page.php вы уже получили:

<div id="target"> ... </div>

И теперь вы добавили div.php, который возвращает только «...», а не полную HTML-страницу.

Хорошо, теперь Javascript. Вам не нужно использовать библиотеку, если вы не хотите - что приятно в библиотеках, так это то, что они решают все проблемы, возникающие в браузерах.

Но вот что вы хотите, адаптированный из примера на чистом Javascript:

var refreshDelay = 10000;

/* Creates the XMLHTTPRequest object depending on the browser */
function createRequestObject() {
    var ro;
    if(navigator.appName == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}
var http = createRequestObject();

/* Makes the request back to /div.php ... change the URL to whatever
   script you put on the server side to return the contents of the div only */    
function sndReq() {
    http.open('get', '/div.php');
    http.onreadystatechange = handleResponse;
    http.send(null);
}

/* Does the work of replacing the contents of the div id="target" when
   the XMLHTTPRequest is received, and schedules next update */
function handleResponse() {
    if(http.readyState == 4){
        var response = http.responseText;
        document.getElementById('target').innerHTML = response;
        setTimeout(sndReq(), refreshDelay);
    }
}

/* Schedules the first request back to the server. Subsequent refreshes 
   are scheduled in handleResponse() */
setTimeout(sndReq(), refreshDelay);
1 голос
/ 13 мая 2011

Вы можете создать рекурсивную функцию, которая будет изменять содержимое вашего div, которое будет выглядеть так, как будто оно обновлено.Как метод таймера, где каждый набор времени будет менять время.Я не знаю, как вы получите данные, которые будут загружаться на div, с этим я предполагаю, что вы будете обрабатывать эту часть.

Вот функция

var gIndex = 1;
function refreshDiv(){
    document.getElementById('target').innerHTML = "Timer " + gIndex++;
    var refresher = setTimeout("refreshDiv()", 1000);
}

<body onLoad="refreshDiv()">
    <div>
        <span>HTML Content</span>
        <div id="target"></div>
    </div>
</body>

Вы будетеобратите внимание, что время установлено, когда setTimeout снова вызовет refreshDiv(), так что это будет вести себя как перезагрузка содержимого div.Перед повторным вызовом refreshDiv() измените значение div.

0 голосов
/ 14 мая 2011

Краткий ответ:

1 . div 'onload' doesn't exist. So you need to register a listener for the page
    load event, or put it in "<body onload='refresh()'"
2 . function refresh(){
        setTimeout("window.location.reload()", 10000); // note the ""
    }

Длинный ответ:

Ваша страница не обновляется просто потому, что ваша функция никогда не выполняется. Во-вторых, если вы поставите все как есть, страница обновится сразу после загрузки страницы из-за setTimeout (window.location.reload (), 10000);.

В качестве побочного узла использование этой версии функции setTimout не рекомендуется, и лучшим подходом является передача функции в качестве первого параметра

setTimeout(window.location.reload,1000); // we are passing the function,
                                         // not the function result    

Надеюсь, это поможет.

0 голосов
/ 13 мая 2011

Если вы заинтересованы в том, чтобы сделать это самостоятельно, чтобы избежать дополнительных затрат на включение полной библиотеки, такой как jquery, вы можете взглянуть на это.

http://www.dynamic -tools.net / набор инструментов / Ajax /

Простая демонстрация запроса ajax показывает, как извлечь html из URL. Вы захотите заменить триггер клика на setInterval для постоянного опроса вместо запуска по требованию.

0 голосов
/ 13 мая 2011

Другой способ заключается в использовании «Метаданные могут использоваться браузерами (как отображать контент или перезагружать страницу), поисковыми системами (ключевыми словами) или другими веб-службами»

0 голосов
/ 13 мая 2011

Взгляните на jQuery.load () . Обратите внимание, что reload извлекает информацию с сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...