当我加载页面并更改选择菜单中的选项时,在调试控制台中,我收到一条错误,指出descrip()不是函数
<script type="text/javascript">
function descrip(){
var aid = new XMLHttpRequest("GET",document.ads.subject.value,false);
var file = "includes/ads/"+aid+".txt";
document.ads.descrip.write(file);
return aid;
}
</script>
<form name="ads" method="post" action="scripts/del_advert_script.php">
<label>Advertisements by subject:</label><select name="subject" id="sub" onChange="descrip()">
//PHP Block that works
</select>
<textarea id="descrip" name="description" cols="100" rows="3" readonly="readonly">
</textarea>
<br />
<input type="submit" value="Submit" />
</form>
答案 0 :(得分:4)
我在此处看到了四个问题:您的XMLHttpRequest
,将文字写入<textarea>
的方法,获取当前所选<select>
值的方法以及您的功能与ID共享同一个名称(仅在IE中存在问题)。
AJAX并不像你上面那样工作,就像那样不幸。相反,你必须跳过一些箍以获得运行请求并返回其responseText。以下是一些示例代码:
var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.onreadystatechange = function () {
// When the server has returned a response, and it is good, we're ready
if (xhr.readyState === 4 && xhr.status === 200) {
// do something with xhr.responseText
}
};
// Three arguments: type of request, url, and should the request be async
xhr.open("GET", "url here", true);
xhr.send(null);
这是一个非常轻松的例子,但它确实展示了通用概念。有关AJAX的更多信息,请参阅AJAX开始时的MDC'S excellent tutorial。
接下来,DOM中的write
没有<textarea>
函数。要更改textarea中的内容,您需要使用其value
属性:
your_textarea.value = "something here";
或者如果您想将新文本附加到textarea:
your_textarea.value += "something here";
这将正确插入文本。
第三,您在<option>
中确定当前所选<select>
值的方法也不起作用(不幸的是)。要获取当前所选选项的值,您必须使用selectedIndex
的{{1}}属性及其<select>
属性:
options
这将正确返回当前所选选项的值。
最后,这只是IE中的一个问题,您的函数与ID共享同一个名称。在IE中,任何ID都被全局定义为DOM元素,因此这是一个问题。因此,只需将功能名称更改为其他名称即可缓解此问题。
总而言之,这是我认为有效的代码(虽然未经测试):
your_select.options[your_select.selectedIndex].value;
答案 1 :(得分:3)
这是一个疯狂的猜测,因为我绝不是一个Javascript人,但我想知道如果给你的textarea id = descrip(与你的函数同名)可能会使解释器混淆?
答案 2 :(得分:1)
在Internet Explorer中,元素ID在window
上定义为常量。你的函数被命名为与元素的id相同的事实会产生冲突,并且元素是胜利的,所以IE看到你试图调用textarea而不是函数。