2016-11-09 10 views
3

私はscalajsを試していますが、org.scalajs.dom.htmlパッケージを使用してDOM要素にアクセスする方法についてはかなり混乱しています。 試行錯誤の結果、私はいくつかの要素がasInstanceOfを使用して特定の型にキャストされる必要があることを発見しましたが、いくつかはそうではありません。いつどこでasInstanceOfを使用する必要があるのか​​に関する一般的なルールはありますか?asInstanceOfをいつ使用しますか?

例えば、のinputという要素があるとします。

val content = document.getElementById("myinput").asInstanceOf[html.Input].value 

しかし、それは時間がでcontentを表示するために来るとき、私は上asInstanceOfを使用しなかったとき、私のID contentdivdiv、コンパイラは文句なかった:私はasInstanceOfを使用する必要がある入力の値にアクセスするためには、 div要素:

val mydiv = document.getElementById("contentdiv") 
mydiv.innerHTML = content 

はまた、ボーナスとして実際のHTML要素にすべての可能なasInstanceOf引数とそれらのマッピングを見つけるための中心的な場所がありますか?あなたはDOMElement背中を取得し、あなたがそれを実行できるだけの操作がinnerHTMLあるgetElementById呼び出すたび

答えて

3

getElementByIdの署名が

def getElementById(id: String): DOMElement 

DOMElementであるが、そう

trait DOMElement extends js.Object { 
    var innerHTML: String = js.native 

    def appendChild(child: DOMElement): Unit = js.native 
} 

として定義されますおよびappendChild

これは、あなたの最後の例が明示的なキャストなしで機能する理由です。

しかし、DOMElementは非常に一般的なタイプです。時々あなたはを知っていますgetElementByIdは - <input>要素を返すことを知っています。

それで、asInstanceOfを使用して、この余分な知識についてコンパイラに知らせることができます。言うまでもなく

document.getElementById("myinput").asInstanceOf[html.Input].value 
            ^
             | 
      hey compiler, I KNOW this is going to be an html.Input, 
      please let me do my things and explode otherwise. 

、あなたはasInstanceOfを使用するときに注意する必要があります。あなたが間違っている場合、コンパイラは今度はランタイムクラッシュからあなたを救うことができません。あなたの質問の後半部分に答えるために

+0

興味深い。 innerHTMLとappendChildについて特別なのは、他の人が含まれていない場所に含まれているということですか?これらの2つは、DOM要素の世界のプロトタイプチェーンで最も一般的なメソッドの可能なセットですか? – thetrystero

+0

いいえ、他にもたくさんあります:https://github.com/scala-js/scala-js-dom/blob/master/src/main/scala/org/scalajs/dom/raw/Html.scala #L3736ここでの答えは、答えを簡潔にするためにいくつか述べました。 – sjrd

+0

@sjrdがチンミングしてくれてありがとうございます。簡単な質問ですが、ライブラリに実際のDOMElement定義が見つかりませんでした(私が投稿したものは、リバーシの例です)。私は何が欠けていますか? –

1

は、実際のHTML要素にすべての可能なasInstanceOf引数とそれらのマッピングを見つけるための中心的な場所はありますか?

「extend HTMLElement」はHtml.scalaで検索できます。

関連する問題