對於所有瀏覽器,您可以通過call
或apply
(它的工作原理任何陣列狀對象)上使用Array.prototype.slice
:
Array.prototype.slice.call(document.querySelectorAll('.row'))
繞Y我們更新的問題:
進出口使用此爲「點擊」事件處理:
Array.prototype.slice.call(document.querySelectorAll('.row'))
.forEach(function(header) {
return header.addEventListener('click', function(e) {
headerClick(e, header, header.querySelector('.exy'))
});
});
我不會用querySelectorAll
爲此不惜一切,我會使用事件委託。據推測,所有這些.row
元素都在一個普通容器內(當然,最終它們都在body
之內,但希望有一個容器比它「更接近」)。隨着事件委託,你這樣做:
爲您引用代碼,這看起來是這樣的:
// A regex we'll reuse
var rexIsRow = /\brow\b/;
// Hook click on the container
document.querySelector("selector-for-the-container").addEventListener(
"click",
function(e) {
// See if we find a .row element in the path from target to container
var elm;
for (elm = e.target; elm !== this; elm = elm.parentNode) {
if (rexIsRow.test(elm.className)) {
// Yes we did, call `headerClick`
headerClick(e, elm, elm.querySelector('.exy'));
// And stop looking
break;
}
}
},
false
);
關於更多modern browsers,您可以使用elm.classList.contains("row")
而不是正則表達式,但遺憾的是不在IE9或更早的版本中。
這就是說,而不是維護一個單獨的代碼庫,爲gcampbell pointed out你可以使用ES6(ES2015)功能在你的代碼,然後與轉換他們transpiler transpile(當然,在那些可以轉換,這是很多)ES5語法。 Babel就是這樣一個轉譯器。
'Array.prototype.slice.call(document.querySelectorAll('。row'))' – gcampbell
您可以使用Babel。 – gcampbell
而不是babel,在您放棄對舊版瀏覽器的支持時使用抽象和升級。 Javascript正在編寫腳本,但轉移到您很快必須編譯的地方。我不是火箭科學,但我們正在使它變成這樣...... – Asken