【问题标题】:How do I post a form, update a query and display the results on the same page with ColdFusion/jQuery?如何使用 ColdFusion/jQuery 在同一页面上发布表单、更新查询并显示结果?
【发布时间】:2023-04-01 06:28:01
【问题描述】:

目标:

我有一个动态创建大小的大表格(它是一个产品订单表格,输入 type="number")。填写表格后,用户单击“下订单”按钮,我想在灯箱中(在同一页面上)显示摘要订单以便他们确认。

目前使用的方法:

1) 我将表单发布到页面上的不可见 iframe。

<cfform id="refSubmit" action="/createTable.cfm" method="post" target="hiddenFrame">

2) createTable.cfm 遍历提交的表单字段并在 SQL Server 中创建一个临时表。此部分运行良好。

3)我正在使用jquery .submit() 等待表单提交成功,打开灯箱并在页面上使用.load() 显示确认。

$("input[name*='submit']").click(function(event) {
  var submitButton = $(this);
    // If lightbox is open, then close it.
    if ($("#confirmationLightbox").is(":visible")){
      $("#confirmationLightbox").toggle().children().remove();
      event.preventDefault();
    } else {
      $("#refSubmit").submit();
      $.ajax({
        type: "POST",
        url: "createTable.cfm",
        success: function() {
          // Changing the delay does resolve the issue, but not properly
          $("#changeIconLightbox").toggle().delay(0).queue(function(){
            $(this).load('/includes/inc_lightboxes/orderConfirmation.cfm');
          });
        }
      });
    }
  });

问题:

尽管从 createTable.cfm 创建的表在 100% 的时间都正确构建,但在 orderConfirmation.cfm 中调用查询时,它会在完成构建之前调用该查询。所以输出的不是等待表创建完成。

我知道我的 ajax POST 完全按照应有的方式进行。触发成功线是因为虽然表单数据已经成功发送,但是cfm文件还没有处理完。

问题:

所以,我在这里的原因。如何确保 .load() 行等待执行,直到 createTable.cfm 完成其服务器端处理?如您所见,我确实尝试使用 .delay()。当然,我可以输入一个数字,让用户等待该过程,但这意味着订购 1 件商品的人将与订购 2000 件独特商品的人同时等待。

因为有人问过这个问题,所以这是我用来创建唯一表的代码。

<!--- Create Unique ID for Table --->
  <cfset SESSION.tempOrder = Replace(CreateUUID(),"-","","All")>

  <!--- Create Temp Order Table --->
  <cfquery name="qCreateTempOrder" datasource="#REQUEST.dsn#" username="#REQUEST.dsu#" password="#REQUEST.dsp#">
    CREATE TABLE order_temp_#SESSION.tempOrder#
    ( id INTEGER IDENTITY(1,1) PRIMARY KEY,
    productId INTEGER NOT null,
    quantity INTEGER NOT null
    );
  </cfquery> 

【问题讨论】:

  • 为什么你既要发布到隐藏的 iframe 又要通过 AJAX 调用发布(到同一页面)?以这种方式,很难让每个单独的请求相互依赖。你能去掉 iframe,而是只在 AJAX 中收集和发布参数,这样success 真的只有在处理完成后才被调用?
  • 这实际上是我开始的地方。我意识到我的 ajax 调用可能不正确。但最初我所拥有的是创建表的 cfm 文件也是我执行 .load() 的文件。我遇到的问题是我无法阻止表单帖子将我带离该页面并发送信息。 iframe 确实感觉像是 macgyver 类型的解决方案。如果有办法完成您的建议,那肯定是更理想的方法。
  • 您使用 cfquery 创建和填充临时表的方法是有风险的。除了您遇到的问题之外,您还冒着让用户 B 干扰用户 A 的风险。我建议将所有代码转移到存储过程中。
  • 用户A和B的冲突已经在ColdFusion端解决了。使用唯一名称创建会话变量,并使用该变量命名临时表。话虽如此,一旦我知道 ajax 正在工作,它最终将在存储过程中完成。
  • 摆脱cfform 的电话。你不应该需要那个。事实上,它可能会干扰。当您使用那些 cf... 标签时,javascript 会嵌入到可能会干扰您的 jQuery/javascript 的响应中。

标签: jquery sql ajax forms coldfusion


【解决方案1】:

如果其他人访问此页面,我将发布最终工作的结果,并表明我的问题已得到解决。

按照 Miguel-F 的建议,我去掉了表格上的 cf。

<form id="refSubmit">

我的 jQuery 现在看起来像这样。

$("#refSubmit").submit(sendForm);
  var confirmLightbox = $("#confirmationLightbox");
  var placeOrder = $("input[name*='submit']");

  function sendForm(event) {
    if (confirmLightbox.is(":visible")){
      confirmLightbox.toggle().children().remove();
      placeOrder.val("Place Order");
      event.preventDefault();
    } else {
      $('<input name="processing" style="margin: 5px 10px; float: right;" type="button" class="processingButton" value="Processing..." disabled>').insertBefore(placeOrder.hide());
      $.post('process/createTable.cfm',$("#refSubmit").serialize(),function(){
        confirmLightbox.toggle().delay(0).queue(function(){
        $(this).load('/includes/inc_lightboxes/jcorderconfirmation.cfm', function(){
          var confirmOrder = $("button[name*='confirm']");
          placeOrder.show().val("Edit Order");
          $("input.processingButton").remove();
          $("input[name*='confirmOrder']").on("click", function(){
            if($(this).is(':checked')){
              confirmOrder.removeAttr("disabled");
            } else {
              confirmOrder.prop("disabled", true);
            }
          });
          $("button[name*='cancel']").on("click", function(){
            confirmLightbox.toggle().children().remove();
            placeOrder.val("Place Order");
          });
          confirmOrder.on("click", function(){
          alert("Products successfully added to inventory.");
        });
      });
    });
  });
}
return false;
}

【讨论】:

  • 感谢您回来并发布您的解决方案。如果您包含有关使这项工作的原因的一些详细信息,那将很有帮助。您是否必须修改您的 ColdFusion 模板(除了删除 cfform)还是全部是 JavaScript 代码?很高兴你成功了。
  • 这是两部分的组合。首先,对 cfform 执行操作当然是试图重定向页面,这就是我最终使用该 iframe 的原因。所以我试图发送表单两次,一次是在标签中,一次是在 jquery 中。相反,删除操作并让 jquery 发送信息完全符合我的需要。您还将看到我修改了 jquery 并在 $.post 行中使用了回调。这允许处理完成。自从发布此内容以来,我已将 createTable.cfm 修改为 cfc 文件,并且它在 SQL 中调用存储过程。希望有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多