【问题标题】:jquery get previous form elementjquery获取上一个表单元素
【发布时间】:2012-04-03 02:08:36
【问题描述】:

这是一个示例代码,

<select id="select1">
     <option value="1">Option 1 </option>
     <option value="2">Option 2 </option>
     <option value="3">Option 3 </option>
     <option value="4">Option 4 </option>
</select>
<input type="text" id="input1"/>
<select id="select2">
     <option value="1">Option 1 </option>
     <option value="2">Option 2 </option>
     <option value="3">Option 3 </option>
     <option value="4">Option 4 </option>
</select>
<input type="text" id="input2"/>

我的问题是,假设我使用 jQuery 抓取一个输入字段,即 $("#input1"),我如何在不进行硬编码的情况下抓取前一个表单元素?在这种情况下它是 $("#select1"),我不想使用 prev()、parent()、children() 等手动遍历 DOM,因为我的表单结构将来可能会改变(比如添加字段集、td、tr 等)

谢谢你帮助我!

【问题讨论】:

  • 我不明白你的问题。你想获取之前的表单元素,但又不想使用 prev(),因为事情会改变???如果是这样,您认为“前一个表单元素”是什么?
  • @Steve,表单元素可能被fieldsets 或类似的分隔。

标签: jquery forms dom


【解决方案1】:

使用 jquery prev() 方法

http://api.jquery.com/prev/

$("#input1").prev();

将在输入之前返回选择元素

示例:http://jsfiddle.net/m8Tst/1/

您可以在访问之前使用 length 属性检查前一个元素是否存在。

【讨论】:

  • 不过他不想使用 prev。
  • 对不起,我的问题没有弄清楚,我的意思是我可以使用 .prev() 但我不想手动遍历 DOM,因为我的表单结构可能会改变。请看小提琴jsfiddle.net/rocker_9x/bCCpb/1
  • @user826224: 你想要上一个 td 中的元素吗?你必须更清楚地定义你的要求
【解决方案2】:

没问题。

//pass in the id of the current input
function selectPrev(input) {
    //find parent form, then get all descendant input-type elements
    var inputs = $("#" + input).parents("form").find("input,select,textarea");

    var prev = -1;
    //loop through list of inputs to find current input
    inputs.each(function(i, el) {
        //select previous input once current is found
        if (el.id == input) prev += i;
    })

   return inputs[prev];
}​

fiddle

【讨论】:

    【解决方案3】:

    使用 jQuery 的 .prev() 方法,但指定您希望它查找的元素,在您的情况下为其他表单字段。

    $("#input1").prev('select,input,textarea');
    

    正如.prev() 的文档所说:

    该方法可选地接受相同类型的选择器表达式 可以传递给 $() 函数。如果提供了选择器, 前面的元素将通过测试它是否匹配来过滤 选择器。

    【讨论】:

    • 我按照你说的做,但它只显示'未定义'jsfiddle.net/rocker_9x/bCCpb/1
    • 啊,好吧,您最近的 jsFiddle 中的结构与原始结构不同,因此 .prev() 不起作用,因为 select 不是输入的前一个元素。您需要通过 prev、parent 等的上下路径来完成您需要的操作。
    【解决方案4】:

    这不是一个简单的方法。您可以编写一个小插件来完成这项工作:

    $.fn.previousFormElement = function () {
    
        var element = this[0],
            $formElements = $("input, select, textarea"),
            previousFormElementIndex = $formElements.index(element) - 1;
    
        return $formElements.eq(previousFormElementIndex);
    
    };
    

    请参阅Fiddle with a running example。我应该注意,这仅在您在满足选择器"input, select, textarea" 的元素上调用previousFormElement 时才有效。一个额外的好处是,如果您在页面上的第一个表单元素上运行插件,它会给您最后一个。

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2015-06-24
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多