7

我有一个这样的 HTML 标记:

<p>
  <label>Arrive</label>
  <input id="from-date1" class="from-date calender" type="text" />
</p>

<p>
  <label>Depart</label>
  <input id="to-date1" class="to-date calender" type="text" />
</p>

<p>
  <label>Arrive</label>
  <input id="from-date2" class="from-date calender" type="text" />
</p>

<p>
  <label>Depart</label>
  <input id="to-date2" class="to-date calender" type="text" />
</p>

我想从日期之后获取下一个元素以获取对应的日期。(布局稍微复杂一点,但从日期开始有开始日期类,到日期有迄今为止的类)。

这是我正在尝试做的,我想从日期元素中获取一个并在 dom 中找到下一个具有 to-date 类的元素。我试过这个:

$('#from-date1').next('.to-date')

但它给了我空的 jQuery 元素。我认为这是因为next给出了匹配选择器的下一个兄弟。我怎样才能得到对应的to-date

4

5 回答 5

8

找不到直接的方法,所以为此写了一个小递归算法。

演示:http: //jsfiddle.net/sHGDP/

nextInDOM()函数接受 2 个参数,即开始查找的元素和要匹配的选择器。

代替

$('#from-date1').next('.to-date')

您可以使用:

nextInDOM('.to-date', $('#from-date1'))

代码

function nextInDOM(_selector, _subject) {
    var next = getNext(_subject);
    while(next.length != 0) {
        var found = searchFor(_selector, next);
        if(found != null) return found;
        next = getNext(next);
    }
    return null;
}
function getNext(_subject) {
    if(_subject.next().length > 0) return _subject.next();
    return getNext(_subject.parent());
}
function searchFor(_selector, _subject) {
    if(_subject.is(_selector)) return _subject;
    else {
        var found = null;
        _subject.children().each(function() {
            found = searchFor(_selector, $(this));
            if(found != null) return false;
        });
        return found;
    }
    return null; // will/should never get here
}
于 2012-07-19T12:00:36.837 回答
4

.next('.to-date')不返回任何东西,因为您p之间还有一个额外的

你需要.parent().next().find('.to-date').

如果您的 dom 比您的示例更复杂,您可能需要对此进行调整。但基本上它归结为这样的事情:

$(".from-date").each(function(){
    // for each "from-date" input
    console.log($(this));
    // find the according "to-date" input
    console.log($(this).parent().next().find(".to-date"));
});

编辑:仅查找 ID 会更好更快。以下代码搜索所有起始日期并获取相应日期:

function getDeparture(el){
    var toId = "#to-date"+el.attr("id").replace("from-date","");
    //do something with the value here
    console.log($(toId).val());
}

var id = "#from-date",
    i = 0;

while($(id+(++i)).length){
    getDeparture($(id+i));
}

看看这个例子

于 2012-07-19T11:42:45.723 回答
0

尝试

var flag = false;
var requiredElement = null;
$.each($("*"),function(i,obj){
    if(!flag){
        if($(obj).attr("id")=="from-date1"){
            flag = true;
        }
    }
    else{
        if($(obj).hasClass("to-date")){
            requiredElement = obj;
            return false;
        }
    }
});
于 2012-07-19T12:41:13.287 回答
0
    var item_html = document.getElementById('from-date1');
    var str_number = item_html.attributes.getNamedItem("id").value;
    // Get id's value.
    var data_number = showIntFromString(str_number);


    // Get to-date this class
    // Select by JQ. $('.to-date'+data_number)
    console.log('to-date'+data_number);

    function showIntFromString(text){
       var num_g = text.match(/\d+/);
       if(num_g != null){
          console.log("Your number:"+num_g[0]);
          var num = num_g[0];
          return num;
       }else{
          return;
       }
    }

使用 JS。从您的 id 中获取密钥号。分析它而不是输出数字。使用 JQ。选择器将字符串与您想要的组合在一起,而不是 + 这个数字。希望这也可以帮助你。

于 2018-02-09T10:31:22.303 回答
0

我知道这是一个老问题,但我想我会添加一个免费的 jQuery 替代解决方案:)

我试图通过避免遍历 DOM 来保持代码简单。

let inputArray = document.querySelectorAll(".calender");

function nextInput(currentInput, inputClass) {
    for (i = 0; i < inputArray.length - 1; i++) {
        if(currentInput == inputArray[i]) {
            for (j = 1; j < inputArray.length - i; j++) {
                //Check if the next element exists and if it has the desired class
                if(inputArray[i + j] && (inputArray[i + j].className == inputClass)) {
                    return inputArray[i + j];
                    break;
                }
            }
        }
    }   
}

let currentInput = document.getElementById('from-date1');

console.log(nextInput(currentInput, 'to-date calender'));

如果您知道到日期将始终是具有“日历”类的下一个输入元素,那么您不需要第二个循环。

于 2019-04-08T18:34:06.240 回答