将简单的jQuery重写为纯JavaScript

Ada*_*son 2 javascript jquery code-translation

我正在构建一个JavaScript插件,它将固定到其他网站上.

整个事情是用纯JS编写的,但有一点我无法摆脱jQuery:

var key = "some_key";
var selector = "#my_input, input[name=my_input], .someInputs";
jQuery(document).on('change', selector, function() {
    doSomething(key, this.value);
});
Run Code Online (Sandbox Code Playgroud)

我想避免jQuery的原因是我希望这个JS被包含在各种各样的站点中,其中许多站点都没有jQuery.有些人已经安装了其他框架,比如Mootools,有些框架会有旧版本的jQuery,.on()不支持等等.

那,并且我理想地试图保持它非常轻量级,所以为这个小任务添加jQuery似乎过度.

Ry-*_*Ry- 7

这里有一些未来派的JavaScript完全相同:

var key = "some_key";
var selector = "#my_input, input[name=my_input], .someInputs";

document.addEventListener('change', function (e) {
    if (e.target.matches(selector)) {
        doSomething(key, e.target.value);
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,有些浏览器只支持前缀,因此它更接近于此:

var matches = (function () {
    var names = ['matches', 'matchesSelector', 'mozMatchesSelector', 'webkitMatchesSelector', 'msMatchesSelector'];

    for (var i = 0; i < names.length; i++) {
        var name = names[i];

        if (name in HTMLElement.prototype) {
            return HTMLElement.prototype[name];
        }
    }

    return null;
})();

var key = "some_key";
var selector = "#my_input, input[name=my_input], .someInputs";

document.addEventListener('change', function (e) {
    if (matches.call(e.target, selector)) {
        doSomething(key, e.target.value);
    }
});
Run Code Online (Sandbox Code Playgroud)

假设选择器不是动态的并且您需要委派,您仍然可以进行详细的手动检查:

var key = "some_key";

document.addEventListener('change', function (e) {
    var target = e.target;

    if (target.id === 'my_input' ||
            target.nodeName === 'INPUT' && target.name === 'my_input' ||
            (' ' + target.className + ' ').indexOf(' someInputs ') !== -1) {
        doSomething(key, target.value);
    }
}, false);
Run Code Online (Sandbox Code Playgroud)

正如@TJ Crowder指出的那样,尽管这适用于输入元素,但在许多情况下,您需要检查元素的父元素.这里有一些更具未来感的JavaScript来完成任务:

function* ascend(element) {
    do {
        yield element;
    } while ((element = element.parentNode));
}

var key = "some_key";
var selector = "#my_input, input[name=my_input], .someInputs";

document.addEventListener('change', function (e) {
    var match = Array.from(ascend(e.target)).find(x => x.matches(selector));

    if (match) {
        doSomething(key, match.value);
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你将Firefox Nightly和Chrome混合在一起,这将适用于该浏览器.我们没有那个,但随意垫片Array.prototype.find!

  • 大声笑!但要注意,如果你没有扎根于`document`,你就会走出界限.或者,当然,有一个无聊的旧`for`循环.*(Gasp !!)*;-)`for(var node = e.target;!matches.call(node,selector); node = node.parentNode){if(node === this){return; doSomething(key,node.value);`(格式:http://pastie.org/9427419).(如果生成`document`,你可能需要检查`document.documentElement`而不是`document`.我从不在`document`中使用,我使用`document.body`.) (2认同)