Работает в Firefox & Opera, но не в IE8 - PullRequest
0 голосов
/ 09 июня 2010

1) Эта проблема касается только одной html-страницы, давайте назовем ее «ajax.html».

2) У меня есть функции AJAX на этой веб-странице, которые работают как в Firefox, так и в IE8.

3) Теперь я пытаюсь сгенерировать только значения параметров раскрывающегося списка дат, используя мои функции ajax, и это работает в Firefox & Opera, но не в IE8.

4) Внешний HTML-код для выпадающего списка выглядитнапример:

<select name="entry_7_single" id="entry_7" onChange="Ajax_PhpResultsWithVar('./secure/db/SummaryCls.php','entry_8','dateval',this.value)"></select>

Вызов onchange относится к функции ajax, которая успешно (и Firefox, и IE8) заполняет текстовую область (entry_8) описанием события, связанного с датой, выбранной в этом раскрывающемся списке.

5) Вызов onload инициирует функцию ajax для генерации значений раскрывающегося списка:

<body class="ss-base-body" onLoad="OnLoadWebPage()">

6) Сценарий js, который вызывает функцию ajax, выглядит следующим образом:

function OnLoadWebPage()
{
    Ajax_PhpResults('./secure/db/GenDateListCls.php','entry_7');
}

7) Поскольку он работает в Firefox, но не в IE8, я выбрасываю вывод функции ajax в большое текстовое поле Firefox и получаю следующее:

<option selected value="8 JUN 2010">8 JUN 2010</option>
<option value="9 JUN 2010">9 JUN 2010</option>
<option value="10 JUN 2010">10 JUN 2010</option>
<option value="11 JUN 2010">11 JUN 2010</option>

8) Есть болеесотен, но вы получите суть того, что генерирует функция ajax.Далее я перечислю функцию PHP, которая выводит вышеуказанные выпадающие значения:

<?php
include_once 'SPSQLite.class.php';
include_once 'misc_funcs.php';

class GenDateListCls
{
    var $dbName;
    var $sqlite;

    function GenDateListCls()
    {
        $this->dbName = 'accrsc.db';
        $this->ConstructEventDates();
    }

    function ConstructEventDates()
    {
        $this->sqlite = new SPSQLite($this->dbName);
        $todayarr = getdate();
        $today = $todayarr[mday] . " " . substr($todayarr[month],0,3) . " " . $todayarr[year];
        $ICalDate = ChangeToICalDate($today);
        $dateQuery = "SELECT dtstart from events where substr(dtstart,1,8) >= '" . $ICalDate . "';";
        $this->sqlite->query($dateQuery);
        $datesResult = $this->sqlite->returnRows();

        foreach (array_reverse($datesResult) as $indx => $row)
        {
            $normDate = NormalizeICalDate(substr($row[dtstart],0,8));
            if ($indx==0)
            { 
?>
<option selected value=<?php echo('"' . $normDate . '"'); ?>><?php echo $normDate; ?></option>
<?php
            }
            else
            {
?>
<option value=<?php echo('"' . $normDate . '"'); ?>><?php echo $normDate; ?></option>
<?php
            }
        }
        $this->sqlite->close();
    }
}
$dateList = new GenDateListCls();
?>

9) Вот функции ajax, которые я создал и использовал (конечно, некоторые части изменены из примеров вне Интернета):


function Ajax_XMLHttpRequest_Factory()
{   
   var ajxRequest;

   try
   {
      // Opera 8.0+, Firefox, Safari
      ajxRequest = new XMLHttpRequest();
   } 
   catch (e)
   {
      // Internet Explorer Browsers
      try
      {
         ajxRequest = new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch (e) 
      {
         try
         {
            ajxRequest = new ActiveXObject("Microsoft.XMLHTTP");
         } 
         catch (e)
         {
            // Something went wrong
            alert("Unable to create an XMLHttpRequest with this current browser.");
            return false;
         }
      }
   }

   return ajxRequest;
}

function Ajax_PhpResults(fname,elementID){

    var ajaxRequest = Ajax_XMLHttpRequest_Factory();

    // Create a callback function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function() {
    if(ajaxRequest.readyState == 4){
        var ajaxDisplay = document.getElementById(elementID);
        ajaxDisplay.innerHTML = ajaxRequest.responseText;
    }
    }

    ajaxRequest.open("GET", fname, true);
    ajaxRequest.send(); 
}

function Ajax_PhpResultsWithVar(fname,elementID,varpassed,value){

    var ajaxRequest = Ajax_XMLHttpRequest_Factory();

    // Create a callback function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function() {
    if(ajaxRequest.readyState == 4){
        var ajaxDisplay = document.getElementById(elementID);
        ajaxDisplay.innerHTML = ajaxRequest.responseText;
    }
    }

    ajaxRequest.open("GET", fname+"?"+varpassed+"="+value, true);
    ajaxRequest.send(); 
}

function Ajax_RunPhpOnly(fname){

    var ajaxRequest = Ajax_XMLHttpRequest_Factory();
    ajaxRequest.open("GET", fname, true);
    ajaxRequest.send(null); 
}

Я признателен за любую помощь в этом вопросе.

Моя справочная информация: Чтобы вы все знали, я полный новичок вPHP, Ajax и Javascript, и учить все это самостоятельно, никаких классов.Мой опыт работы в Linux, Windows, C ++, Java, VB, VBA, MS XML и некоторых HTML.

1 Ответ

1 голос
/ 09 июня 2010

Попробуйте не использовать innerHTML.Исторически IE не позволяет вам innerHTML везде, где вы думаете, возможно.Вместо этого попробуйте медленные, более грубые методы DOM .appendChild().Например, пусть PHP возвращает JSON или XML с нужными парами «значение / текст», а затем, когда вы выполняете AJAX, он выполняет что-то вроде этого:*

JavaScript:

http.onreadystatechange = function(){
    if(http.readyState == 4){
        eval("var data = [" + http.responseText + "]");
        for(var i=0;i<data.length;i++)
            var t = document.createElement("option");
            t.value = data[i].value;
            t.innerHTML = data[i].text;
            document.getElementById("entry_7").appendChild(t);
        }
    }
}

Я не уверен, почему у вас возникла проблема, но я предполагаю, что это связано с innerHTML элемента select в IE.Попробуйте мой метод, описанный выше, и я почти уверен, что он сработает.

Надеюсь, это каким-то образом поможет.

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