๋ค์ ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
$(function(){
var AppRouter = Backbone.Router.extend({
routes: {
'(count/:count)': 'home',
},
home: function(currCount) {
var counter = 0;
var thisObj = this;
$("body").html($("<p>Click me</p>").on('click', function() {
console.log("clicked "+counter);
counter++;
thisObj.navigate('count/'+counter, {trigger:false, replace: true});
}));
console.log('home route: '+currCount);
},
});
window.app = new AppRouter();
Backbone.history.start();
});
์ด๊ฒ์ "home route: null"์ ๊ธฐ๋กํ๊ณ "Click me"๋ฅผ ํด๋ฆญํ ๋๋ง๋ค "click #"์ ๊ธฐ๋กํด์ผ ํฉ๋๋ค.
์ด์ ์์ ์์ ์ ๊ฐํฉ๋๋ค. Navigation()์์ URL์ ๊ณต๋ฐฑ์ ์ถ๊ฐํฉ๋๋ค.
thisObj.navigate('count/ '+counter, {trigger:false, replace: true});
๋ค์ ์๋ํ๋ฉด "home route: #"๋ ๊ธฐ๋ก๋๊ธฐ ์์ํ๊ณ ์นด์ดํฐ๊ฐ _์ธ ๋ฒ์ ํด๋ฆญ ์ค ๋ ๋ฒ_์ ์ฌ์ค์ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ 1.1.2 ๋ฆด๋ฆฌ์ค์ ์์ผ๋ฉฐ ์ต์ Firefox 33.1์์ ํ ์คํธ ์ค์ ๋๋ค. Chrome์์๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. Chrome์ด URL์ ๊ณต๋ฐฑ์ ์ธ์ฝ๋ฉํ๋ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ํ์คํ์ง ์์ต๋๋ค.
๋๋ ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ์ฒ์๋ถํฐ URL์ ์์ด์๋ ์ ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ด ๋์์ ์ด์ํ๊ณ ์ต์ํ ๋ฌธ์ํ๋์ด์ผ ํฉ๋๋ค. (์ฆ, "navigate()๋ ๊ณต๋ฐฑ(๋๋ ๊ธฐํ ์์ ํ์ง ์์ ๋ฌธ์??)์ด ํฌํจ๋ URL์์ ์์๋๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค.")
์ด์ ๋ํ ์ฌ์ด ์์ ์ด ์๋์ง ํ์คํ์ง ์์ง๋ง ์ ์ด๋ ์ด ๋ฒ๊ทธ๋ฅผ ๋ฌธ์ํํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๊ทธ๊ฒ์ ์ฐพ์๋ด๋ ๋ฐ ๋๋ ์๊ฐ์ ์ ์ฝํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋ ํ์ธ์ @chaimpeck์ ๋๋ค! ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ถํํ๋ ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌํํ ์ ์์์ต๋๋ค. ๋ง์คํฐ ๋ธ๋์น์ 1.1.2 ๋ฆด๋ฆฌ์ค ๋ชจ๋์์ ์ต์ Chrome ๋ฐ Firefox๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. ๋ด๊ฐ ๋ณผ ์ ์๋ gist/bin/fiddle์ ์์ ์์ ๋ฅผ ๊ฒ์ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ฐ๋ฆฌ๋ ํ์คํ ์ด์ ์ Firefox์์ ํน์ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์๊ณ ๋ ๋ง์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์์ฌํ์ง ์์ต๋๋ค. : ์ค๋ง์ผ :
์ค์ ๋ก ์ด์ ๋๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ณด์์ง๋ง ๋ด ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ณต์ ํ๊ธฐ ์ํด ์ผ๋ถ ํ ์คํธ ์ฝ๋๋ฅผ ์กฐ๋กฑํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ํ์คํ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ด๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ชจ๋ ์ต์ ๋ฒ์ ์ IE์ Chrome์ ์ ์๋ํ์ง๋ง ์ต์ํ Firefox v31.5.0(๋ฌป์ง ๋ง์ธ์. ์ฐ๋ฆฌ๊ฐ ๋ถ์ด ์๋ ์ธํ๋ผ๊ฐ ์ซ์ด์)์์๋ ํธ๋ฆฌ๊ฑฐ ์ต์ ์ ์ถ๊ฐํ์ง ์๊ณ ๋ ํ์คํ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
์ฌ๊ธฐ ๋ด๊ฐ ๋ฐ๊ฒฌํ ๊ฒ์ด ์์ต๋๋ค. Firefox์์ "this.location.href" ๋ณ์๋ฅผ ํ์ธํ๋ฉด ๋ณ์์ ๋ชจ๋ ๊ณต๋ฐฑ์ด %20์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. Chrome(๋ฐ ์๋ง๋ IE)์ ๊ณต๋ฐฑ์ผ๋ก ๋ก๋๋ค. ํ์์ผ๋ก ์ด๋ํ ๋ "checkUrl()"์ด "this.getFragment()"์ ๋ฐํ ๊ฐ๊ณผ "this.fragment"๋ฅผ ๋น๊ตํ์ฌ "this.getFragment()"๋ฅผ ํธ์ถํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ Backbone์ ๋ฌธ์ ์ ๋๋ค. loadUrl()", ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ. this.getFragment()๋ Firefox์ ๊ณต๋ฐฑ(๋๋ ํด๋น ๋ฌธ์ ์ ๋ํ ์ธ์ฝ๋ฉ) ๋์ %20์ ์ฌ์ฉํ์ฌ this.location.href์ ๊ฐ์ ๋ฐํํฉ๋๋ค. this.fragment๋ ๋์ฝ๋ฉ๋ ๋ฑ๊ฐ๋ฌผ์ ๋ฐํํฉ๋๋ค. this.fragment๋ URL์์ encodeURI()๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ฝ๋ฉ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. "navigate()" ํจ์์์ this.fragment๋ ์ ๋ฌ๋๋ URL์์ "this.decodeFragment()"๋ฅผ ํธ์ถํ์ฌ ํ ๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ธ์ฝ๋ฉ์ ๊ฐ์ ํ๋ ค๋ ์๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋ฐ๋ผ์ this.fragment๊ฐ this.decodeFragment()์ ์ฌ์ฉ์ผ๋ก ์ธํด ํญ์ ๋์ฝ๋ฉ๋ URL์ด๊ณ URL์ encodeURI()๊ฐ ๋ณ๊ฒฝํ ๋ฌธ์(์ด ๊ฒฝ์ฐ ๊ณต๋ฐฑ)๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ฐํ๋ ๊ฐ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. Firefox์ .getFragment(), Firefox๋ this.location.href์ ๊ฐ์ ์ธ์ฝ๋ฉํ์ง๋ง ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ์ธ์ฝ๋ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ ๊ฐ์ด ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ router.navigate์ ํธ๋ฆฌ๊ฑฐ ๋งค๊ฐ๋ณ์๊ฐ true ๋๋ false์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด this.loadUrl()์ด checkUrl()์์ ํธ์ถ๋ฉ๋๋ค.
์๋น ์์ (์ฌ์ ํ ์คํธ)์ "getHash()" ๋ฉ์๋์ ๋ฐํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค.
return match ? this.decodeFragment(match[1].replace(pathStripper, '')) : '';
๋ง์ง๋ง ๋ฒ์ ์์ ์ฌ์ ํ ํ์ํ๋ฏ๋ก ๊ฐ์ฌํฉ๋๋ค!
URL์์ ๋นํ์ค ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ รฅรครถ(์ค์จ๋ด ์ํ๋ฒณ์ผ๋ก ๋ ๋ฌธ์)์ ๋๋ค. ์ต์ ๋ฒ์ ์ Chrome ๋ฐ Backbone.
sjmiller85์ ์๋ฃจ์ ์ ์ ์๊ฒ๋ ํจ๊ณผ์ ์ด์์ต๋๋ค. ๋ฌด๋ฆฌ ๊ฐ์ฌ!
@sjmiller85 ์ฌ๊ธฐ์ ์๋ฃจ์
์ ๋ฌด์์ด์์ต๋๊น? 'pathStripper'์ ๋ฌด์์ ์ฌ์ฉํด์ผํ๋์ง ์์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด๊ฒ์ ์ ๊ท์์
๋๊น?
ํธ์ง : ์ด๊ฒ์ ๋ด ์ํฉ์์ ์๋ํฉ๋๋ค. https://github.com/jashkenas/backbone/pull/3955/files ์ฐธ์กฐ
getHash: function (t) {
var e = (t || this).location.href.match(/#(.*)$/);
return e ? e[1] : ""
}
๋ฌธ์์ ๋ฐ๋ฅด๋ฉด @Aggror pathStripper๋ ํด์ URL์ ์ ๊ฑฐํ๊ธฐ ์ํ ์บ์๋ ์ ๊ท์์ ๋๋ค.
// Cached regex for stripping urls of hash.
var pathStripper = /#.*$/;
๋ฐ๋ผ์ ์๋ฃจ์ ๊ณผ ๋์ผํ๋ฉฐ ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ ๋๋ค. :)
๋ผ์ฐํฐ์ ๋์์ ๋์ผํ ํด์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํผํ๊ณ ์ด๊ธฐ ์กฐ๊ฑด์ ๊ด๋ฆฌํ์ญ์์ค. ์ฝ๋๋ฅผ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
(์ด๊ธฐ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด) (๋์์ ๋์ผํ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด)
if ( route.length === 1 || route[routes.length-1] === getHash() ) {
๊ฑฐ์ง์ ๋ฐํํฉ๋๋ค.
}
๋ ๋ค๋ฅธ{
route.push(getHash())
};
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ ๋ด๊ฐ ๋ฐ๊ฒฌํ ๊ฒ์ด ์์ต๋๋ค. Firefox์์ "this.location.href" ๋ณ์๋ฅผ ํ์ธํ๋ฉด ๋ณ์์ ๋ชจ๋ ๊ณต๋ฐฑ์ด %20์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. Chrome(๋ฐ ์๋ง๋ IE)์ ๊ณต๋ฐฑ์ผ๋ก ๋ก๋๋ค. ํ์์ผ๋ก ์ด๋ํ ๋ "checkUrl()"์ด "this.getFragment()"์ ๋ฐํ ๊ฐ๊ณผ "this.fragment"๋ฅผ ๋น๊ตํ์ฌ "this.getFragment()"๋ฅผ ํธ์ถํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ Backbone์ ๋ฌธ์ ์ ๋๋ค. loadUrl()", ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ. this.getFragment()๋ Firefox์ ๊ณต๋ฐฑ(๋๋ ํด๋น ๋ฌธ์ ์ ๋ํ ์ธ์ฝ๋ฉ) ๋์ %20์ ์ฌ์ฉํ์ฌ this.location.href์ ๊ฐ์ ๋ฐํํฉ๋๋ค. this.fragment๋ ๋์ฝ๋ฉ๋ ๋ฑ๊ฐ๋ฌผ์ ๋ฐํํฉ๋๋ค. this.fragment๋ URL์์ encodeURI()๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ฝ๋ฉ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. "navigate()" ํจ์์์ this.fragment๋ ์ ๋ฌ๋๋ URL์์ "this.decodeFragment()"๋ฅผ ํธ์ถํ์ฌ ํ ๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ธ์ฝ๋ฉ์ ๊ฐ์ ํ๋ ค๋ ์๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋ฐ๋ผ์ this.fragment๊ฐ this.decodeFragment()์ ์ฌ์ฉ์ผ๋ก ์ธํด ํญ์ ๋์ฝ๋ฉ๋ URL์ด๊ณ URL์ encodeURI()๊ฐ ๋ณ๊ฒฝํ ๋ฌธ์(์ด ๊ฒฝ์ฐ ๊ณต๋ฐฑ)๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ฐํ๋ ๊ฐ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. Firefox์ .getFragment(), Firefox๋ this.location.href์ ๊ฐ์ ์ธ์ฝ๋ฉํ์ง๋ง ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ์ธ์ฝ๋ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ ๊ฐ์ด ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ router.navigate์ ํธ๋ฆฌ๊ฑฐ ๋งค๊ฐ๋ณ์๊ฐ true ๋๋ false์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด this.loadUrl()์ด checkUrl()์์ ํธ์ถ๋ฉ๋๋ค.
์๋น ์์ (์ฌ์ ํ ์คํธ)์ "getHash()" ๋ฉ์๋์ ๋ฐํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค.
return match ? this.decodeFragment(match[1].replace(pathStripper, '')) : '';