2012-07-17 2 views
4

쿼리 모바일을 사용하여 기존 사이트의 모바일 버전을 만들고 있습니다. 이 사이트는 www 버전에 잘 작동하는 확립 된 마크 업과 함께 수백 페이지가 넘습니다. 문제는 #useername 또는 #map 또는 #photo와 같은 모든 페이지에 동일한 요소 ID의 인스턴스가 많다는 것입니다. 이것은 각 페이지가 독립적으로로드되므로 충돌이 없으므로 www에서 잘됩니다. JQM에서는 모든 페이지가 어떻게 든 캐시되고 코드가 이전 페이지를 참조하는 것처럼 보입니다. 예를 들어 :Jquery Mobile을 사용하여 사이트의 다른 페이지에서 동일한 ID와 충돌합니다.

Page1.html

<div id="commonIdOnEveryPage">Page 1</div> 
<a href="page2.html">Link</a> 
<script> 
alert($("#commonIdOnEveryPage").html()); 
</script> 

Page2.html

<div id="commonIdOnEveryPage">Page 2</div> 
<script> 
alert($("#commonIdOnEveryPage").html()); 
</script> 

2 페이지로 이동하기 1 페이지에서 링크를 클릭하면, 경고는 여전히 "페이지 1"을 보여줍니다.

이 예에서는 두 번째 페이지의 id를 쉽게 변경할 수 있지만 실제 사이트에서는 동일한 ID가 사용되고 JS가 수천 줄의 linea 길이 인 다른 페이지에 수백 개의 위치가 있습니다. 확실히 JQM을 이와 호환되도록 만드는 방법이 있습니다.

+1

문제는 2 개 이상의 페이지가 JQuery와 모바일의 DOM에 동시에 존재한다. 공통 ID를 사용하지 말고 클래스를 만들고이를 활성 페이지에서 선택하십시오. –

+0

불행히도, 모든 ID를 변경하는 것보다 jqm을 사용하지 않는 것이 더 좋은 해결책입니다. 이것은 완벽하게 작동하는 복잡한 기존 사이트입니다. 또한 profile.php? id = 1과 같은 동적 페이지에는 #screenname이 있고 profile.php? id = 2에 대한 링크는 #screenname도있는 ID가 있습니다. –

+0

이를 염두에두고 해결책을 찾아보십시오 : –

답변

2

캐시에서 이전 페이지를 제거하지만 뒤로 버튼과 전환을 유지하는 것으로 보이는이 코드를 발견했습니다.

$('div').live('pagehide', function(event, ui) { 
    $(event.target).remove(); 
}); 
2

대신 공통 클래스를 사용하십시오. jQuery Mobile은 한 번에 DOM에 둘 이상의 페이지를 가지고있어서 "고유 한"ID가 고유하지 않습니다.

$(".ui-page-active .commonclass").html() 

편집 : 아이디의 고유 할 수없는 경우

는 차선책은 다음과 같습니다 당신은 JQM의 페이지를 탐색 할 때

$(".ui-page-active div[id=commonid]").html() 
+0

이 방법이 효과적 일 수 있지만 모든 ID를 클래스에 연결하는 것은 큰 작업입니다. .ui-active-page가없는 www 사이트에서도 작동되도록해야합니다. –

1

By default이 프레임 워크의 내용을로드 페이지를 ajax를 통해 호출하여 DOM에 연결하므로 페이지 당 여러 개의 ID로 끝납니다. 또한 link to a page을 사용하여 정상적으로 페이지를로드합니다. http 'rel = "external"or data-ajax = "false"`문제를 해결해야한다고 생각하면 적절한 js 파일이 있는지 확인해야합니다. 각 페이지의 머리에서 연결해.

+0

data-ajax = false가 작동하고 아마도 가장 빠른 해결책 일 것입니다. 불행히도 뒤로 버튼과 페이지 전환로드 애니메이션이 손실됩니다. –

+0

나는 뒤로 버튼을 잃어 버릴 것이라고 생각하지 않는다. (나는 내 ​​컴퓨터에서 그것을 테스트했고 작동한다.) 전환에 관해서는 JQM 문서에서 페이지 전환없이 페이지를로드하므로 주위에 어떤 방법이 있는지 알 수 없다고 말합니다. – Jack

0

겠습니까 사용 :

$(document).ready(function(){ 
    alert('#commonIdOnEveryPage'); 
}); 

수정을?

+0

여전히 동일하지만 항상 첫 페이지를 보여줍니다. –

2

톰 킨케이드의 답변은 프로 팁입니다.

단지에 조금 그것을 청소 : 1) 캐시에서 모든 사업부를 제거하는 오버 헤드를 줄이고, 2)

$(document).on('pagehide', '.ui-page', function(event, ui) { 
    $(event.target).remove(); 
}); 

이제 새로운 JQuery와 규칙으로 최신으로 가져 캐시는 제거되고 이전 페이지 및 뒤로 버튼 기능이 유지됩니다.

0

시간을 기준으로 고유 한 문자열을 만들고 모든 ID에 추가합니다.이어서 HTML 출력의

// unique string for use in DOM ids 
$unique = str_replace(array(' ', '.') ,'_', microtime()); 

:

<div id="commonIdOnEveryPage<?php echo $unique; ?>">Page 2</div> 
<script> 
alert($("#commonIdOnEveryPage<?php echo $unique; ?>").html()); 
</script> 
관련 문제