Javascript! IE готовый документ - PullRequest
0 голосов
/ 18 июля 2011

Я не большой гуру javascript, поэтому я был бы рад, если бы кто-то мог помочь мне с этим.Итак, что я хочу сделать, это отобразить простой индикатор для загрузки файла, пока файлы будут подготовлены.Теперь все отлично работает в Firefox, но не в IE. Загрузчик будет создан php, а загрузка происходит через iframe.Теперь, как вы можете видеть из приведенного ниже кода, я проверил состояние готовности документа и по какой-то причине он остается интерактивным для IE и никогда не завершается, но в Firefox он завершается прекрасно.

if($_POST['download'])
{
    echo '<iframe id="frame" src ="download.php?data='.$_POST['download'].'" width="0" height="0" frameborder="0" scrolling="no"></iframe>';

    echo '<div id="loader">';
    echo '<div id="loading-container"><p id="loading-content">Please wait while we prepare your files<img id="loading-graphic" width="220" height="19" src="images/indicator.gif" /></p></div>';
    echo '</div>';
    echo '<script type="text/javascript">

    var wooIntervalId = 0;
    var i = 0;
    function startInterval()
    {
        wooIntervalId = setInterval(doSomething, 1000);
    }

    function doSomething()
    {   
        document.getElementById("loading-content").innerHTML = document.readyState + i;
        i++;
    }

    function remove_elem()
    {
        element = document.getElementById("loader");
        element.parentNode.removeChild(element);
    }

    startInterval();

    </script>';
}

Мне очень понравилось решение для удаления индикатора, напримерпо этой причине в Firefox он удаляет индикатор сразу после отображения диалогового окна сохранения файла, но в IE это не просто работает.

window.onload = function()
    {
        element = document.getElementById("loader");
        element.parentNode.removeChild(element);
    }

Любые предложения?

Хорошо, вот сценарий, который работает в IE ив Firefox.По сути, мне нужно проверить состояние готовности iframes, которое превращает «NaN» в Firefox и, во-первых, в «загрузку» в IE и «в интерактивном режиме» при завершении (IE). Поэтому я создаю initialState со значением «loading» для работы в обоих браузерах, так как IEизменяет свое состояние дважды, а Firefox - только один раз.В Chrome и Opera состояние готовности iframe превращается в «неопределенное» и будет делать это только один раз, поэтому, если у кого-то есть исправление, это также будет замечательно.

<script type="text/javascript">
    var startingState = "loading";
    var wooIntervalId = 0;
    function startInterval()
    {
        wooIntervalId = setInterval(doSomething, 1000);
    }

    function doSomething()
    {   
        var doc=document.getElementById("frame");
        if(startingState != doc.readyState)
        {
            remove_elem();
            clearInterval(wooIntervalId);
        }
    }

    function remove_elem()
    {
        element = document.getElementById("loader");
        element.parentNode.removeChild(element);
    }
    startInterval();
    </script>';

1 Ответ

0 голосов
/ 18 июля 2011

UPDATE:

Использовать обмен сообщениями - MSDN - MDN - для безопасной связи между доменами / кросс-фреймами со страницы на вашем сервере на другую страницу на другом из ваших серверов

Как насчет этого

<?PHP if (isSet($_POST['download'])) { ?>
  $url = "download.php?data=".htmlentities($_POST['download']);
  <iframe id="frame" src ="<?PHP echo $url; ?>" width="0" height="0" frameborder="0" scrolling="no" onload="remove_elem('loader')"></iframe>
  <div id="loader">;
    <div id="loading-container"><p id="loading-content">Please wait while we prepare your files<img id="loading-graphic" width="220" height="19" src="images/indicator.gif" /></p></div>
  </div>';
  <script type="text/javascript">
    var wooIntervalId = 0;
    var i = 0;
    function startInterval() {
      wooIntervalId = setInterval(doSomething, 1000);
    }

    function doSomething() {   
      document.getElementById("loading-content").innerHTML = document.readyState + i;
      i++;
    }

    function remove_elem(elemId) {
      var element = document.getElementById(elemId);
      element.parentNode.removeChild(element);
    }

    startInterval();

    </script>
<?PHP } ?>
...