Iframe крадет фокус даже при открытии другого браузера - PullRequest
0 голосов
/ 23 ноября 2011

У нас есть веб-сайт, на котором мы используем iframe для загрузки некоторых данных (длительный опрос iframe).Эти данные могут быть загружены автоматически, например, каждые 2 минуты.Когда этот веб-сайт открывается в IE (пробовал в последней 9-й версии), он будет отправлять запрос каждые 2 минуты.Это нормально.

Но когда мы открываем другой браузер (или программу), а IE не в фокусе - во время каждого запроса IE будет фокусироваться на себе ...

Может быть, кто-то знает, какисправить это (предотвратить IE, чтобы украсть фокус)?Как я понимаю, запросы Ajax могут это исправить, но это может быть трудно обновить ...

Обновление:

С сервера (в Iframe) мы возвращаем что-то вроде этого:

<html><body>
<script>parent.MailChecker.updateStatus({"s":"Connecting to xxx@gmail.com...","p":0,"c":null,"e":false})</script>
<script>parent.MailChecker.updateStatus({"s":"Preparing to fetch emails...","p":0,"c":null,"e":false})</script>
<script>parent.MailChecker.updateStatus({"s":"Downloading 1 email from 35...","p":2.8571428571429,"c":null,"e":"784"})</script>
<script>parent.MailChecker.updateStatus({"s":"Downloading 2 emails from 35...","p":5.7142857142857,"c":null,"e":"784"})</script>
...
<script>parent.MailChecker.updateStatus({"s":"Done!","p":100,"c":"0","e":false})</script>
</body></html>

1 Ответ

0 голосов
/ 28 ноября 2011

Переход от метода IFRAME к использованию решения XMLHttpRequest (используемого тысячами сайтов / веб-приложений) устранит проблему фокуса. Этот метод используется многими серверами Comet, некоторые из которых перечислены здесь .

Как обсуждалось в комментариях, вы должны использовать XHR-запрос (длительный опрос или потоковую передачу), чтобы вы могли отправлять обновления с сервера на клиент, содержащий только данные. Вы можете использовать HTTP Long-Polling или HTTP streaming с помощью объекта XMLHttpRequest (XHR). Из приведенного выше видно, что данные выглядят следующим образом:

{"s": "Соединение с xxx@gmail.com ...", "p": 0, "c": null, "e": false}

И позже, когда состояние меняется, нажмите еще одно обновление по соединению, например,

{"s": "Подготовка к получению писем ...", "p": 0, "c": null, "e": false}

Затем обработчик для XHR может проверить XHR.responseText и проанализировать значения обновления. Если вы используете длинный опрос, это так просто:

var update = JSON.parse(xhr.responseText);
MailChecker.updateStatus(update);

Если вы используете потоковую передачу XHR, вам также потребуется проанализировать предыдущие обновления из XHR.responseText, поскольку он продолжает увеличиваться в размере. Подробнее о потоковой передаче HTTP здесь: http://ajaxpatterns.org/HTTP_Streaming

...