天天看點

#夏日挑戰賽# OpenHarmony基于JS對某位dom元素的刺探(中)前言對于openHarmony的dom元素有沒有疑惑過?後續

本文正在參加星光計劃3.0–夏日挑戰賽

前言

在上回,我們跟dom事件觸發所傳回的響應對象有了一次初步的交流,也初步了解到這小夥子一些相關的資訊,相信未來我們能多多交流,争取早日帶回家,回顧上文連結 -> OpenHarmony基于JS對某位dom元素的刺探(上)

對于openHarmony的dom元素有沒有疑惑過?

那麼我們先從如何擷取到ta開始

要想得到ta的人,先知道ta家,再從家長開始

在JS開發中,官方給我們提供以下的方法

其中

$element

$rootElement

是擷取dom的方法,擷取dom還有一個

$refs

$root

$parent

$child

是擷取vm執行個體(ps:個人覺得不推薦實際開發使用,太危險!!)

那麼接下來,我們就開始挨個刺探ta相關的情況,争取早日抱回家 o->_<-O

我們測試的界面結構是以下圖

擷取dom元素

$element 參數 id :string

通過id來擷取元素,當id為空時,預設擷取根元件,這個根元件是目前頁面的根元件,并非整個app的根元件

那麼我們在test3元件界面測試,我們給根元件一個

id =test3Root

,友善接下來辨識

<div class="container" id="test3Root">
    <div id="test3" > 
        <text>測試test3</text>
    </div>
    <text class="title">
        我是test3界面元件,test2的子元件
    </text>
</div>
           
export default {
    {...},
    onLayoutReady(){
        console.log('onLayoutReady')
        console.log( this.$element().attr.id) //擷取根元件,輸出id
        console.log(this.$element('test3Root').attr.id)//擷取id為'test3Root'的元件,輸入id
        console.log(this.$element('test3').attr.id) //輸出test3的id
    } 
}
           

我們得到一下輸出結果,都很正常

就這樣完了?怎麼可能,給ta安排下其他元件的id試試,看能不能擷取得到,看是不是全局的

export default { //目前是在test3界面的元件
    {...},
    onLayoutReady(){
        console.log('onLayoutReady')
        console.log( this.$element().attr.id) 
        console.log(this.$element('test3Root').attr.id)
        console.log(this.$element('test3').attr.id)
	console.log(this.$element('e')) //在test2界面,我們設定了一個元素的id為e
    } 
}
           

結果如下圖,擷取id為e的dom元素為undefined,也就是說

$elment

擷取dom元素是隻能擷取目前頁面的dom元素

#夏日挑戰賽# OpenHarmony基于JS對某位dom元素的刺探(中)前言對于openHarmony的dom元素有沒有疑惑過?後續

$rootElemnt 無參數

$rootElemnt()

可以擷取目前頁面元件的根元件,和

$elemnt()

無參數的效果一樣,

也就是說在同一個頁面元件下

this.$rootElment() == this.$elment()

->_O 光說有什麼用 (雷某:拿貨來賣啊!)

好,來貨,還是拿上面的test3元件界面,hml代碼同上,

export default { //目前是在test3界面的元件
    {...},
    onLayoutReady(){
        console.log('onLayoutReady')    //test3Root 是test3界面根元件的id
        console.log(this.$rootElement() === this.$element('test3Root')) 
        console.log(this.$rootElement() === this.$element())
    } 
}
           
#夏日挑戰賽# OpenHarmony基于JS對某位dom元素的刺探(中)前言對于openHarmony的dom元素有沒有疑惑過?後續

從上的結果中可以看出

this.$rootElement()

等價于

this.$element()

兩個效果一樣,一個字元長,一個字元短,知道該用誰了吧。 手動滑稽).jpg

$refs

$refs

也是擷取dom的一種方法,具體用法需在需要擷取的dom元素的标簽上添加ref = "xxx"

xxx是自己定義的值,然後再通過

this.$refs["xxx"]

this.$refs.xxx

使用

下面我們在test2元件界面測試

test3是自定義元件,從外部導進來的,在test3上我們添加了一個

ref="test3"

,同時也添加了一個

id="ww"

在test2元件界面,我們在一個div上添加了

ref="test2"

<element src="../index/test3/test3.hml" name="test3" > </element>
<div class="container" @click="dd" id="gg"  >
    <!-- 這裡 ↓ -->
    <div   ref="test2"  id="e" style="height: 222px; height:300px ; 
     background-color: aqua;"  @click="c">
        <!-- 這裡 ↓ -->
        <test3 ref="test3" id="ww">
        </test3>
      <text class="title" >
            test2 我是test2,test1的子元件
        </text>
    </div>
</div>
           
export default { //目前是在test2
    {...},
    onLayoutReady(){
        console.log('test2界面')    
        console.log(this.$refs['test2'].attr.ref)
        console.log(this.$refs.test2.attr.ref)
        console.log(this.$refs['test3'])
        console.log( JSON.stringify(this.$element('ww').attr) )
    } 
}
           
#夏日挑戰賽# OpenHarmony基于JS對某位dom元素的刺探(中)前言對于openHarmony的dom元素有沒有疑惑過?後續

從上面的結果中,我們可以分析出來,

$ref["xxx"]

$ref.xxx

都是可行的,但是,自定義元件不能通過

$refs

來擷取dom,但是可以通過

$elemnt

添加id後擷取到自定義元件的dom,而且在引入的自定義元件中的

attr

中是沒有

ref

的。

後續

嗷嗷嗷,終于到這個環節了,一開始寫dom系列我以為兩篇應該就能搞定,但後面随着我翻文檔測試後,我低估了,而且在這期間遇到一個比較好玩的東西,就是上面我說危險的那幾個方法,我發現我測試後,決定要為他們單獨開一篇,如果和這個擷取dom一起寫的話,可能沒多少人看,畢竟寫完後,文章應該很長,看到都懶得看了,下一篇,順便用這方法解決一下,遇到的一個冒泡阻塞失效的問題