[javascript] iOS에서 Phonegap을 사용하여 방향 변경을 올바르게 감지하려면 어떻게합니까?

JQTouch 참조 자료를 찾고있는이 오리엔테이션 테스트 코드를 아래에서 찾았습니다. 이것은 모바일 Safari의 iOS 시뮬레이터에서는 올바르게 작동하지만 Phonegap에서는 올바르게 처리되지 않습니다. 내 프로젝트 가이 테스트 페이지를 죽이는 것과 동일한 문제가 발생했습니다. Phonegap에서 JavaScript를 사용하여 방향 변경을 감지하는 방법이 있습니까?

window.onorientationchange = function() {
  /*window.orientation returns a value that indicates whether iPhone is in portrait mode, landscape mode with the screen turned to the
    left, or landscape mode with the screen turned to the right. */
  var orientation = window.orientation;
  switch (orientation) {
    case 0:
      /* If in portrait mode, sets the body's class attribute to portrait. Consequently, all style definitions matching the body[class="portrait"] declaration
         in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
      document.body.setAttribute("class", "portrait");

      /* Add a descriptive message on "Handling iPhone or iPod touch Orientation Events"  */
      document.getElementById("currentOrientation").innerHTML = "Now in portrait orientation (Home button on the bottom).";
      break;

    case 90:
      /* If in landscape mode with the screen turned to the left, sets the body's class attribute to landscapeLeft. In this case, all style definitions matching the
         body[class="landscapeLeft"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
      document.body.setAttribute("class", "landscape");

      document.getElementById("currentOrientation").innerHTML = "Now in landscape orientation and turned to the left (Home button to the right).";
      break;

    case -90:
      /* If in landscape mode with the screen turned to the right, sets the body's class attribute to landscapeRight. Here, all style definitions matching the
         body[class="landscapeRight"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
      document.body.setAttribute("class", "landscape");

      document.getElementById("currentOrientation").innerHTML = "Now in landscape orientation and turned to the right (Home button to the left).";
      break;
  }
}



답변

이것이 제가하는 것입니다:

function doOnOrientationChange() {
    switch(window.orientation) {
      case -90: case 90:
        alert('landscape');
        break;
      default:
        alert('portrait');
        break;
    }
}

window.addEventListener('orientationchange', doOnOrientationChange);

// Initial execution if needed
doOnOrientationChange();


2019 년 5 월 업데이트 : window.orientation 는 더 이상 사용되지 않으며 MDN에 따라 대부분의 브라우저에서 지원되지 않습니다 . orientationchange이벤트입니다 window.orientation과 관련된 때문에 아마 사용하지 않아야합니다.


답변

나는 window.onresize = function(){ checkOrientation(); }
checkOrientation에서 window.orientation 또는 body widthChecking을 사용할 수 있지만 아이디어는 “window.onresize”는 적어도 내가 가지고있는 모바일 및 데스크탑 브라우저의 대부분에서 가장 크로스 브라우저 방법입니다. 시험 기회.


답변

if (window.matchMedia("(orientation: portrait)").matches) {
   // you're in PORTRAIT mode
}

if (window.matchMedia("(orientation: landscape)").matches) {
  // you're in LANDSCAPE mode
}


답변

나는 iOS와 Phonegap을 처음 접했지만 eventListener를 추가하여이를 수행 할 수있었습니다. 나는 당신이 참조 한 예제를 사용하여 같은 일을했고, 그것을 작동시키지 못했습니다. 그러나 이것은 트릭을 수행하는 것처럼 보였습니다.

// Event listener to determine change (horizontal/portrait)
window.addEventListener("orientationchange", updateOrientation);

function updateOrientation(e) {
switch (e.orientation)
{
    case 0:
        // Do your thing
        break;

    case -90:
        // Do your thing
        break;

    case 90:
        // Do your thing
        break;

    default:
        break;
    }
}

PhoneGap Google 그룹 에서 ‘동향’이라는 용어를 검색하면 운이 좋을 수 있습니다 .

오리엔테이션을 감지하는 방법에 대한 예제로 읽은 예는 Pie Guy : ( game , js file )입니다. 게시 한 코드와 비슷하지만 당신처럼 … 나는 그것을 작동시킬 수 없었습니다.

한 가지주의 사항 : eventListener가 나를 위해 일했지만 이것이 지나치게 집중적 인 접근인지 확실하지 않습니다. 지금까지 그것은 나를 위해 일한 유일한 방법 이었지만 더 좋고 능률적 인 방법이 있는지 모르겠습니다.


업데이트 는 위의 코드를 수정하여 이제 작동합니다.


답변

orientationchange이벤트로 작업하는 동안 페이지에서 요소의 정확한 크기를 얻으려면 시간 초과가 필요했지만 matchMedia는 정상적으로 작동했습니다. 내 최종 코드 :

var matchMedia = window.msMatchMedia || window.MozMatchMedia || window.WebkitMatchMedia || window.matchMedia;

if (typeof(matchMedia) !== 'undefined') {
  // use matchMedia function to detect orientationchange
  window.matchMedia('(orientation: portrait)').addListener(function() {
    // your code ...
  });
} else {
  // use orientationchange event with timeout (fires to early)
  $(window).on('orientationchange', function() {
    window.setTimeout(function() {
      // your code ...
    }, 300)
  });
}


답변

정답이 이미 게시되어 승인되었지만 본인이 직접 경험 한 문제가 있으며 다른 사람들이 여기에 언급 한 문제가 있습니다.

특정 플랫폼에서 창 크기 ( window.innerWidth, window.innerHeight) 및 속성과 같은 다양한 속성 window.orientation은 이벤트 "orientationchange"가 시작된 시간까지 업데이트되지 않습니다 . 여러 번이 속성 window.orientationundefined발사 후 몇 밀리 초 동안 지속됩니다 "orientationchange"(적어도 iOS의 Chrome에 있음).

이 문제를 처리하는 가장 좋은 방법은 다음과 같습니다.

var handleOrientationChange = (function() {
    var struct = function(){
        struct.parse();
    };
    struct.showPortraitView = function(){
        alert("Portrait Orientation: " + window.orientation);
    };
    struct.showLandscapeView = function(){
        alert("Landscape Orientation: " + window.orientation);
    };
    struct.parse = function(){
        switch(window.orientation){
            case 0:
                    //Portrait Orientation
                    this.showPortraitView();
                break;
            default:
                    //Landscape Orientation
                    if(!parseInt(window.orientation)
                    || window.orientation === this.lastOrientation)
                        setTimeout(this, 10);
                    else
                    {
                        this.lastOrientation = window.orientation;
                        this.showLandscapeView();
                    }
                break;
        }
    };
    struct.lastOrientation = window.orientation;
    return struct;
})();
window.addEventListener("orientationchange", handleOrientationChange, false);

방향이 정의되어 있지 않은지 또는 방향이 마지막으로 감지 된 방향과 같은지 확인하고 있습니다. 어느 쪽이든 참이면 10 밀리 초 기다린 다음 방향을 다시 구문 분석합니다. 방향이 적절한 값이면 showXOrientation함수를 호출합니다 . 방향이 유효하지 않으면 확인 기능을 계속 반복하여 유효 할 때까지 매번 10 밀리 초 동안 기다립니다.

이제는 평소처럼 JSFiddle을 만들 것입니다.하지만 JSFiddle은 저에게 효과적이지 않으며 다른 사람이 같은 문제를보고하지 않으므로 지원 버그가 마감되었습니다. 다른 사람이 이것을 JSFiddle로 바꾸고 싶다면 계속하십시오.

감사! 이게 도움이 되길 바란다!


답변

여기 내가 한 일이 있습니다.

window.addEventListener('orientationchange', doOnOrientationChange);

function doOnOrientationChange()
{
      if (screen.height > screen.width) {
         console.log('portrait');
      } else {
         console.log('landscape');
      }
}