Javascript函数未被识别为函数

时间:2011-06-02 22:57:46

标签: javascript function

当我加载页面并更改选择菜单中的选项时,在调试控制台中,我收到一条错误,指出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>

3 个答案:

答案 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而不是函数。