【问题标题】:Why is it adding when it’s not being called为什么在不被调用时添加
【发布时间】:2015-12-01 04:19:36
【问题描述】:

我编写了一个 JavaScript 代码,我正在构建一个购物车,但即使我不点击它,这段代码也会运行:

function addProduct(prodId) {
  var sessionDivId = document.getElementById(prodId);
  if (prodId) {
    sessionDivId.innerHTML = '<?= $_SESSION['product_id_1']+=1 ?>';
  }
}
<div onclick="addProduct('testSession1');">ADD</div>
<div id="testSession1"></div>

每次我刷新网站时,它都会将1 添加到会话testSession1,即使我没有点击“添加”按钮。

【问题讨论】:

  • 不要忘记php在javascript之前执行,所以即使javascript没有在浏览器中执行,服务器已经处理了php。在这种情况下,服务器看到将会话变量加 1 的调用,因此将添加它。如果您需要实现这一点,最好的方法是使用 ajax 调用添加到会话变量的 php 脚本。
  • 我从来没有使用过 ajax,我搜索了一下,但是当我只想开始一些东西时,人们给出的东西太宽泛了,所以我可以自己构建它:) 如果你能提供一些东西,我将不胜感激跨度>
  • 如果您要忽略 ajax,您可能会让 javascript 将表单提交到同一页面,然后测试 POST - 一旦您有 POST 请求,您就可以增加会话变量。即:if( $_SERVER['REQUEST_METHOD']=='POST' ) { /* increment session var */ }
  • @J.Doe 我认为通过this tutorial 将是一个好的开始。有一段时间我对 AJAX 也一无所知。然后,在一个睡不着觉的晚上,我问自己“AJAX 是如何工作的?”,拿起我的手机,一夜之间很快就学会了,可以这么说。所以,真的没那么难。
  • 谢谢大家,我不知道我现在是否有心情阅读它,我想我会用铁杆 php 表单和发布请求来完成

标签: javascript php html session session-cookies


【解决方案1】:

您的 PHP 逻辑将在用户加载页面之前在服务器上运行。要添加产品,您需要将其存储在其他位置(因为 PHP 不再有任何控件可以将 +=1 放入购物车)。

我会发出 AJAX 请求以将产品 ID 发布到用户购物车:

function addProduct(prodId) {
    // using jQuery for simplicity of writing
    $.ajax({
        type: "POST",
        url: "/cart/item/" + prodId,         // or other backend API endpoint
        success: displayNiceUserMessage()
    });
 }

当然还有一些错误处理,以防出现问题。

更新

我看到您不想使用 Ajax。正如你所知,它不需要比我上面写的代码更复杂。然后在后端,如果任何用户向该 url 发出 POST 请求,您只需向会话添加 +1。

但是如果你不想要ajax,你需要在点击添加按钮时重新加载页面。就像在 cmets 中所说的那样,在添加按钮周围放置一种类型的 post(并使用一个好的 url 让您的服务器知道这是一个发生的添加项目事件),并使添加按钮成为提交类型。然后根本不需要javascript。

【讨论】:

  • 谢谢伙计,这非常有效!有没有办法让会话ID的实时打印机?像 showProduct ajax 一样?
  • 是的,在success函数中你可以用+1更新document.getElementById(prodId).innerHTML值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2020-08-22
  • 2023-03-08
相关资源
最近更新 更多