在 Gateway z/OS 下检测网页上的更改?

问题描述 投票:0回答:1

在 Gateway z/OS 下开发 Web 应用程序时,我一直在使用两种不同的技术来检测用户何时在网页上输入或更改数据。

  1. 我有一个字段的隐藏变量,以便我可以将显示的字段值与隐藏值进行比较。 优点:当用户提交页面进行比较时,一切都在那里。缺点:页面较大。

  2. 我将每个字段的变量保存在会话变量池中进行比较。优点:使页面更小。缺点:如果不进行管理,可能会填满会话池。

请注意,我正在启用以 REXX 编写的 ISPF 对话框以在网络下运行。

两者都很好用,但是有更好的方法吗?

对于字段/变量很少的页面,这都很好。对于带有表格的页面,可能有 100 个字段/变量。

感谢您的任何提示。

web zos rexx ispf
1个回答
0
投票

尚不清楚您需要这些前后值的容量。为了确保数据的一致性和准确性,在处理表单提交时将提交的数据与“真实数据”(存储在数据库或数据集中的原始数据)进行比较。在这种情况下,除了防止竞争条件之外,您不需要存储原始数据(更新更新的数据,因为页面有旧数据)

假设您无法与真实情况进行比较,或者只想发送更改后的值,那么您可以使用JavaScript,即使您不能使用ajax。

这样的东西可能对你有用:

  • 在页面加载时将所有表单元素的原始值存储在对象 (
    originalValues
    ) 中。
  • 在表单提交时,它再次遍历表单元素,将其当前值与原始值进行比较,并将更改后的值存储在另一个对象中(
    changedValues
    )。
  • 为更改的值生成隐藏的输入字段并将其附加到表单中。
  • 提交表格。
// On page load, store original values
const originalValues = {};
document.querySelectorAll('input, select, textarea').forEach(element => {
  originalValues[element.name] = element.value;
});

// On form submit, generate input fields for changed values
document.getElementById('myForm').addEventListener('submit', event => {
  event.preventDefault();
  const changedValues = {};
  document.querySelectorAll('input, select, textarea').forEach(element => {
    if (element.value !== originalValues[element.name]) {
      changedValues[element.name] = element.value;
    }
  });
  // Generate hidden input fields for changed values
  Object.keys(changedValues).forEach(name => {
    const input = document.createElement('input');
    input.type = 'hidden';
    input.name = name;
    input.value = changedValues[name];
    document.getElementById('myForm').appendChild(input);
  });
  // Submit the form
  document.getElementById('myForm').submit();
});

这可以防止需要向用户发送隐藏的输入字段,但要求所有名称都是唯一的(某些边缘情况,即数组输入可以重用相同的名称))

另一种选择是让js删除所有未更改的字段,只更新已传回服务器的字段。

© www.soinside.com 2019 - 2024. All rights reserved.