Skip to content
Permalink
Browse files

XPathからquerySelectorAllに変更

  • Loading branch information...
oflow
oflow committed Aug 30, 2012
1 parent 83b55de commit 64142ee91abd3d7cae083c613f57afcfb0f585c4
Showing with 18 additions and 34 deletions.
  1. +18 −34 shift_click_multiple_check.user.js
@@ -8,36 +8,38 @@
// @exclude http://www.google.co.jp/*
// @exclude https://www.google.com/*
// @exclude https://www.google.co.jp/*
// @version 1.0.20110920
// @version 1.1
// @note XPathからquerySelectorAllに変更
// 同じ要素に何度もaddEventLister使ってる場合あるの修正
// @note DOMNodeInsertedの所間違ってた…
// ==UserScript==

// Gmailのチェックボックスの動作をできるだけ再現
// 使いたいサイトでname属性が違うcheckboxの一覧があったのでいい加減にした
// 要素の並び方次第では予想と大幅に変わる可能性がある
// DOMNodeModified, DOMNodeRemovedはもちろん見てないのでおかしくなる可能性がある

(function() {
var prevCheckbox = null, checkboxes = null, checkboxLength = 0;

function init(doc) {
// XPathでチェックボックス取得
var elms = getCheckboxesByXPath(doc, '//input[@type="checkbox"]');
function init(doc, inserted) {
if (doc.nodeType != 9 && !inserted) return;
// 追加されたやつにcheckboxあるか確認する
if (inserted && !doc.querySelector('input[type="checkbox"]')) return;

var elms = document.querySelectorAll('input[type="checkbox"]');
checkboxLength = elms.length;
if (!checkboxLength) return;

for (var i = 0; i < checkboxLength; i++) {
if (elms[i].getAttribute('data-multiple-check')) continue;
elms[i].setAttribute('data-multiple-check', 'true');
elms[i].addEventListener('click', function(e) {
if (e.button == 0) multipleCheck(e);
}, false);
}

if (doc.nodeType != 9) {
// 更新されてたら全部取得しなおす
checkboxes = getCheckboxesByXPath(document, '//input[@type="checkbox"]');
checkboxLength = checkboxes.length;
} else {
checkboxes = elms;
}
}
checkboxes = elms;
}

function multipleCheck(e) {
var self = e.target, checked = self.checked, prev = prevCheckbox;
@@ -60,31 +62,13 @@
}
}

function getCheckboxesByXPath(doc, xpath) {
// application/xhtml+xmlの場合そのままだと無理
if (document.documentElement.namespaceURI) {
xpath = xpath.replace(/\/\//g, '//html:');
}

var nodes = document.evaluate(xpath, doc, function(prefix) {
return (prefix == 'html' ? 'http://www.w3.org/1999/xhtml' : null);
}, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

var elms = [];
for (var i = 0, length = nodes.snapshotLength; i < length; i++) {
elms.push(nodes.snapshotItem(i));
}

return elms;
}

init(document);
init(document, false);
// 重いならこれやめるといいかも
document.addEventListener('DOMNodeInserted', function(e) {
var node = e.target;
if (node.nodeType != 1) return;
// この辺はよく追加されるけど無視していいだろうと
if (/^(?:a|img|br)$/i.test(node.nodeName)) return;
init(node);
if (/^(?:a|img|br|script)$/i.test(node.nodeName)) return;
init(node, true);
}, false);
})();

0 comments on commit 64142ee

Please sign in to comment.
You can’t perform that action at this time.