2010-06-09 5 views
0

1) Эта проблема включает только одну веб-страницу html, позволяет называть ее «ajax.html».Работает в Firefox и Opera, но не в IE8

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) Здесь находится Аякс функции, я создал и использовал (конечно, некоторые части были изменены из примеров от сети):


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.

+0

Можете ли вы показать код для ваших функций javascript Ajax_PhpResultsWithVar() и AjaxPHPResults(), пожалуйста? –

+0

Можете ли вы показать нам свою функцию ajax, пожалуйста? – Babiker

+0

в приведенных выше примерах атрибут value для опций является избыточным. значение по умолчанию будет соответствовать содержимому тега параметра. – SpliFF

ответ

1

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

PHP выхода (он же ваш http.responseText):

{value:"20100608",text:"date 1"}, 
{value:"20100609",text:"date 2"}, 
{value:"20100610",text:"date 3"}, 
{value:"20100611",text:"date 4"}, 
{value:"20100612",text:"date 5"} 

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.Попробуйте мой метод, и я уверен, что он сработает.

Надеюсь, это поможет в некотором роде.

+0

Обратите внимание, что вы можете обойти многие из этих проблем с перекрестным браузером, используя популярные фреймворки javascript (например, jQuery, Prototype, Dojo и т. Д.). Я работал с jQuery, и вы можете просто оценить свой HTML-код напрямую, чтобы создать такие вещи совместимым способом, например. если вы можете сделать что-то вроде $ ('# target'). append (' hello'); –

+0

Я также должен отметить, что jQuery также делает ajax совершенно простым; см. функцию jquery load() (http://api.jquery.com/load/), которая будет делать именно то, что вы хотите, с помощью кросс-браузера. –

+0

Код, предоставленный вами (Tau), работал хорошо (мне нужно было добавить одну открытую скобку, чтобы заключить цикл «for») в обоих браузерах (Firefox и IE8). Я был отнесен к stackoverflow.com от Anatak (из Японии). Спасибо вам обоим. –

Смежные вопросы