ページ内のURLに変換漏れやエラーがないかチェックするために作ったグリモン用user.jsです。
少し改造すれば文字列チェック用にも使えます。
※グリモン用と書いてるけど最近はGoogle Chromeでもドラッグ&ドロップで普通に使えたりする。
Google Chromeからuser.jsを削除するには「ツール」→「機能拡張」でリストを開く
→ html_checker.user.js
// ==UserScript==
// @name html_checker
// @include *
// ==/UserScript==
// 表示領域の幅
var w = 400;
// チェックする要素(タグ)
var tag = new Array('a','area','input');
// チェックする属性
var attr = new Array('href','onclick');
// チェックするソース
var body = document.getElementsByTagName('body')[0];
// チェックするURLリスト
var str = new Array('w-x-w.com','hoge.co.jp');
var ol = document.createElement('ol');
ol.style.fontSize = '80%';
ol.style.listStyleType = 'decimal';
ol.style.margin = '0';
ol.style.padding = '8px 0 0 2em';
ol.style.textAlign = 'left';
for(var i=0;i<tag.length;i++){
var t = body.getElementsByTagName(tag[i]);
for(var j=0;j<t.length;j++){
for(var k=0;k<attr.length;k++){
if (t[j].getAttribute(attr[k])) {
for(var l=0;l<str.length;l++){
if (t[j].getAttribute(attr[k])) {
var re = new RegExp(str[l], "ig");
if (t[j].getAttribute(attr[k]).match(re)) {
var clone = t[j].cloneNode(true);
var li = document.createElement('li');
li.style.padding = '0 0 8px';
li.appendChild(clone);
ol.appendChild(li);
break;
}
}
}
}
}
}
}
if(ol.innerHTML != ""){
var d = document.createElement('dl');
d.id = "error_keyword";
d.style.zIndex = 999999;
d.style.padding = '0';
d.style.position = 'absolute';
d.style.top = '8px';
d.style.left = '8px';
d.style.opacity = 0.8;
d.addEventListener("dblclick", del_error, false);
var dt = document.createElement('dt');
dt.className = "drag_on";
dt.innerHTML = ' ';
dt.style.cssFloat = 'left';
dt.style.margin = '0';
dt.style.padding = '4px';
dt.style.width = w + 'px';
dt.style.border = '1px solid #eee';
dt.style.borderBottom = 'none';
dt.style.MozBorderRadiusTopright = '8px';
dt.style.MozBorderRadiusTopleft = '8px';
dt.style.backgroundColor = '#ffc';
dt.style.fontSize = '80%';
var dt_a = document.createElement('a');
dt_a.href = "javascript:void:(0);";
dt_a.innerHTML = "×";
dt_a.style.display = 'block';
dt_a.style.cssFloat = 'right';
dt_a.addEventListener("click", del_error, false);
dt.appendChild(dt_a);
d.appendChild(dt);
var dd = document.createElement('dd');
dd.style.clear = 'both';
dd.style.width = w + 'px';
dd.style.maxHeight = window.innerHeight * 0.75 + 'px';
dd.style.margin = '0';
dd.style.padding = '4px';
dd.style.overflow = 'auto';
dd.style.border = '1px solid #eee';
dd.style.borderTop = '1px solid #eee';
dd.style.MozBorderRadiusBottomright = '8px';
dd.style.MozBorderRadiusBottomleft = '8px';
dd.style.backgroundColor = '#fff';
dd.appendChild(ol);
d.appendChild(dd);
body.appendChild(d);
}
function del_error() {
d.parentNode.removeChild(d);
}
// ここから 技評.jp掲載JSをほぼ引用^^;
// 第22回 JavaScriptによるUIの実装:ドラッグ
// http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0022
(function(){
var addEvent = document.addEventListener ?
function(node,type,listener){
node.addEventListener(type,listener,false);
} :
function(node,type,listener){
node.attachEvent('on'+type, listener);
}
var removeEvent = document.removeEventListener ?
function(node,type,listener){
node.removeEventListener(type,listener,false);
} :
function(node,type,listener){
node.detachEvent('on'+type, listener);
}
function getStyle(element){
return window.getComputedStyle ?
getComputedStyle(element, '') :
element.currentStyle;
}
var IE6 = !window.XMLHttpRequest && window.ActiveXObject;
var root = document.documentElement;
var dragging = false;
var fixed = false;
var x, y, dx, dy;
var element;
addEvent(document,'mousedown', function(evt){
if(!evt){
evt = window.event;
}
var target = evt.target || evt.srcElement;
if (target.className === 'drag_on') {
x = evt.offsetX || evt.layerX;
y = evt.offsetY || evt.layerY;
dragging = true;
element = target.parentNode;
var style = getStyle(element);
var rect = element.getBoundingClientRect();
var left = window.pageXOffset || root.scrollLeft;
var top = window.pageYOffset || root.scrollTop;
if (style.position === 'fixed'){
fixed = true;
dx = 0;
dy = 0;
} else {
fixed = false;
dx = (rect.left + left) - element.offsetLeft;
dy = (rect.top + top ) - element.offsetTop;
}
if (IE6){
element.style.removeExpression('behavior');
}
if (evt.preventDefault){
evt.preventDefault();
} else {
evt.returnValue = false;
}
addEvent(document, 'mousemove', mousemove);
}
});
addEvent(document, 'mouseup', function(evt){
if(dragging){
dragging = false;
removeEvent(document, 'mousemove', mousemove);
var rect = element.getBoundingClientRect();
element.style.left = rect.left + 'px';
element.style.top = rect.top + 'px';
element.style.position = 'fixed';
if (IE6) {
element.style.position = 'absolute';
var L = 'document.documentElement.scrollLeft';
var T = 'document.documentElement.scrollTop';
element.style.setExpression('behavior',
'this.style.left=(' +(rect.left-dx)+ '+' + L + ' )+"px",'+
'this.style.top =(' +(rect.top -dy)+ '+' + T + ' )+"px"');
document.body.style.backgroundImage='url(about:blank)'
document.body.style.backgroundAttachment = 'fixed';
}
}
});
function mousemove(evt){
if(!evt){
evt = window.event;
}
if(dragging){
var left= fixed? 0: window.pageXOffset||root.scrollLeft
var top = fixed? 0: window.pageYOffset||root.scrollTop
element.style.left= left+ evt.clientX - x - dx + 'px';
element.style.top = top + evt.clientY - y - dy + 'px';
element.style.right = 'auto';
if (evt.preventDefault){
evt.preventDefault();
} else {
evt.returnValue = false;
}
}
}
})();
// ここまで 技評.jp掲載JSをほぼ引用^^;