【发布时间】: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