2011-04-13 6 views
12

분할 및 구문 분석 window.location.hash에 문제가 있습니다. 모든분할 및 구문 분석 window.location.hash

첫째, 우리는 해시에서 몇 가지 매개 변수, 예를 얻을 : 당신은 분명히이 검색에 생성 된 것보다시피

#loc=austria&mr=1&min=10&max=89 

. 사용자가 페이지 매김 링크를 클릭하면 페이지가 해시로 다시로드됩니다. 여태까지는 그런대로 잘됐다.

if (window.location.hash) { 
    var params = (window.location.hash.substr(1)).split("&"); 

    for (i = 0; i < params.length; i++) 
    { 
     var a = params[i].split("="); 
     // Now every parameter from the hash is beind handled this way 
     if (a[0] == "loc") 
     { 
      locationList(a[1]); 
     } 
    } 
} 

Everythig 거의 내가 선택하면 모든 검색 PARAMS 해시 ... 절단되고 있습니다 ... 노력하고 있습니다 :

나는 해시 URL에있을 때마다 호출되는 함수 초기화()를 만들었습니다. 알 수없는 이유로. 행운없이 a[0] == "loc" 대신 if(params.indexOf('loc'))을 사용하려고했습니다.

나에게 손을 빌려 주실 수 있습니까? 내가 VAR a를 사용했다 물론

편집
= ... 루프에서, 그것은 단지 복사 - 붙여 넣기를 오류였다.

+0

* 나는 모든 검색 PARAMS 해시 ... 절단되고있는 선택 * 해시 내에서 사용할 수있는

params.access_token //access_token params.id //id 

및 기타 PARAMS를 사용할 수 있습니다. 나는이 문장을 이해하지 못한다 ... –

+0

페이지를 다시 읽은 후에이'# loc = austria & mr = 1 & min = 10 & max = 89'와 같은 해시를 가질 때'# loc = austria & mr = 1'이된다. – user948438237

+0

'if (params [i] .indexOf ('loc'))'?? –

답변

25

너가하는 해시의 값이 loc 인 경우 루프가 필요하지 않습니다. 이것은 또한 작동해야합니다.

var lochash = location.hash.substr(1), 
    mylocation = lochash.substr(lochash.indexOf('loc=')) 
        .split('&')[0] 
        .split('=')[1]; 
if (mylocation) { 
    locationList(myLocation); 
} 

페이지를 다시로드 한 후 해쉬를 trunctating하는 것에 대해 : imho는 루프와 관련이 없습니다.

편집보다 현대적이고보다 정확한 방법 :

const result = document.querySelector("#result"); 
 
const hash2Obj = "loc=austria&mr=1&min=10&max=89" 
 
     .split("&") 
 
     .map(el => el.split("=")) 
 
     .reduce((pre, cur) => { pre[cur[0]] = cur[1]; return pre; }, {}); 
 

 
result.textContent += `loc => ${hash2Obj.loc} 
 
---- 
 
*hash2Obj (stringified): 
 
${JSON.stringify(hash2Obj, null, ' ')}`;
<pre id="result"></pre>

+0

당신이 옳습니다. 이제 논리적 인 오류 (해시가 존재하는 경우에도 buildRequestHash() 함수를 호출 함)가 있음을 알았습니다. 감사. – user948438237

+0

기술적으로, 값 문자열에서 이스케이프 처리되지 않은 '='가 사용되면 사소한 버그가 생깁니다. "# key1 = foo = bar, alloc = true & loc = ..."의 경우를 생각해보십시오. 거대한 거래는 아니고, 내가 부딪친 것입니다. 건배! –

+0

또한'# bloc = thing'과 일치합니다 – Hugo

0

params.indexOf('loc')은 이 params 배열 내에 존재하지 않으므로 값을 반환하지 않습니다. 제공된 예제에서 찾고있는 항목은 loc=austria입니다. 키로 만 선택하는 경우 각 키 - 값 쌍을 검사하기 위해 루핑이 필요합니다.

1

당신이 jQuery를 사용하는 경우, 그것은 "는 HTML5의 hashchange 이벤트를 활용 jQuery BBQ plugin

체크 아웃 ", 기본적으로 해시가 변경된 후에는 JavaScript 코드를 실행할 수 있습니다.

강력한 "depram"기능을 제공합니다.이 기능을 사용하면 "URL 또는 현재 window.location의 쿼리 문자열을 구문 분석하고이를 개체로 역 직렬화하여 선택적으로 숫자, 부울, null 및 undefined를 강제 변환 할 수 있습니다 가치. "

2

위치에서 읽는 것이 더 쉬운 방법이어야합니다.해시 :

var hash = window.location.hash.substring(1); 
    var params = {} 
    hash.split('&').map(hk => { 
     let temp = hk.split('='); 
     params[temp[0]] = temp[1] 
    }); 
    console.log(params); //Here are the params to use 

다음, 당신은