-
-
Save mala/1716182 to your computer and use it in GitHub Desktop.
yuga.jsのXSS直したバージョンがなかなかリリースされないので勝手に直したやつ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47,49c47,49 | |
< var e = document.createElement('span'); | |
< e.innerHTML = '<a href="' + path + '" />'; | |
< return e.firstChild.href; | |
--- | |
> var a = document.createElement('a'); | |
> a.href = path; | |
> return a.href; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
http://www.kyosuke.jp/yugajs/#"></a><img src=/ onerror=alert(1)> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* yuga.js 0.7.1 - 優雅なWeb制作のためのJS | |
* | |
* Copyright (c) 2009 Kyosuke Nakamura (kyosuke.jp) | |
* Licensed under the MIT License: | |
* http://www.opensource.org/licenses/mit-license.php | |
* | |
* Since: 2006-10-30 | |
* Modified: 2009-01-27 | |
* | |
* jQuery 1.3.1 | |
* ThickBox 3.1 | |
*/ | |
/* | |
* [使用方法] XHTMLのhead要素内で次のように読み込みます。 | |
<link rel="stylesheet" href="css/thickbox.css" type="text/css" media="screen" /> | |
<script type="text/javascript" src="js/jquery.js"></script> | |
<script type="text/javascript" src="js/thickbox.js"></script> | |
<script type="text/javascript" src="js/yuga.js" charset="utf-8"></script> | |
*/ | |
(function($) { | |
$(function() { | |
$.yuga.selflink(); | |
$.yuga.rollover(); | |
$.yuga.externalLink(); | |
$.yuga.thickbox(); | |
$.yuga.scroll(); | |
$.yuga.tab(); | |
$.yuga.stripe(); | |
$.yuga.css3class(); | |
}); | |
//--------------------------------------------------------------------- | |
$.yuga = { | |
// URIを解析したオブジェクトを返すfunction | |
Uri: function(path){ | |
var self = this; | |
this.originalPath = path; | |
//絶対パスを取得 | |
this.absolutePath = (function(){ | |
var a = document.createElement('a'); | |
a.href = path; | |
return a.href; | |
})(); | |
//絶対パスを分解 | |
var fields = {'schema' : 2, 'username' : 5, 'password' : 6, 'host' : 7, 'path' : 9, 'query' : 10, 'fragment' : 11}; | |
var r = /^((\w+):)?(\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/.exec(this.absolutePath); | |
for (var field in fields) { | |
this[field] = r[fields[field]]; | |
} | |
this.querys = {}; | |
if(this.query){ | |
$.each(self.query.split('&'), function(){ | |
var a = this.split('='); | |
if (a.length == 2) self.querys[a[0]] = a[1]; | |
}); | |
} | |
}, | |
//現在のページと親ディレクトリへのリンク | |
selflink: function (options) { | |
var c = $.extend({ | |
selfLinkAreaSelector:'body', | |
selfLinkClass:'current', | |
parentsLinkClass:'parentsLink', | |
postfix: '_cr', | |
changeImgSelf:true, | |
changeImgParents:true | |
}, options); | |
$(c.selfLinkAreaSelector+((c.selfLinkAreaSelector)?' ':'')+'a[href]').each(function(){ | |
var href = new $.yuga.Uri(this.getAttribute('href')); | |
var setImgFlg = false; | |
if ((href.absolutePath == location.href) && !href.fragment) { | |
//同じ文書にリンク | |
$(this).addClass(c.selfLinkClass); | |
setImgFlg = c.changeImgSelf; | |
} else if (0 <= location.href.search(href.absolutePath)) { | |
//親ディレクトリリンク | |
$(this).addClass(c.parentsLinkClass); | |
setImgFlg = c.changeImgParents; | |
} | |
if (setImgFlg){ | |
//img要素が含まれていたら現在用画像(_cr)に設定 | |
$(this).find('img').each(function(){ | |
this.originalSrc = $(this).attr('src'); | |
this.currentSrc = this.originalSrc.replace(new RegExp('('+c.postfix+')?(\.gif|\.jpg|\.png)$'), c.postfix+"$2"); | |
$(this).attr('src',this.currentSrc); | |
}); | |
} | |
}); | |
}, | |
//ロールオーバー | |
rollover: function(options) { | |
var c = $.extend({ | |
hoverSelector: '.btn, .allbtn img', | |
groupSelector: '.btngroup', | |
postfix: '_on' | |
}, options); | |
//ロールオーバーするノードの初期化 | |
var rolloverImgs = $(c.hoverSelector).filter(isNotCurrent); | |
rolloverImgs.each(function(){ | |
this.originalSrc = $(this).attr('src'); | |
this.rolloverSrc = this.originalSrc.replace(new RegExp('('+c.postfix+')?(\.gif|\.jpg|\.png)$'), c.postfix+"$2"); | |
this.rolloverImg = new Image; | |
this.rolloverImg.src = this.rolloverSrc; | |
}); | |
//グループ内のimg要素を指定するセレクタ生成 | |
var groupingImgs = $(c.groupSelector).find('img').filter(isRolloverImg); | |
//通常ロールオーバー | |
rolloverImgs.not(groupingImgs).hover(function(){ | |
$(this).attr('src',this.rolloverSrc); | |
},function(){ | |
$(this).attr('src',this.originalSrc); | |
}); | |
//グループ化されたロールオーバー | |
$(c.groupSelector).hover(function(){ | |
$(this).find('img').filter(isRolloverImg).each(function(){ | |
$(this).attr('src',this.rolloverSrc); | |
}); | |
},function(){ | |
$(this).find('img').filter(isRolloverImg).each(function(){ | |
$(this).attr('src',this.originalSrc); | |
}); | |
}); | |
//フィルタ用function | |
function isNotCurrent(i){ | |
return Boolean(!this.currentSrc); | |
} | |
function isRolloverImg(i){ | |
return Boolean(this.rolloverSrc); | |
} | |
}, | |
//外部リンクは別ウインドウを設定 | |
externalLink: function(options) { | |
var c = $.extend({ | |
windowOpen:true, | |
externalClass: 'externalLink', | |
addIconSrc: '' | |
}, options); | |
var uri = new $.yuga.Uri(location.href); | |
var e = $('a[href^="http://"]').not('a[href^="' + uri.schema + '://' + uri.host + '/' + '"]'); | |
if (c.windowOpen) { | |
e.click(function(){ | |
window.open(this.href, '_blank'); | |
return false; | |
}); | |
} | |
if (c.addIconSrc) e.not(':has(img)').after($('<img src="'+c.addIconSrc+'" class="externalIcon" />')); | |
e.addClass(c.externalClass); | |
}, | |
//画像へ直リンクするとthickboxで表示(thickbox.js利用) | |
thickbox: function() { | |
try { | |
tb_init('a[href$=".jpg"]:not(.thickbox, a[href*="?"]), a[href$=".gif"][href!="?"]:not(.thickbox, a[href*="?"]), a[href$=".png"][href!="?"]:not(.thickbox, a[href*="?"])'); | |
} catch(e) { | |
} | |
}, | |
//ページ内リンクはするするスクロール | |
scroll: function(options) { | |
//ドキュメントのスクロールを制御するオブジェクト | |
var scroller = (function() { | |
var c = $.extend({ | |
easing:100, | |
step:30, | |
fps:60, | |
fragment:'' | |
}, options); | |
c.ms = Math.floor(1000/c.fps); | |
var timerId; | |
var param = { | |
stepCount:0, | |
startY:0, | |
endY:0, | |
lastY:0 | |
}; | |
//スクロール中に実行されるfunction | |
function move() { | |
if (param.stepCount == c.step) { | |
//スクロール終了時 | |
setFragment(param.hrefdata.absolutePath); | |
window.scrollTo(getCurrentX(), param.endY); | |
} else if (param.lastY == getCurrentY()) { | |
//通常スクロール時 | |
param.stepCount++; | |
window.scrollTo(getCurrentX(), getEasingY()); | |
param.lastY = getEasingY(); | |
timerId = setTimeout(move, c.ms); | |
} else { | |
//キャンセル発生 | |
if (getCurrentY()+getViewportHeight() == getDocumentHeight()) { | |
//画面下のためスクロール終了 | |
setFragment(param.hrefdata.absolutePath); | |
} | |
} | |
} | |
function setFragment(path){ | |
location.href = path | |
} | |
function getCurrentY() { | |
return document.body.scrollTop || document.documentElement.scrollTop; | |
} | |
function getCurrentX() { | |
return document.body.scrollLeft || document.documentElement.scrollLeft; | |
} | |
function getDocumentHeight(){ | |
return document.documentElement.scrollHeight || document.body.scrollHeight; | |
} | |
function getViewportHeight(){ | |
return (!$.browser.safari && !$.browser.opera) ? document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight : window.innerHeight; | |
} | |
function getEasingY() { | |
return Math.floor(getEasing(param.startY, param.endY, param.stepCount, c.step, c.easing)); | |
} | |
function getEasing(start, end, stepCount, step, easing) { | |
var s = stepCount / step; | |
return (end - start) * (s + easing / (100 * Math.PI) * Math.sin(Math.PI * s)) + start; | |
} | |
return { | |
set: function(options) { | |
this.stop(); | |
if (options.startY == undefined) options.startY = getCurrentY(); | |
param = $.extend(param, options); | |
param.lastY = param.startY; | |
timerId = setTimeout(move, c.ms); | |
}, | |
stop: function(){ | |
clearTimeout(timerId); | |
param.stepCount = 0; | |
} | |
}; | |
})(); | |
$('a[href^=#], area[href^=#]').not('a[href=#], area[href=#]').each(function(){ | |
this.hrefdata = new $.yuga.Uri(this.getAttribute('href')); | |
}).click(function(){ | |
var target = $('#'+this.hrefdata.fragment); | |
if (target.length == 0) target = $('a[name='+this.hrefdata.fragment+']'); | |
if (target.length) { | |
scroller.set({ | |
endY: target.offset().top, | |
hrefdata: this.hrefdata | |
}); | |
return false; | |
} | |
}); | |
}, | |
//タブ機能 | |
tab: function(options) { | |
var c = $.extend({ | |
tabNavSelector:'.tabNav', | |
activeTabClass:'active' | |
}, options); | |
$(c.tabNavSelector).each(function(){ | |
var tabNavList = $(this).find('a[href^=#], area[href^=#]'); | |
var tabBodyList; | |
tabNavList.each(function(){ | |
this.hrefdata = new $.yuga.Uri(this.getAttribute('href')); | |
var selecter = '#'+this.hrefdata.fragment; | |
if (tabBodyList) { | |
tabBodyList = tabBodyList.add(selecter); | |
} else { | |
tabBodyList = $(selecter); | |
} | |
$(this).unbind('click'); | |
$(this).click(function(){ | |
tabNavList.removeClass(c.activeTabClass); | |
$(this).addClass(c.activeTabClass); | |
tabBodyList.hide(); | |
$(selecter).show(); | |
return false; | |
}); | |
}); | |
tabBodyList.hide() | |
tabNavList.filter(':first').trigger('click'); | |
}); | |
}, | |
//奇数、偶数を自動追加 | |
stripe: function(options) { | |
var c = $.extend({ | |
oddClass:'odd', | |
evenClass:'even' | |
}, options); | |
$('ul, ol').each(function(){ | |
//JSでは0から数えるのでevenとaddを逆に指定 | |
$(this).children('li:odd').addClass(c.evenClass); | |
$(this).children('li:even').addClass(c.oddClass); | |
}); | |
$('table, tbody').each(function(){ | |
$(this).children('tr:odd').addClass(c.evenClass); | |
$(this).children('tr:even').addClass(c.oddClass); | |
}); | |
}, | |
//css3のクラスを追加 | |
css3class: function() { | |
//:first-child, :last-childをクラスとして追加 | |
$('body :first-child').addClass('firstChild'); | |
$('body :last-child').addClass('lastChild'); | |
//css3の:emptyをクラスとして追加 | |
$('body :empty').addClass('empty'); | |
} | |
}; | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment