0

我有一个搜索表单,其中包含不同的元素、复选框、选择、文本字段等。每次更改都伴随着一个 ajax 调用,该调用将结果数作为一种计数器。我只想重置导致计数器返回值 0 的前一个元素。

我正在考虑跟踪变量中的每个更改,并且每次计数器评估为 0 时,我都会重置导致更改的元素。然而,我担心这可能会迫使我用大量代码和跳跃来以不同的方式处理所有不同的元素。

对于任何人都可以想到的问题,是否有可能更优雅的解决方案?我将不胜感激。

4

3 回答 3

1

我无法评论您的问题,但是:如果我理解正确,则有一个很大的表单,并且任何元素的每次更改都会触发一个 ajax 调用,该调用会返回一个结果集。

如果此结果集大小为零,则您希望表单重置为以前的值。

这意味着,只有最后更改的值必须被追踪并重置?

在这种情况下,您的onchange事件回调应该使用thisvalue 来获取当前表单元素的值和 ID。然后,当结果集返回时,如果没有行,则将存储的值设置回该元素。

否则,如果表单是全局管理的,您总是可以通过.clone()调用来存储它,然后如果结果集为空,则.remove()它和克隆返回。.insert()

PS:我知道这个解决方案不是很优雅:)

于 2012-09-04T14:56:04.597 回答
0

您的 AJAX 模块可以返回一个 JSON 编码的字符串,其中包含导致此事件发生的数据(PHP 函数:JSON_encode),然后您可以循环通过错误值重置它们并显示更多信息。即“您的电子邮件似乎无效”。

PHP:请参阅 JSON_encode JavaScript:请参阅 getElementsByTagName('input')(或 textarea 或 select) 注意:如果是选择项,您可能更愿意更改属性“selectedIndex”而不是“value”。

于 2012-09-04T14:36:00.087 回答
0

我通过记录对表单的每次更改来解决问题

$("#form_id").on("change", function(event) {
  //Event bubbling
  type = $(event.target).get(0).type;
  selector = $(event.target);
}

然后使用策略设计模式(Javascript 策略设计模式),我相应地重置了每个可能的字段类型。文本字段的示例,

var Fields = {
  "text": {
    resetAction: function(fieldSelector) {
      fieldSelector.val('');
    }
  }
};

//To call the reset action for the type of field,
Fields[type].resetAction(selector);

我必须触发隐藏字段的更改事件才能使其更改也冒泡。

于 2012-09-06T15:12:39.680 回答