2011-11-03 71 views
0

所以这是我的代码,我很奇怪,为什么变速球没有发送警报给我或设置变量值:为什么Javascript不能通过onChange更改变量?

var selecteduname; 
var xmlhttp; 
function changeUp() 
{ 
document.getElementById("useruname").onChange = function() { 
    selecteduname = this.value; 
    alert(selecteduname); 
updateAdduser(); 
} 


function loadXMLDoc() 
{ 

if (window.XMLHttpRequest) 
    { 
xmlhttp=new XMLHttpRequest(); 
} 
else 
    { 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 
} 

function updateAdduser() 
{loadXMLDoc(); 
xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    var json = xmlhttp.responseText; 
    var fields = JSON.parse(json); 
    Object.keys(fields).forEach(function (name) { 
    var input = document.getElementsByName(name); 
    input.value = fields[name]; 
}); 
} 
} 
xmlhttp.open("GET", "ajaxuseradd.psp?uname="+selecteduname, true); 
xmlhttp.send(); 
} 

</script> 

<form action="adduser.psp" method="get"> 
<fieldset> 
    <label for="uname">Username:</label> 
    <select name="uname" id="useruname" onChange="changeUp();"> 
<% 
Blah blah blah Python Code to generate option values 
%> 


<%= options %> //More Python code, this actually puts them into the select box 

</select> 

</fieldset> 
<fieldset> 
    <label for="fname">First Name:</label> 
    <input type="text" name="fname" /> 
</fieldset> 
<fieldset> 
    <label for="lname">Last Name:</label> 
    <input type="text" name="lname" /> 
</fieldset> 
<fieldset> 
    <label for="email">Email:</label> 
    <input type="text" name="email"> 
</fieldset> 

+4

大概是因为属性的名称为'onchange'不'onChange'(可能还是更不对您的代码虽然)。 –

+0

您的代码缺少一些东西...... http://www.jshint.com/reports/61002 – Incognito

+0

确保一件很快捷的事情:您至少错过了一次关闭},以结束您的loadXMLDoc方法 – James

回答

0

你缺少一个支撑。尝试在你的代码上运行jslint。其次,您正在尝试为方法changeUp中的onChange事件分配一个函数。而changeUp又是第一个调用的方法。可能导致递归。

感谢, RR

1

如上评论,属性名是 “平变化”,而不是 “的onChange”。 Javascript是区分大小写的,所以这两个是完全不同的。

此外,您发布的代码看起来像是在某处丢失了}。事实上,一切都在changeUp函数中。巧合的是,它在结束脚本标记之前从不关闭。

但是,这里还有其他事情要做。这条线在你的标记:

<select name="uname" id="useruname" onChange="changeUp();"> 

获取完全被这一行代码一扫而光:

document.getElementById("useruname").onChange = function() { 

以下是我会解决它。首先,JavaScript的:

function createAjax() { 
    if(window.XMLHttpRequest) 
     return new XMLHttpRequest(); 
    else 
     return new ActiveXObject("Microsoft.XMLHTTP"); 
} 


function updateAddUser(username) { 
    var ajax = createAjax(); 
    ajax.onreadystatechange = function() { 
     if(ajax.readyState == 4 && ajax.status == 200) { 
      var json = ajax.responseText; 
      var fields = JSON.parse(json); 
      Object.keys(fields).forEach(function (name) { 
       var input = document.getElementsByName(name); 
       input.value = fields[name]; 
      }); 
     } 
    } 
    ajax.open("GET", "ajaxuseradd.psp?uname=" + username, true); 
    ajax.send(); 
} 

然后,你可以更改HTML select标签:

<select name="uname" id="useruname" onchange="updateAddUser(this.value)"> 

说了这么多,我会强烈建议您尝试类似jQuery。它会使JavaScript代码一样微不足道:

$('#username').change(function(){ 
    $.get('ajaxuseradd.php', {uname:$(this).val()}, function(data, status, xhr) { 
     $.each(data, function(key,value) { 
      $('#'+key).val(value); 
     }); 
    }, 'json'); 
}); 

是的,这真的很简洁,我知道。更意味深长,它可以被写成这样:

$('#username').change(function() { 
    var userName = $(this).val(); 
    $.ajax({ 
     type: 'GET', 
     url: 'ajaxuseradd.php', 
     data: { 
      uname: userName 
     }, 
     success: function(data, status, xhr) { 
      $.each(data, function(key, value) { 
       $('#' + key).val(value); 
      }); 
     }, 
     dataType: 'json' 
    }) 
}); 
+0

我一直在考虑使用jQuery,但是我谈到的每个人都非常反jQuery,并且说学习“实际的Javascript”更好。 –

+0

“每个人”都是一个非常普遍的术语。只要做一个快速的谷歌搜索,你就会发现你正在与之交谈的人是错误的。jQuery甚至被微软采用为ASP.net的官方客户端JavaScript库。自1997年以来,我一直在用Javascript进行编程,而jQuery是发生过的最好的事情。 – rossipedia

+0

好的,好吧,它似乎更容易,更直观。在学习之前,我应该学习更多Javascript吗,还是应该立即着手? –

相关问题