Всплывающее окно функции самозакрытия; закрыть сайт - PullRequest
0 голосов
/ 05 января 2011

У меня есть функция обратного вызова Ajax, которая вызывает функцию PHP для проверки времени изменения файла. Я использую таймер для его выполнения каждые 50 секунд.

    <script type="text/javascript">
    setInterval("_checkPopUpUpdate()", 50000); //50 seconds
    </script>

    function _checkPopUpUpdate()
    {
        var callback=new Object();
        callback.success=this.onExternalSuccess;
        callback.failure=this.onExternalFailure;
        YAHOO.util.Connect.asyncRequest('GET','/ci/ajaxCustom/ajaxCheckPopupUpdate',callback);
};

Функция PHP проверяет, отличается ли время изменения файла между временем первой загрузки

     $announcement_Popup_Path = HTMLROOT . $this->data['attrs']['file_path'];
  // Call model function

 if($this->data['attrs']['file_path'] !== '' && file_exists($announcement_Popup_Path))
 {
     //When the announcement content load, it always stores the modified time into session
         $this->CI->load->model('custom/checkupdate_model');
           $firstloadTime = filemtime($announcement_Popup_Path);
     $this->CI->checkupdate_model->store_AnnouncementPopupSession($firstloadTime);
     //$this->data['Popup'] = file_get_contents($announcement_Popup_Path);
 }    

        function store_AnnouncementPopupSession ($popupTime)
    {
 $sessionPopupTime =array("annoucementPopUp"=> $popupTime);
 $this->session->setSessionData($sessionPopupTime);
    }

     function announcement_pop()
    {
 $file_path='/euf/assets/announcements/pop_up_announcement.html';
 $announcement_Popup_Path = HTMLROOT . $file_path;
 if(file_exists($announcement_Popup_Path)) {
     $currentAnnouncementPopUpTime = filemtime($announcement_Popup_Path);
     $oldannouncementPopupTime = $this->session->getSessionData("annoucementPopUp");

     if($currentAnnouncementPopUpTime !=$oldannouncementPopupTime) {
  //comparing the content and update the time, when they are different,  send back update content
  $this->store_AnnouncementPopupSession($currentAnnouncementPopUpTime);
  //echo $currentAnnouncementPopUpTime;
  echo $file_path;
     }
     else {
  echo "no update";
     }
 }
    }

Когда время изменения файла изменилось, он вернется к обратному вызову ajax и захватит содержимое HTML на моем веб-сервере, чтобы открыть всплывающее окно с объявлением.

    function onExternalSuccess (o){
    if(o.responseText!==undefined)
    {
 var str=o.responseText;


     if(str !== 'no update') // Then pop up.
     {
  L=screen.width-200;
  T=screen.height;
  popup=window.open(str," ",'alwaysRaised=yes,status=no,toolbar=no,location=no,menubar=no,directories=no,resizable=no,scrollbars=no,height=150,width=364,left="+L+",top="+T');
  //popup=window.open(str,"",'alwaysRaised=yes,status=no,toolbar=no,location=no,menubar=no,directories=no,resizable=no,scrollbars=no,height=100,width=330');
  for (i=0;i<200;i++)
  {
      T=T-1;
      popup.moveTo(L,T);
  }
     }
    }
};

Работает нормально для Firefox и Chrome, однако IE7 немного глючит, иногда всплывающее окно не выходит.

<html>
    <head>
 <title>Internal alert</title>
 <link rel="stylesheet" type="text/css" href="/euf/assets/css/pop_up_ann.css" media="screen, projection" />
 <script type="text/javascript">
    var howLong = 50000; //5 minutes, 1 seconds = 1000 milliseconds.
    t = null;
    function closeMe(){
    t = setTimeout("self.close()",howLong);
    }
      </script>
    </head>
    <body onLoad="closeMe();self.focus();">
 <div id="cs_popup">
        <div class="popup_rounded-corner-top">
            <div id="popup_ann">
                <div id="popup_ann_title">IE7 pop-up EMEA test close </div>
                <div id="popup_ann_from"> PLC team - 05/01/2011 at 12:10</div>
            <div id="popup_ann_content">
            Something has changed in the<em>&quot;Alerts&quot;</em> section of S4S since your last visit.
            Make sure you go there as soon as you can to be informed about the current situation.
            </div>
            </div>
        </div>
        <div class="popup_rounded-corner-bottom"></div>
    </div>
    </body>
</html>

Основная проблема, с которой я столкнулся, это функция самозакрытия. Это закрыло мое всплывающее окно и веб-сайт. Есть намеки? Кроме того, я не уверен, правильна ли вся логическая структура моего всплывающего объявления, так или иначе? спасибо

1 Ответ

1 голос
/ 05 января 2011

Открытие всплывающего окна для объявления, подобного этому, может быть проблематичным для людей, работающих с блокировщиками всплывающих окон, которые обычно позволяют всплывающим окнам появляться только в ответ на инициированное пользователем событие, такое как нажатие чего-либо. Лучшим подходом было бы использовать встроенное всплывающее окно, которое также давало бы вам возможность модально отображать всплывающее окно (то есть маскировать оставшуюся часть страницы полупрозрачным div), если вам требуется, чтобы они подтвердили ваше сообщение.

Использование self.close () не должно закрывать исходное окно / вкладку, открытое пользователем, оно должно закрывать только те вещи, которые были «открыты», поэтому я не уверен, что там происходит, я подозреваю вас не рассказал нам всего :) Альтернативный подход может заключаться в том, чтобы изменить всплывающую функцию, чтобы закрыть окно, а не закрывать само окно.

// open popup ... then set timeout to close it
var popupDelay = 50000;
setTimeout(function() {
  popup.close();
}, popupDelay);

Это может работать немного лучше, не уверен. Но в долгосрочной перспективе я настоятельно рекомендую избегать всплывающих окон и использовать что-то встроенное.

...