纯javascript替代jQuery的.not()

时间:2014-05-13 20:01:45

标签: javascript jquery

jQuery中.not()的JS替代品是什么?我有$(".form :input").not,但需要将其转移到纯JS。有没有可以帮助我的指南?

 var input = $(".form :input").not('button, [type="button"], [type="submit"]').on({
input: return
});

我希望在JS中做到这一点

3 个答案:

答案 0 :(得分:3)

现代浏览器支持querySelectorAll()中的 NOT 子句:

document.querySelectorAll(".form :input:not(...)");

示例(jsFiddle):

<div>This should be colored!</div>
<div>This should be colored!</div>
<div id="this-not">This must not colored!</div>
<div>This should be colored!</div>
<div>This should be colored!</div>
var matchedElements = document.querySelectorAll("div:not(#this-not)");
for (var i=0; i<matchedElements.length; i++) {
    matchedElements.item(i).style.backgroundColor = "red";
}

答案 1 :(得分:3)

您还可以使用.filter()排除数组中的项目。您可以像这样使用它(例如来自MDN):

function isBigEnough(element) {
  return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]

所有现代浏览器和IE9 +都支持它。有关详细信息,请参阅Array.prototype.filter() on MDN

不幸的是.filter()仅适用于数组,所以我们必须做一些额外的操作来过滤NodeList

HTML:

<ul>
    <li>1</li>
    <li>2</li>
    <li class="not-me">3</li>
    <li>4</li>
    <li>5</li>
</ul>

使用Javascript:

var filter = Array.prototype.filter;

var excludeByClassName = function(className) {
    return function (element) {
        return element.className != className;
    };
};

var LIs = document.getElementsByTagName('li');
// [li, li, li.not-me, li, li]

var filteredLIs = filter.call(LIs, excludeByClassName('not-me'));
// [li, li, li, li]

有关工作示例,请参阅此jsFiddle

答案 2 :(得分:3)

普通JS中的等价物将是这样的

var forms = document.querySelectorAll('.form'),
    inputs = [];

for (var i = forms.length; i--;) {
    var els = forms[i].querySelectorAll('input, textarea, select');

    for (var j = els.length; j--;) {
        if (els[j].type != 'button' && els[j].type != 'submit') {
            inputs.push(els[j]);
            els[j].addEventListener('input', cback, false);
        }
    }
}

function cback(event) {
    var b = [];

    for (var i = inputs.length; i--;) {
        if (!inputs[i].value.length) b.push(inputs[i]);
    }

    var l1 = b.length;
    var l2 = inputs.length;
    var top = document.querySelectorAll('.top');

    for (var j = top.length; j--;) {
        top[j].style.width = 100 - (l1 / l2) * 100 + "%";
    }
}

FIDDLE