2016-09-05 4 views

답변

3

@ gurghet의 답은 IMO가 가장 관용적 인 버전인데, JavaScript의 숙어를 Scala.js에 채택하는 것입니다. 어쨌든 JavaScript의 동적 인 특성을 이용하고 있기 때문에 이에 대해 명시 적으로 표현할 수도 있습니다. js.Dynamic으로 할 수 있습니다.

import scala.scalajs.js 
import js.Dynamic.{global => g} 

def scrollPosition: Double = { 
    import js.DynamicImplicits._ // to "write JavaScript" 
    val pos = g.window.pageYOffset || g.document.documentElement.scrollTop || g.document.body.scrollTop || 0 
    pos.asInstanceOf[Double] 
} 
+0

감사합니다. 'js.DynamicImplicits'는 빠진 조각이었습니다! – netzwerg

+0

비록이 유연성이 좋지만이 코드는 위험하지 않습니까? 극단적 인 경우 런타임 예외가 발생할 수있는 Javascript에서 평범한 가치를 얻는다는 의미입니다. – pietro909

+0

@ pietro909 글쎄, 궁극적으로 * 항상 * 당신이 자바 스크립트에서 어떤 종류의 가치를 가져올 때 무엇을하는지. 귀하의 주장에 따르면 JavaScript 라이브러리 호출은 안전하지 않으므로 금지되어야합니다. – sjrd

1

나는 당신이 이것에 대한 일반적인 스칼라에서 생각하는 것이 더 좋다고 생각합니다.

특히, 부울에 0의 캐스트를 사용하는 경우이 방법은 그다지 좋지 않지만 암시 적 캐스팅을 가능한 한 드물게 사용하고 바람직하지 않은 경우 의미를 변경하지 않기 때문에 바람직하지 않습니다. 유형.

나는 그것을 훨씬 더 표현이 일치하는 케이스를 사용하거나 중간 단계에 의미를 부여하여 만들 수있는보다 표현 방법으로

var scrollPosition = 
    if (window.pageYoffset > 0) { 
    window.pageYoffset 
    } else if (document.documentElement.scrollTop > 0) { 
    document.documentElement.scrollTop 
    } else if (document.body.scrollTop > 0) { 
    document.body.scrollTop 
    } else { 
    0 
    } 

를 과제를 다시 작성합니다.

+0

나는 보수적 인 접근 방식을 선호하지만, 매우 자세하고 추악합니다. – pietro909

+0

당신은 그 이유를 아는 것보다는 덜 추악하고 * 표현력을 향상시킬 수 있습니다. 문맥에 따라 다르지만, 내가 쓴 것은 맨손이다. – gurghet