Scripting Guy 為您解答問題

Hey, Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

資源

如何指定 HTA 中的定位順序?

Hey, Scripting Guy! Question

嗨,Scripting Guy!如何指定 HTA 中的定位順序?

        -- MJ

Hey, Scripting Guy! Answer

MJ,您好。目前是今年舉辦全球最棒且眾所期待比賽項目的時刻,而且我們知道大部分讀者都渴望瞭解撰寫這個專欄的 Scripting Guy 對於這個比賽有何意見。既然如此,我們就聽聽他的意見吧:他認為,如果您不參加「2007 冬季指令碼比賽 (英文)」,那您就是瘋了。

你在說什麼呀?這和「超級杯足球聯賽」有啥關係?算了,沒關係...我們也只能這麼想。與「2007 冬季指令碼比賽」不同的是,您無法參加「超級杯足球聯賽」。而且,就我們所知,「超級杯足球聯賽」也不會頒發 Dr. Scripto 搖頭玩偶 (英文) 給 250 位幸運的得獎者。

他們竟然敢說「超級杯足球聯賽」是運動界的一大盛事。真是可笑!

無論如何,我們希望您至少參加「指令碼比賽」的其中一個項目。畢竟,這是您可能獲得 Dr. Scripto 搖頭玩偶的唯一方式 (Dr. Scripto 搖頭玩偶目前無法在市面購得,這可不是沒有理由的)。今年度的 VBScript 和 Windows PowerShell 比賽分設進階者與初學者的組別,不論是專家或入門人士都可參加。事實上,如果您在任何一個組別中獲得至少 60 分,就會附有 Scripting Guy 親筆簽名的「優等獎證書」。您知道這種證書多值錢嗎?

好吧,它的價值可能不高。但是,如果您將證書翻面,就可以將背面當做便條紙。

為了比賽做暖身,我們先看看是否能想出如何修改 HTA 中的定位順序。若要這樣做,我們必須先看一下簡單的小型 HTA (其中包含三個文字方塊和一個按鈕):


<html>
<head>
<title>HTA Test</title>
<HTA:APPLICATION 
     ID="objTest" 
     APPLICATIONNAME="HTATest"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
>
</head>

<body>
    Box 1 <input type="text" name="BasicTextbox1" size="30"><P>
    Box 3 <input type="text" name="BasicTextbox3" size="30"><P>
    Box 2 <input type="text" name="BasicTextbox2" size="30" ><P>

    <input id=runbutton type="button" value="Run Script">
</body>


在畫面上,這個簡單的小型 HTA 看起來像這樣:

HTA


根據預設,HTA 中的定位順序是以頁面上各元素的位置為基礎。在這個情況下,假設游標位於 Box 1,其定位順序如下:

  • Box 1

  • Box 3

  • Box 2

  • Run Script 按鈕

大部分情況下,這種順序應該沒有問題。不過,如果您開始使用複雜的多欄配置,可能就會不喜歡預設的定位順序。例如,按下 TAB 鍵可能會導致焦點水平移動,而您偏好讓焦點垂直移動。在範例 HTA 中,我們確實設定了不尋常的案例:為了展示目的,我們將 Box 2 放在 Box 3 底下。理想的情況是,如果我們將游標放置於 Box 1 而且按下 TAB 鍵,以便讓焦點移至 Box 2 而非 Box 3。但是,除了變更配置以外,還有什麼方法呢?

方法如下:


<html>
<head>
<title>HTA Test</title>
<HTA:APPLICATION 
     ID="objTest" 
     APPLICATIONNAME="HTATest"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
>
</head>

<body>
    Box 1 <input type="text" name="BasicTextbox1" size="30" tabIndex=1><P>
    Box 3 <input type="text" name="BasicTextbox3" size="30" tabIndex=3><P>
    Box 2 <input type="text" name="BasicTextbox2" size="30" tabIndex=2><P>

    <input id=runbutton type="button" value="Run Script">
</body>


當然,乍看之下,好像沒有任何改變 (對於 Scripting Guy 而言,這通常是相當安全的假設)。來仔細看看我們的文字方塊標記:


Box 1 <input type="text" name="BasicTextbox1" size="30" tabIndex=1><P>
Box 3 <input type="text" name="BasicTextbox3" size="30" tabIndex=3><P>
Box 2 <input type="text" name="BasicTextbox2" size="30" tabIndex=2><P>


答案就在這裡,MJ。如果我們想要指定特定定位順序,只要將 tabIndex 屬性加入至頁面元素,然後依此為每個元素編號。有了這個修改過的 HTA 之後,當游標位於 Box 1 時,按下 TAB 鍵將會導致焦點跳至 Box 2。再次按下 TAB 將會導致焦點跳回 Box 3。很酷吧?

這實在是個好問題:如果游標位於 Box 3 而且我們按下 TAB 鍵,如此一來發生什麼事?其實,在這種情況下,我們已循環顯示過具有指定 tabIndex 的所有項目。因此,焦點會移至沒有 tabIndex 的第一個項目。在這個範例中,其結果會將焦點移至 Run Script 按鈕。

好吧,這樣做其實有好有壞。畢竟,您可能不想讓使用者能夠定位至按鈕。沒關係,您只要將 tabIndex 屬性加入至按鈕標記,並將 tabIndex 的值設為 -1 即可:


<input id=runbutton type="button" value="Run Script" tabIndex=-1>


這樣做有什麼意義?其意義如下:tabIndex 值為 -1 的項目將從定位順序中排除。

而且,實際上,您可以用程式設計方式來指派和重新指派定位順序。為什麼要這麼做?嗯,也許您設有一個核取方塊;在使用者核取該方塊的情況下,您希望將他們定位至 HTA 的特定區段。如果他們沒有核取該核取方塊,您可能想將他們定位至 HTA 的不同區段。沒關係。下面有一個範例副程式 (將 tabIndex 設為 -1),它會從定位順序中移除某個元素:


Sub TestSub
    BasicTextbox2.tabIndex = -1
End Sub


若要讓元素返回定位順序,只要指派新值給 tabIndex 即可。這個方式的優點在於您可以變更某個元素的 tabIndex 屬性,而不需要重新設定所有其他元素的索引。例如,假設您有 tabIndex 值為 1、2、3、4 和 5 的項目。然後,您執行了一段指令碼,將項目 3 的 tabIndex 設為 -1。實際上,這樣做會將該項目從定位順序中移除,然後留下 tabIndex 1、2、4 和 5。這樣會發生任何問題嗎?當然不會。如果游標位於項目 2,您按下 TAB 鍵後,它只會正確地將焦點移至項目 4。項目 3 不存在的事實不會有任何影響。

附註:基於上述原因,您可能會將項目編號為 10、20 和 30,而非 1、2 和 3。這樣您就可以輕易地插入新項目 (例如 25),而不需要重新設定每個項目的索引。


當然,您可以使用 Window_OnLoad 副程式,並呼叫 Focus 方法來啟動 HTA,並將焦點放在特定元素上:


Sub Window_OnLoad
   BasicTextbox1.Focus
End Sub


很好。

偷偷告訴您,撰寫這篇專欄的 Scripting Guy 事實上看「超級杯足球聯賽」。事實上,他每場「超級杯足球聯賽」都有看。不過,他不認為「超級杯足球聯賽」是全世界最棒且最令人興奮的運動盛事。這個殊榮還是保留給「三月瘋」(March Madness,NCAA 大學籃球聯賽)。他認為沒有其他的運動比賽能和 NCAA 籃球聯賽所帶來的刺激相提並論。

你在說什麼啊?你是說「世界杯足球賽」嗎?不對,我們說的是最棒且最令人興奮的運動盛事。足球跟體育比賽有啥關係?

附註:事實上,這是您的個人抉擇,但是您實在沒有必要寄送充滿憤怒字眼的電子郵件給撰寫本專欄的 Scripting Guy。畢竟,如果他現在不喜歡足球,他以後也不會喜歡。但是,足球迷們,請不要難過:反正他也不喜歡曲棍球、拳擊、賽車、NBA 或體操。

沒錯,我們還可以繼續列舉其他的例子呢。但是,基於對讀者的禮貌,我們想還是算了。


顯示: