【问题标题】:Excluding certain inputs on serialize在序列化时排除某些输入
【发布时间】:2011-06-01 04:01:25
【问题描述】:

我正在尝试按名称排除输入(这是一个隐藏的输入,包含我的 nonce)

以下问题几乎是我要找的:

How do I use jQuery's form.serialize but exclude empty fields

但我对那里的解决方案有 2 个问题 - 它指出要序列化表单数据,除了空输入和 value =“。”的输入。

$("#myForm :input[value][value!='.']").serialize();

首先,我无法让它与 jquery 变量“this”一起使用

$('#ofform').live('submit', function(e) {
    e.preventDefault();
    var serializedReturn = $(this :input[name!='security']).serialize();        
});

其次,我有一个单独的表单,其 id 为 ofform-reset,如果我使用:

var serializedReturn = $(#ofform :input[name!='security']).serialize(); 

它会选取其他 #ofform-reset 表单中的输入,以及未包含在标签内的 AND/OR 输入。

在我之前的一个问题中找到了答案。样式标记无效:

<form id="ofform">
 <div id="toolbar">
 <button id="save">Save</button>
</form>
<form id="ofform-reset">
 <button id="reset">Reset</button>
</form>
</div>

现在要弄清楚如何使用 2 个不同的按钮来控制同一个表单

【问题讨论】:

    标签: jquery serialization


    【解决方案1】:

    您不需要:,因为输入是一个元素而不是伪选择器。其次,您不能在选择器中使用类似的对象和文本字符串。相反,您需要将此作为范围参数提供给$()

    $('#ofform').live('submit', function(e) {
        e.preventDefault();
        var serializedReturn = $('input[name!=security]', this).serialize();        
    });
    

    【讨论】:

    • 谢谢。这确实有效。除了,序列化仍在从其他形式中获取输入。就好像它正在序列化页面上的所有内容
    • 一种形式嵌套在另一种形式中吗?因为你可以做到。发布您的标记。
    • @prodigitalson 您不能在另一个表单中包含一个表单(无论如何这是不合逻辑的)。或者您的评论中有错字...
    • @Trip:这只是一个例子......可以添加额外的元素,如 selecttextarea 或排除 input[type=submit]...... 取决于表单中发生的情况.
    • @Ezra 当然只是根据需要添加选择器。尽管在某些时候您可能希望开始使用类或数据属性来定义要排除或包含的字段......无论您想采用哪种方式。
    【解决方案2】:

    首先,您需要调用.find() 方法,如:

    var serializedReturn = $(this).find('input[name!=security]').serialize(); 
    

    否则完整的字符串会进入 css 查询引擎 (Sizzle)。

    其次:

    我有另一个表单,其 id 为 offform-reset 如果我使用:

    你需要改变它。拥有多个 ID 是无效标记。如果我在这里理解错了,第一个解决方案也可能对您有所帮助,同时调用 .find() 方法:

    var serializedReturn = $('#ofform').find('input[name!=security]').serialize(); 
    

    【讨论】:

    • 关于你的第二点,我不确定他的意思。我假设他打算使用虚拟子句:“......我有另一个表格,'form-reset'的id,如果我使用......”但我可能错了。
    • @David:是的,我有同样的想法,添加了几行。而且..“他”可能是“她”:)
    • 而我之前的评论完全可以在“形式”一词之后使用另一个逗号,以便真正有意义...... =)至于我的性别混淆,哇。嗯...对不起,@Helga(在发帖之前我实际上并没有看你的名字...@_@)
    • 别担心!但是您指出的 .find() 方法仍在获取我的第二种形式的输入。第一种形式 (#ofform) 具有所有输入,第二种形式 (#ofform-reset) 具有重置按钮 - 所以我没有 2 个具有相同 ID 的元素。
    • 我认为它会忽略选择元素
    【解决方案3】:

    我对@9​​87654321@ 不满意,因为它排除了所有其他输入类型,例如select,.. 您可以手动添加它们,但这个列表会随着新的 HTML 标记不断增加。所以随着每一个新标签的出现,你的代码又被破坏了。

    这是我的解决方案:

    $form.find(':not(input[name=draft])').serialize()
    

    $('form[name=expenses] :not(input[name=draft])').serialize()
    

    空间在第二个例子中非常重要。

    【讨论】:

      【解决方案4】:

      在我的情况下,这很好用:

      $("fieldset").not(".tasks-container").serialize()
      

      【讨论】:

      • 不适合我,上面 jAndy 的解决方案适合我
      【解决方案5】:

      已解决!您应该使用给定的解决方案来排除要序列化的输入字段。 它已经过测试并解决了我的问题。

      var formdata = $($("#myform")[0].elements).not("#field_id").serialize();
      

      对于多个字段,您可以使用类名来排除它们。

      var formdata = $($("#myform")[0].elements).not(".class_name").serialize();
      

      【讨论】:

        【解决方案6】:

        您可以过滤结果数组

        var ignoreFields = ["_csrf"];
        
        $('form')
         .serializeArray()
         .filter(function(val){
            return ignoreFields.indexOf(val.name) === -1;
         });
        

        或更短的变体

        $('form').serializeArray().filter(val => ignoreFields.indexOf(val.name) === -1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-06
          • 2016-09-22
          • 2014-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多