【问题标题】:Calling a Javascript function from HTML从 HTML 调用 Javascript 函数
【发布时间】:2012-01-07 12:54:43
【问题描述】:

我有一个显示在网页上的 5 行(比如说)的 HTML 表格。表格的第一列是 RowID(每行都是唯一的),每行的最后一列是一个 [X] 按钮(点击它会删除排)。整个表格位于 <div> 元素中,id="cartmain"

<div id="cartmain">
     <table>
          <tr>
            <td>....</td>
            <td>....</td>
            <td> <a href="#" onclick="removeitem('id1')"> [X] </a> </td>
          </tr>
          ..
          ..
     </table>
</div>

这就是我删除行的方式:

STEP1: 当用户点击[X] 按钮时,XMLHTTPRequest 函数将向PHP 代码发送消息,每行的ID 都是唯一的。在 PHP 代码删除行期间,DIV 元素显示“正在加载...”

document.getElementById("cartmain").innerHTML = "Loading..."

第 2 步: PHP 代码将从表(和数据库)中删除行并返回剩余的表。

<?php
     //removing row from database/table...

     //send the remaining table back to the XMLHTTPRequest function...
     echo "<table>";
     echo "<tr><td>...</td>
               <td>...</td>
               <td> <a href=\"#\" onclick=\"removeitem('id1')\"> [X] </a> </td>";
     echo "</tr>";
     ...
     ...
     ...
     echo "</table>";
?>

从 PHP 代码中接收到的剩余表格然后使用以下行显示在 DIV 元素中:

document.getElementById("cartmain").innerHTML = removeitem.responseText;

我的问题: 假设我有 5 行的表。当我单击“删除”按钮时,该行被成功删除,然后显示剩余 4 行的表格。问题来了:当我想从表中删除另一行时:什么都没有发生。换句话说,如果我再次点击某行的 [X]那么什么都不会发生。不调用 XMLHTTPRequest 函数。在理想情况下,它应该使用该唯一的 RowID 再次调用 XMLHTTPRequest 函数,然后应该显示剩余 3 行的表。

重要提示:当我刷新页面时,我可以删除另一行。但这一次,我也只能删除一行。为了再删除一个,我必须再次刷新页面。

有没有人能找出这里的问题?请帮忙。

注意:我的表实际上是一个购物车,每行都包含一个产品。 [X] 按钮实际上表示从购物车中“移除商品”。

这里是 JavaScript 代码:

function removeitem(itemid)
{
    alert("The item to be removed is: "+itemid);
    if(window.XMLHttpRequest)
    {
        removeitem = new XMLHttpRequest();
    }
    else
    {
        removeitem=new ActiveXObject("Microsoft.XMLHTTP");
    }

    removeitem.onreadystatechange=function()
    {
        if (removeitem.readyState==4 && removeitem.status==200)
        {
            document.getElementById("cartmain").innerHTML=removeitem.responseText;
        }
        else if(removeitem.readyState < 4)
        {
            document.getElementById("cartmain").innerHTML="Loading...";
        }
    }
    var linktoexecute = "cart.php?option=5&itemid="+itemid; //option =5 signifies that I want to remove the item with ITEMID.
    removeitem.open("GET",linktoexecute,true);
    removeitem.send();
}

函数removeitem第一次显示警告“要删除的项目是:123”,但第二次没有显示。当我在 Firebug 控制台中检查时,第二次出现以下错误:

removeitem 不是函数

请帮忙!!

我所有的 Javascript 函数都在一个单独的文件 (sc.js) 中,我在页面的 HEAD 标记中使用了 &lt;script type="text/javascript" src="js/sc.js"&gt;&lt;/script&gt;

我的观点:所以最后我认为问题很简单:如果网页使用 XMLHTTPRequest 从 PHP 页面请求一些 HTML,并且该 HTML(由 PHP 发送)包含一些调用 Javascript 的按钮函数——那么在这种情况下会发生什么[?]。现在因为我能够第一次删除该行,所以我认为说上述情况不起作用是错误的。只是当我第二次单击按钮时,来自 PHP 的代码和已经加载的 Javascript 并不知道彼此的存在。

【问题讨论】:

  • 您的 PHP 代码在引号中显示错误。使用&lt;a href=\"#\" onclick=\"removeitem('id1')\"&gt; [X] &lt;/a&gt; &lt;/td&gt;。此外,如果您需要帮助,则必须显示相关的 (JavaScript) 代码。
  • 嗨 Rob:我只使用 \。只是我忘了在这里提。编辑问题! :)
  • 您更新的问题仍然包含几个报价问题。您确定您的代码可以正常工作,即使是第一次点击?检查您的错误控制台,或发布指向您网站的链接。
  • 嗨 Rob,它在第一次点击时运行良好。你能告诉我哪个部分有报价问题吗?是javascript还是PHP?我会快速编辑它并让你知道回复。谢谢你。 PS:我的网站在我的本地系统上。
  • 嗨 Rob,我发现你说的是哪个引用错误。再次编辑。是否还有报价错误? :)

标签: php javascript html xmlhttprequest


【解决方案1】:

removeitem 函数中,您正在用XMLHttpRequest 对象覆盖removeitem。因此后面的错误removeitem is not a function

要解决此问题,请在 removeitem 前面加上 var(推荐),或使用其他变量名,或两者兼而有之。

推荐代码:

function removeitem(itemid) {
    alert("The item to be removed is: "+itemid);
    var removeitem = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

    removeitem.onreadystatechange = function() {
        if (removeitem.readyState == 4 && removeitem.status == 200) {
            document.getElementById("cartmain").innerHTML = removeitem.responseText;
        } else if(removeitem.readyState < 4) {
            document.getElementById("cartmain").innerHTML="Loading...";
        }
    }
    var linktoexecute = "cart.php?option=5&itemid="+itemid; //option =5 signifies that I want to remove the item with ITEMID.
    removeitem.open("GET", linktoexecute, true);
    removeitem.send();
}

removeitem 之前添加var 可以解决问题,因为该变量是本地定义的。当var 被省略时,一个新值将附加到最近的父声明(在本例中为函数)。

var removeitem = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

上一行简称:

var removeitem;
if (window.XMLHttpRequest) {
    removeitem = new XMLHttpRequest();
} else {
    removeitem = new ActiveXObject("Microsoft.XMLHTTP");
}

【讨论】:

    【解决方案2】:

    看起来您并没有像@Rob W 所说的那样转义双引号。在使用php写出HTML时,我一般使用单引号。我认为这是一个很好的做法。

    我唯一能想到的另一件事是,您的函数可能不在 AJAX 响应文本之外。只需在第一个响应返回后检查 Firebug 或查看正在呈现的内容的源代码。

    我希望这会有所帮助。

    【讨论】:

    • 好的,根据您编辑的问题,您的 Javascript 函数是否在响应文本之外,就像它在页面加载时呈现,而不是在每个 AJAX 响应中呈现,因为这将是一个问题。另外,请注意,您应该有一个像这样的分号并返回 false 以防止页面跳转:onclick=\"removeitem('id1'); return false;\"
    • 嗨罗伯特。谢谢你的评论。你能告诉我说“函数不在 AJAX 响应文本之外”是什么意思吗?
    • 意味着您的函数(即 removeitem())不是响应文本的一部分,而是在初始页面加载时呈现。
    • 函数removeitem()在另一个文件sc.js中。我通过在 HEAD 标记中使用 &lt;script type="text/javascript" src="js/sc.js"&gt;&lt;/script&gt; 包含了这个文件。这是问题吗?它是否正确?我应该将我的函数放在 HEAD 标记中而不是单独的文件中吗?
    • k,所以基于此,我会检查您的 HTML 以及在第一个 AJAX 帖子之后它是如何呈现的;还要检查萤火虫是否有任何错误,这将有助于识别问题。
    【解决方案3】:

    为什么每次点击都会加载所有的表格 html?删除时以及使用 jQuery 删除 TR 元素后,您只能发送 true 或 false。

    删除 TR: 在您的removeitem 函数中,在ajax 响应后,只需调用$(this).parents("tr").remove();

    【讨论】:

    • 谢谢塞萨尔。正如我所提到的,它是一个购物车应用程序。当一个项目从购物车中移除时,它涉及到许多其他的事情,比如更新“总金额”、修改“运费”、购物车中的总项目等(所有这些都不需要刷新页面)。如果我只发送真或假,那么我将不得不进行许多其他更改。现在我关心的是Why my code is not able to find the removeitem function? Why it is able to remove item in the first time but not second?
    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2020-05-24
    • 2011-10-04
    相关资源
    最近更新 更多