我构建了高级验证插件,以特定方式显示错误。
但是,当用户输入无效时,我将页面滚动到验证失败的第一个元素。
这就是looks:
的方式
问题出在哪里?
我用TD's
加粗黑色。
因此,您可以看到Currency textbox
位于第一个TD上,Owner Name textbox
位于第二个TD上
所以Currency textbox
验证了第一个,因此,页面滚动到Currency位置而不是OwnerName文本框位置。 (按照我的意愿)
问题:
如何找到最顶层的元素(假设所有失败的元素都有.failed
类 - 只是为了简单起见。)
答案 0 :(得分:7)
只需遍历每个元素:
var $failed = $('.failed');
var top = null; // current "smallest" value
var found = null; // current "topmost" element
$failed.each(function() {
var $this = $(this);
var cur = $this.offset().top;
if (top === null || cur < top) {
found = this;
top = cur;
}
});
替代方案,如果您实际上并不关心它是哪个元素,而只想要滚动位置:
var tops = $failed.map(function() {
return $(this).offset().top;
}).get();
var top = Math.min.apply(null, tops);
注意:代码已更正为使用.offset
代替.scrollTop
答案 1 :(得分:2)
jQuery中没有任何内容可以提供您想要的内容。您必须循环遍历所有元素并使用offset()
查看哪个元素具有最小的顶部和左侧。
var failed = $(".failed");
var firstElem = failed.eq(0);
var firstPos = firstElem.offset();
failed.splice(0,1);
failed.each( function() {
var elem = $(this);
var pos = elem.offset();
if (pos.top < firstPos.top || (pos.top===firstPos.top && pos.left<firstPos.left) {
firstElem = elem;
firstPos = pos;
}
});
答案 2 :(得分:2)
试试这个:
var el;
$.each($(".failed"), function () {
if (!el || el.offset().top > $(this).offset().top) {
el = $(this);
}
});
答案 3 :(得分:2)
您可以使用sort
按位置排序:
var topElement = $('.invalid-elements')
.sort(function(a, b) { return $(a).offset().top - $(b).offset().top })[0];