2016-10-16 76 views
3

类型的元素我在DOM图像元素的HTML ID,我想获得的元素作为HTMLImageElement获得通过ID在Scala.js

我知道关于document.querySelector(s"#$imageId"),但是这仅仅返回HTMLElement这是不是很有用,因为我需要访问,例如,图像的src属性。

如何我从DOM的类型元素?要做到这一点

回答

3

的一种方式,是document.querySelector铸就HTMLElement返回,返回Option[Image]

import org.scalajs.dom.document 
import org.scalajs.dom.html.Image 

def getImage(imageId: String): Option[Image] = { 
    val queryResult = document.querySelector(s"#$imageId") 
    queryResult match { 
    case image: Image => Some(image) 
    case other => 
     println(s"Element with ID $imageId is not an image, it's $other") 
     None 
    } 
} 

用法:

val result = getImage("my-image").fold { 
    "Couldn't find image" 
} { image => s"My image URL: ${image.src}" } 

println(result) 

与所有工作的更通用的解决方案种元素(imgdivinput等)是这样的:

import scala.reflect.ClassTag 
import org.scalajs.dom.document 

def getElement[T: ClassTag](elementId: String): Option[T] = { 
    val queryResult = document.querySelector(s"#$elementId") 
    queryResult match { 
    case elem: T => Some(elem) 
    case other => 
     println(s"Element with ID $elementId is $other") 
     None 
    } 
} 

用法:

import org.scalajs.dom.html.Div 

val divResult = getElement[Div]("my-div").fold { 
    "Couldn't find div" 
} { div => s"Div display style: ${div.style.display}" } 

println(divResult) 
+1

你不需要自己做反射魔法。模式匹配可以使用'ClassTag [T]',你所期望的方式('情况ELEM:T =>')。另外,作为关于样式的注释,大多数人在构造Option时使用'Some'和'None'。 'Option.apply'通常用于Java interop(如果参数为null,则返回'None')。 – gzm0

+0

非常感谢gzm0!我相应地编辑了我的答案。 –

+0

我发现它有用延长'org.scalajs.dom.document'能够调用此像'document.getElement [HTMLSelectElement](“一些-ID”)'使用隐式类。 – ngu