Javascript 对ajax脚本的多次调用不起作用
好的,所以我对ajax的所有东西都很陌生(实际上不到几天),但这是我为我的雇主构建表单所必需的 基本上,无论我做什么,它都不能用于超过1个函数。更详细地说,我尝试使用“onchange”在一个下拉列表的基础上更新页面的4个不同部分。现在更新1部分工作正常,更新任何超过1部分的部分都会失败…但不仅失败,如果我确实调用ajax部分,那么它也会失败,然后只是一个简单的警报…但是如果我首先使用警报进行操作,它会工作,然后如果我在ajax调用之后放置任何内容,它会再次失败。我希望这是有道理的。例如,如果我这样做,它也会起作用。在同一元素上,onchange和onblur将执行两次。我将张贴代码,然后希望它将更有意义,而不是我唠叨哈哈Javascript 对ajax脚本的多次调用不起作用,javascript,ajax,javascript-events,Javascript,Ajax,Javascript Events,好的,所以我对ajax的所有东西都很陌生(实际上不到几天),但这是我为我的雇主构建表单所必需的 基本上,无论我做什么,它都不能用于超过1个函数。更详细地说,我尝试使用“onchange”在一个下拉列表的基础上更新页面的4个不同部分。现在更新1部分工作正常,更新任何超过1部分的部分都会失败…但不仅失败,如果我确实调用ajax部分,那么它也会失败,然后只是一个简单的警报…但是如果我首先使用警报进行操作,它会工作,然后如果我在ajax调用之后放置任何内容,它会再次失败。我希望这是有道理的。例如,如果我
<select name="pType" id="ptype" onchange="dostuff()">
这就是输入元素
<script type="text/javascript">
function dostuff(){
ajaxpage('adminincludes/popoptions.php?pID=<?= $sql['pID']; ?>&pType=' + ptype.value,'options');
alert('test');
}
</script>
函数dostuff(){
ajaxpage('admincludes/popoptions.php?pID=&pType='+pType.value,'options');
警报(“测试”);
}
…这就是dostuff代码,或者是一个示例,忽略php部分,因为它失败了,不管怎样,该部分工作正常
现在剩下的代码都在一个外部文件中,我相信问题就出在这个文件的某个地方……不过我对ajax还不熟悉,也不是js的高手,因为我从来没有真正需要它,所以我只是在需要的时候才知道我需要什么
var bustcachevar = 1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
var loadedobjects = ""
var rootdomain = "http://" + window.location.hostname
var bustcacheparameter = ""
function ajaxpage(url, containerid) {
var page_request = false
if (window.XMLHttpRequest) // if Mozilla, Safari etc
page_request = new XMLHttpRequest()
else if (window.ActiveXObject) { // if IE
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP")
} catch (e) {
try {
page_request = new ActiveXObject("Microsoft.XMLHTTP")
} catch (e) {}
}
} else
return false
page_request.onreadystatechange = function () {
loadpage(page_request, containerid)
}
if (bustcachevar) //if bust caching of external page
bustcacheparameter = (url.indexOf("?") != -1) ? "&" + new Date().getTime() : "?" + new Date().getTime()
page_request.open('GET', url + bustcacheparameter, true)
page_request.send(null)
page_request.send(null)
}
function loadpage(page_request, containerid) {
if (page_request.readyState == 4 && (page_request.status == 200 || window.location.href.indexOf("http") == -1)) document.getElementById(containerid).innerHTML = page_request.responseText
}
function loadobjs() {
if (!document.getElementById) return
for (i = 0; i < arguments.length; i++) {
var file = arguments[i]
var fileref = ""
if (loadedobjects.indexOf(file) == -1) { //Check to see if this object has not already been added to page before proceeding
if (file.indexOf(".js") != -1) { //If object is a js file
fileref = document.createElement('script')
fileref.setAttribute("type", "text/javascript");
fileref.setAttribute("src", file);
} else if (file.indexOf(".css") != -1) { //If object is a css file
fileref = document.createElement("link")
fileref.setAttribute("rel", "stylesheet");
fileref.setAttribute("type", "text/css");
fileref.setAttribute("href", file);
}
}
if (fileref != "") {
document.getElementsByTagName("head").item(0).appendChild(fileref)
loadedobjects += file + " " //Remember this object as being already added to page
}
}
}
var bustcachevar=1//bust初始请求后外部页面的潜在缓存?(1=是,0=否)
var loadeobjects=“”
var rootdomain=“http://”+window.location.hostname
var bustcacheparameter=“”
函数ajaxpage(url,容器ID){
var page_请求=false
if(window.XMLHttpRequest)//if Mozilla、Safari等
page_request=newXMLHttpRequest()
else if(window.ActiveXObject){//if IE
试一试{
page_request=newActiveXObject(“Msxml2.XMLHTTP”)
}捕获(e){
试一试{
page_request=newActiveXObject(“Microsoft.XMLHTTP”)
}捕获(e){}
}
}否则
返回错误
page_request.onreadystatechange=函数(){
loadpage(请求页,集装箱ID)
}
if(bustcachevar)//外部页面的if-bust缓存
bustcacheparameter=(url.indexOf(“?”)=-1)?“&”+新日期().getTime():“?”+新日期().getTime()
页面请求。打开('GET',url+bustcacheparameter,true)
页面_请求发送(空)
页面_请求发送(空)
}
函数加载页(请求页,容器ID){
if(page_request.readyState==4&&(page_request.status==200 | window.location.href.indexOf(“http”)=-1))document.getElementById(containerid).innerHTML=page_request.responseText
}
函数loadobjs(){
如果(!document.getElementById)返回
对于(i=0;i
正如我所说,当只调用一次ajaxpage()或通过不同的事件多次调用ajaxpage()时,代码工作得非常完美。它不会在一个事件中多次工作,即使将多个实例放入dostuff()函数中也是如此
任何帮助都将不胜感激,因为这真的开始让我恼火了。谢谢
更新:这不像我做的“变通”那样紧急,它在更新链接上使用多个事件,例如mouseover、mouseout等。这意味着它可以按我需要的方式工作,但无论如何它都不优雅,我仍然很好奇为什么在一个事件中多次调用它时它不会工作 我注意到您在样本的第26行和第27行重复:
page_request.send(null)
值得在你继续之前消除它。我们可以在任何地方看到这个的实时链接,这样我们就可以检查生成的源代码了吗我不想抛弃你,但你真的应该考虑使用jQuery。从字面上讲,学习整个库并实现它比用普通javascript实现要容易得多。我曾多次使用jquery处理不同的事情,但我总是发现在某些时候它会干扰其他东西,我的雇主非常重视兼容性,所以我倾向于避开……更不用说它的速度非常慢。但我感谢你的建议。正如我所说的,这是有效的,只是出于某种原因,不在同一事件中,这是唯一的问题,其他一切都可以完美地工作。根据我的经验,jQuery的主要卖点之一是兼容性。它消除了不同浏览器和版本之间存在的许多差异。对于您需要支持的每种浏览器类型,这些差异都是您自己要弄清楚的一个难题。您看到了什么样的性能问题?同意,jQuery是一种解决方法。感谢您的输入,但是使用完整的库解决一个问题仍然不能给我一个解决方案。我已经找到了一个解决方法,但仍然想知道问题所在。没有注意到,这实际上不是我的代码,这部分来自dynamicdrive.com。不幸的是,这不是我雇主的私人项目。你需要什么