【问题标题】:javascript not working, no errorsjavascript不工作,没有错误
【发布时间】:2008-12-11 13:24:44
【问题描述】:

我有以下 javascript 代码,加载时不会出错,但更新功能实际上似乎不起作用,因为从未加载 get_Records.php。我无法测试是否加载了 get_auction.php,因为它是从 get_records.php 中加载的

我主要担心的一个问题是我做错了让 update() 获取参数 pk 和查询,因为只有其中一个会被使用。这似乎是一个糟糕的 hack 和糟糕的逻辑,但我不知道有更好的方法。

这里是代码

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(); 
}

我在更新函数里放了alert语句,没有显示,说明更新函数从来没有被调用过?

我不想,也不能使用框架,也无法使用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"; 

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

【问题讨论】:

  • alert() 需要在 update() 函数的大括号内
  • 对不起,它在我的机器上,我编辑了这篇文章,没有重新粘贴。它肯定在大括号中并且没有被调用。
  • 一个模糊的风格指针:你应该真的养成在行尾使用分号的习惯。现在一切正常,但是当您想要打包 JS(用于较小的下载)时,它会严重损坏。
  • 好的,我只是认为没有必要。变量声明和方法调用是否应该以分号结尾?
  • 你可以在一个语句中做多个变量声明。变量 x = 1,y = 2,z = 3;如果愿意,您甚至可以添加换行符以使其更易于阅读。

标签: php javascript ajax


【解决方案1】:

如果您可以使用 Firefox 并重现该错误,我强烈建议您使用 Firebug,因为它非常易于使用,并且可以单步执行脚本、设置断点等。另外,您可以使用不必使用“alert”语句console.info("unexpected value x=%o", some_object); 之类的东西,它会将一个值记录到控制台(包括第 # 行),您可以稍后在不中断脚本的情况下进行检查。

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

【讨论】:

    【解决方案2】:

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

    编辑(回复评论)

    如果你有一个 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');
    

    例如在 HTML 中

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

    或者用 PHP 生成

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

    【讨论】:

    • 这是首选的做事方式吗?有两个可选参数是不好的形式吗?
    • 不一定,但将功能拆分为执行较小任务的函数是有意义的——这将使您的代码更可重用。您可以有两个函数,它们都调用更新但执行不同的逻辑来构造 url
    • 我可以让它只取 url,但是 pk 和 query 仍然必须通过,并且只会使用一个。如果我使用另一个 url 来生成 url,我在传递变量时仍然会遇到同样的问题吗?
    • 如果只使用过一个,为什么不拥有两个函数,一个接受 pk,一个接受查询。然后他们可以单独生成 url 并从那里调用 update()
    • 有道理..,所以我只需要 update() 的 layer 和 part 参数,或者如果正在生成 url,我什至不需要 part 参数...?
    【解决方案3】:

    您是否验证了 PHP 代码返回的内容是合理的? (我假设您可以查看 html 的源代码。)

    使用良好的警报调试:在您的代码中插入警报语句(例如windows.alert("GetXmlHttpObject started.");)以确保您可以访问它们。

    JSLint 可能会对您有所帮助。不过,我试了一下,并没有发现任何问题。

    【讨论】:

    • 我编辑了显示警报语句结果的问题
    【解决方案4】:

    关于您的担忧,据我所知,如果您不提供所有参数,JavaScript 不会抱怨。

    例如

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

    像这样调用这个函数:

    myFunction('test1','test2');
    

    不会产生错误。

    这类似于在参数旁边放置一个默认值,默认值在 javascript 中为 null 或 undefined。

    您可以通过以下方式对此进行测试:

    if(null != var3){
    

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

    如果您需要任何帮助,请告诉我。我有信心,如果你找到一些预建的 ajax 方法(jQuery 有一些很棒的功能!),你想要完成的任务会容易得多。

    【讨论】:

    • 我根本无法为此使用框架。此外,我对学习基本概念很感兴趣。我想没有办法调用 var1、var2 和 var4 而不是 var3?
    • 你不能只传递 false 或 null 作为你不想要的变量,并在代码中测试它吗?
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      括号不匹配

      child1.document.write(<?php echo htmlspecialchars(json_encode($row2["ARTICLE_DESC"]), ENT_QUOTES); ?>));
      

      【讨论】:

      • 你有一个左括号:.write( ... 和两个右括号:));
      【解决方案7】:
      
      onclick=update('Layer3','2','0','hello')'>Link 1
      

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

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



      这段代码会报错,永远不会调用update,因为onClick=后面的单引号终止于('。使用双引号。

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

      【讨论】:

      • 是否需要双引号?从 php 语句内部使用单引号更容易。我已更改报价以包含更新,但仍未调用它。
      • 如果您在没有参数的情况下调用更新,您可以使用单引号,但由于您使用的是包含在单引号中的参数,因此函数必须包含在双引号中。
      • 啊,检查我的编辑,我已经更改了它,但仍然出现错误。
      • 为什么字符串中有\?
      【解决方案8】:

      可能换行过多?

      在大多数语言中,您要么使用换行符作为命令分隔符,要么使用“;”。在 JavaScript 中,两者兼有:换行符 sometimes 用作“;”

      试试这个,看看是否有帮助:

      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',...)。

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 2013-08-10
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多