IE没有通过ajax请求填充select

时间:2011-06-07 11:13:23

标签: php javascript jquery

嗨,我有两个dropdowns,我在第一个的基础上填充第二个。{我的第一个选择是

<select name="projects" id="projects" onchange="populate_users(this.value);">
<option value='1'>ABC</option>
<option value='2'>DEF</option>
</select>

我在第一个选择框的基础上填充第二个选择框

<select name="users" id="users">
</select>

这是我的populate_users方法

function populate_users(project_id)
{
var url='<?php echo($this->url(array(),'admin/clientproject1'));?>';
url2=url+'project_id='+project_id;
//alert(url2);
jQuery('#users').html('<div style="position:absolute;">'+jQuery('#users').html());
//ajax call
jQuery.ajax({url:url2,success:function(data){jQuery('#users').html(data);}});
}

admin/clientproject1上,我只是查询表并启动一个循环来绘制像这样的选项

$rd=$db->fetchAll($q);
for($i = 0; $i < count($rd); $i++)
{
    ?>
    <option value="<?php echo($rd[$i]->id);?>">
    <?php echo($rd[$i]->username);?></option>
    <?php
}
?>

$rd有价值观。第二个select已填充,所有值均显示在中 Firefox但在IE中它只是显示空白下拉列表而没有显示任何错误。

3 个答案:

答案 0 :(得分:1)

您应该返回一个json字符串值并在javascript中创建选项元素。然后将这些选项元素注入您的选择。多一点编码,但它更好。

答案 1 :(得分:0)

每当我看到单词AJAX,IE,而不是填充时,我会想到IE缓存以及它如何与AJAX不一致。由于问题是基于浏览器的,我不知道它是如何与你的实际PHP的问题,格式似乎是正确的,也许尝试在查询数据库的PHP页面中设置一些标题。

header("Expires: Sun, 19 Nov 1978 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

答案 2 :(得分:0)

我的解决方案是在服务器中创建'选项添加',在客户端创建javascript'eval'传递Ajax结果:

Server Sample PHP code Populate Select :
leetablaIE.php :

      $DBName=$_GET["db"];
      $tabla=$_GET["tabla"];
      $Query=$_GET["query"];
      $id=$_GET["id"];
      $User="???????";
      $Host="????????";
      $Password="????????";
      $Link=mysql_connect( $Host, $User, $Password);
      if (!$Link) {
      die('Could not connect: ' . mysql_error());
      }
      mysql_select_db($DBName, $Link) or die('Could not select database.'); 
      $Result=mysql_db_query ($DBName , $Query , $Link);
      echo 'var obj_option;';
      echo "obj_option = document.createElement('option');" ;
      echo "obj_option.setAttribute('value', '');";
      echo "obj_text = document.createTextNode('".utf8_encode('Select Value')."');" ;
      echo "obj_option.appendChild(obj_text);"; 
      echo "document.getElementById('$id')".".appendChild(obj_option);"; //myselect

      while($Row = mysql_fetch_array($Result)) {
      $valor=utf8_encode($Row[0]);
      $texto=utf8_encode($Row[1]);
      echo "obj_option = document.createElement('option');" ;
      echo "obj_option.setAttribute('value', '".$valor."');";
      echo "obj_text = document.createTextNode(\"".$texto."\");" ;
      echo "obj_option.appendChild(obj_text);"; 
      echo "document.getElementById('$id')".".appendChild(obj_option);"; //myselect
      }
      mysql_free_result($Result);

在Javascript客户端中:

function leetabla(db,tabla,query,id,bro){
// bro = passing browser ex: MSIE 
// id  = passing id select to populate in example myselect
// db = database 
// tabla = table (mysql id this case)
// query = query you need to populate ('select ....')
////////////////////////////////////////////////////

if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
if(bro!='MSIE'){
document.getElementById(id).innerHTML="";
document.getElementById(id).innerHTML=xmlhttp.responseText;
}
else
{
//alert(xmlhttp.responseText);
eval(xmlhttp.responseText);
}
}
}
if(bro!='MSIE'){
//alert(query);
//normal populate code not in this code 'leetabla.php'
xmlhttp.open("GET","leetabla.php?   db="+db+"&tabla="+tabla+"&query="+query+"&id="+id,true);
}
else
{
//alert(query);
// call to php script to IE case leetablaIE.php (upper sample) 
xmlhttp.open("GET","leetablaIE.php?    db="+db+"&tabla="+tabla+"&query="+query+"&id="+id,true);
}
xmlhttp.send();
}