外部リンクを拾って、クラス名をつけたり新しいウインドウで開くようにしたりするJavaScriptです。
こんな風に使います。
var ob = new OutboundLink();
ob.limitByClassName("entryBody");
他に以下のような設定ができます。
limitById(id:String)
走査対象を特定の`id`が指定された要素に限定します。limitByClassName(name:String)
走査対象を特定の`class`が指定された要素に限定します。useNewClassName(b:Boolean)
クラス名をつけるかどうか設定します。初期値は`true`です。additionalClassName(name:String)
追加するクラス名を指定します。初期値は`"outbound"`です。CSSで`.outbound`というクラスを指定しておけば、そのスタイルを反映できます。useFilterIMG(b:Boolean)
`a`要素の子要素に`img`要素がある場合、その`a`要素を走査対象から除外します。初期値は`true`です。useNewWindow(b:Boolean)
新しいウィンドウで開くように設定します。新しいウィンドウは`target`属性を使用しないValidなコードです。初期値は`true`です。//
// outboundlink.js
//
OutboundLink = function()
{
this.els = [];
this.use_new_class = true;
this.additional_classname = "outbound";
this.use_filter_IMG = true;
this.use_new_window = true;
//
this.onLoad(this,"init");
}
OutboundLink.prototype.limitById = function(id)
{
this._id = id;
}
OutboundLink.prototype.limitByClassName = function(name)
{
this._classname = name;
}
OutboundLink.prototype.useNewClassName - function(b)
{
this.use_new_class = b;
}
OutboundLink.prototype.additionalClassName = function(name)
{
this.additional_classname = name;
}
OutboundLink.prototype.useFilterIMG = function(b)
{
this.use_filter_IMG = b;
}
OutboundLink.prototype.useNewWindow = function(b)
{
this.use_new_window = b;
}
OutboundLink.prototype.onLoad = function(scope, func)
{
if(window.addEventListener)
window.addEventListener("load", function(e){ scope[func](e); }, false );
else if(window.attachEvent)
window.attachEvent("onload", function(e){ scope[func](e); });
}
OutboundLink.prototype.init = function()
{
if(this._classname)
this.els = this.getElementsByClassName(this._classname);
else if(this._id)
this.els.push(document.getElementById(this._id));
else
this.els.push(document.body);
//
var e = this.els;
for(i=0,len=e.length; i<len; i++)
{
var a = e[i].getElementsByTagName("a");
if(this.use_filter_IMG) a = this.filterIMG(a);
//
for(j=0,len2=a.length; j<len2; j++)
{
var el = a[j], href = el.href;
if(!!(href.match(/^https?:.+/)))
{
if(this.use_new_class)
el.setAttribute("class",this.additional_classname);
if(this.use_new_window)
el.setAttribute("onclick","window.open(this.href); return false;");
}
}
}
}
OutboundLink.prototype.filterIMG = function(nodelist)
{
var e=[];
for(var i=0,len=nodelist.length; i<len; i++)
{
var n = nodelist[i], tn = ""+n.firstChild.tagName;
if(!(tn.match(/img/i))) e.push(n);
}
return e;
}
OutboundLink.prototype.getElementsByClassName = function(_classname)
{
var e = [];
var a = document.getElementsByTagName("*");
for(var i=0,len=a.length; i<len; i++)
{
var n = a[i].className;
if(n&&n==_classname) e.push(a[i]);
}
return e;
}