javascript无法正常工作,没有错误

时间:2008-12-11 13:24:44

标签: php javascript ajax

我有以下javascript代码,加载时没有错误,但更新功能实际上看起来不起作用,因为从不加载get_Records.php。我无法测试get_auction.php是否在从get_records.php中加载时被加载

我主要担心的一个问题是我通过让update()接受参数pk和查询来做错事,因为只会使用其中一个。这似乎是一个糟糕的黑客和糟糕的逻辑,但我不知道一个更好的方法。

这是代码

var xmlHttp
var layername
var url

function update(layer, part, pk, query) {
    alert ("update");
    if (part=="1") {
        alert ("part 1");
        url = "get_auction.php?cmd=GetAuctionData&pk="+pk+"&sid="+Math.random()
    } else if (part=="2") {
        alert ("part 2");
        url = "get_records.php?cmd=GetRecordSet&query="+query+"&sid="+Math.random()
    }
    xmlHttp=GetXmlHttpObject()
    if(xmlHttp==null) {
        alert("Your browser is not supported?")
    }
    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
            document.getElementById(layer).innerHTML=xmlHttp.responseText
        } else if (xmlHttp.readyState==1 || xmlHttp.readyState=="loading") {
            document.getElementById(layer).innerHTML="loading"
        }
    };
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}

function GetXmlHttpObject() {
    var xmlHttp=null;
    try {
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        try {
            xmlHttp =new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {}
    }
    return xmlHttp;
}

function makewindows() {
    child1 = window.open ("about:blank");
    child1.document.write(<?php echo htmlspecialchars(json_encode($row2["ARTICLE_DESC"]), ENT_QUOTES); ?>));
    child1.document.close(); 
}

我将警报语句放入更新功能,而不显示一条,表示永远不会调用更新功能?

我不想,也不能使用框架,也不能使用firebug,所以请不要建议这些东西。我知道它们,并尽可能地使用它们。

我还想知道如果在makewindows()中调用php比让makewindows简单地使用参数更好...,每种方法都有优势或劣势吗?

我在尝试调用函数时似乎遇到错误,这就是我在PHP中执行的操作:

echo "<li><a href='#' onclick=update('Layer3','2','0','hello')'>Link 1</a></li>" . 

这个html,哪个应该没问题?“\ n”;

<li><a href='#' onclick='update('Layer3','2','0','hello')'>Link 1</a></li>

编辑:我已经接受了tester101的建议并将其更改为:

echo '<li><a href="#" onclick="update(\'Layer3\',\'2\',\'0\',\'hello\')">Link 1</a></li>' . "\n"; 

仍然会出错。我可能最终会使用汤姆斯答案,但想知道为什么这不起作用。

8 个答案:

答案 0 :(得分:2)

如果您可以使用Firefox并重现错误,我强烈建议您使用Firebug,因为它非常易于使用并逐步执行脚本,设置断点等。而不必使用“警报”语句可以使用像console.info("unexpected value x=%o", some_object);这样的东西,它会将一个值记录到控制台(包括行#),您可以在以后检查它而无需中断脚本。

编辑:事实上,如果您在服务器上使用PHP,则可以使用FirePHP来帮助调试客户端。

答案 1 :(得分:0)

您是否确认PHP代码返回合理的内容? (我假设您可以查看HTML的源代码。)

使用好的'警报 - 调试:在代码中插入警告声明(例如windows.alert("GetXmlHttpObject started.");)以确保您联系到它们。

JSLint可能会对您有所帮助。不过我试过了,并没有发现任何错误。

答案 2 :(得分:0)

如果您可以在Firefox中打开您的页面,我会检查错误控制台(c-s-J)。它帮助我找到了许多错别字。

此外,您的代码似乎缺少很多分号。也许其中一些是可选的但是......

答案 3 :(得分:0)

您可以将Url作为update()的参数,然后您不需要在其中构建网址,也不需要'可选'参数

修改(回复评论)

如果你有一个update()函数,只需要获取url和元素id(层)并根据AJAX调用的结果更新它,你可以这样做,以消除对可选参数和使用函数的需要做两件事。

function update(layer, url) {
    var xmlHttp=GetXmlHttpObject(); //you have this defined elsewhere

    if(xmlHttp==null) {
        alert("Your browser is not supported?");
    }

    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
            document.getElementById(layer).innerHTML=xmlHttp.responseText;
        } else if (xmlHttp.readyState==1 || xmlHttp.readyState=="loading") {
            document.getElementById(layer).innerHTML="loading";
        }

       //etc
    }

    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
}


function updateByPk(layer, pk) {
   url = "get_auction.php?cmd=GetAuctionData&pk="+pk+"&sid="+Math.random();
   update(layer, url);
}


function updateByQuery(layer, query) {
   url = "get_records.php?cmd=GetRecordSet&query="+query+"&sid="+Math.random();
   update(layer, url);
}

然后根据你想做的事情打电话:

updateByPk('id_of_div', 2);

updateByQuery('id_of_div2', 'query');

e.g。用HTML格式

<a href="#" onclick="updateByQuery('Layer3', 'hello');">Link 1</a>

或在PHP中生成

<?php echo '<a href="#" onclick="updateByQuery(\'Layer3\', ' . json_encode($query) . ');">Link 1</a>';

答案 4 :(得分:0)

关于您的疑虑,据我所知,如果您不提供所有论据,JavaScript不会抱怨。

e.g

function myFunction(var1, var2, var3, var4){

调用此函数,如:

myFunction('test1','test2');

不会产生错误。

类似于在参数旁边放置默认值,默认情况下在javascript中为null或undefined。

您可以通过检查来测试:

if(null != var3){

可能会帮助你清理一下这个功能;你也可以从网上收集一个小的ajax类,它会稍微整理你的javascript。有很多包装函数封装了xmlHttpRequest对象,允许跨浏览器使用相同的结果。

如果您需要任何帮助,请与我们联系。我有信心,如果你发现一些预先构建的ajax方法(jQuery有一些很棒的功能!),那么你想要实现的任务就会容易得多。

答案 5 :(得分:0)

中的括号不匹配
child1.document.write(<?php echo htmlspecialchars(json_encode($row2["ARTICLE_DESC"]), ENT_QUOTES); ?>));

答案 6 :(得分:0)


onclick=update('Layer3','2','0','hello')'>Link 1

我不知道这是不是一个错字,但这行应该是


onclick="update('Layer3','2','0','hello')">Link 1



 此代码将导致错误并且永远不会调用更新,因为onClick =之后的单引号终止于('。使用双引号。


onclick='update('Layer3','2','0','hello')'>Link 1

答案 7 :(得分:0)

可能有太多新行?

在大多数语言中,您可以使用换行符作为命令分隔符,或者使用“;”。在JavaScript中,您同时拥有:换行符有时作为“;”

请尝试使用此功能,看看是否有帮助:

function update(layer, part, pk, query) {
   alert ("update");
   if (part=="1") {
      alert ("part 1");
      url = "get_auction.php?cmd=GetAuctionData&pk="+pk+"&sid="+Math.random()
   } else if (part=="2") {
      alert ("part 2");
      url = "get_records.php?cmd=GetRecordSet&query="+query+"&sid="+Math.random()
   }
   // and so on...
}

唯一不同的是格式:开头卷曲与使用它的构造在同一行('if','else','function',...)。