2011-06-02 42 views
1

当我加载页面,并更改选项中选择菜单,在调试控制台我得到一个错误,指出记述()不是一个函数JavaScript函数无法被识别为一个功能

<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

到底是什么问题? – 2011-06-02 22:59:18

+5

如果你在IE中这样做,问题可能是你有一个id =“descrip”的textarea,请尝试更改该id。 – david 2011-06-02 23:05:45

+0

您的JavaScript函数中的代码没有任何意义 - 您正在创建一个XMLHttpRequest对象,将该对象放入一个字符串中,并尝试“写入”TEXTAREA。你想达到什么目的? – duskwuff 2011-06-02 23:06:52

回答

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"; 

或者,如果你要追加新的文本到文本区域:

your_textarea.value += "something here"; 

这将正确地插入文本。第三,确定当前所选<option><select>中的值的方法也行不通(不幸的是)。为了抓住当前选择的选项的值,你必须使用一个<select>selectedIndex财产以及其options属性:

your_select.options[your_select.selectedIndex].value; 

这将正常返回当前选定的选项的值。

最后,这只是IE中的一个问题,您的功能与ID共享同一个名称。在IE中,任何ID都被全局定义为DOM元素,所以这是一个问题。所以,简单地将你的函数的名称改为别的东西应该可以缓解这个问题。

所有功能于一切,这是我认为的代码作品(虽然未经测试):

<script type='text/javascript'> 
function select_change() { 
    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) { 
      var file = "includes/ads/" + xhr.responseText + ".txt."; 
      document.ads.descrip.value += file; 
     } 
    }; 
    // Three arguments: type of request, url, and should the request be async 
    xhr.open("GET", 
      document.ads.subject.options[document.ads.subject.selectedIndex].value, 
      true); 
    xhr.send(null); 
} 
</script> 

<form name="ads" method="post" action="scripts/del_advert_script.php"> 
<label>Advertisements by subject:</label><select name="subject" id="sub" onchange="select_change()"> 
     //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

尼斯,周到的回应。高成就! :-) – Cyberherbalist 2011-06-02 23:55:06

3

这是一个疯狂的猜测,因为我不是一个Javascript人员,但我想知道是否给你的textarea的id = descrip(与你的函数名称相同)可能会混淆解释器?

1

在Internet Explorer中,元素ids被定义为window上的常量。事实上,你的函数被命名为与你的元素的ID相同会产生冲突,并且元素正在获胜,所以IE会让你看到你试图调用一个textarea而不是一个函数。