diff options
author | Florian Merz <me@fiji-flo.de> | 2021-02-11 13:12:08 +0100 |
---|---|---|
committer | Florian Merz <me@fiji-flo.de> | 2021-02-11 13:12:08 +0100 |
commit | 43a5cac2eff22c21071800e13bef12af9d3a37d0 (patch) | |
tree | f6e91f8aa958f15bd0b0aabf7b8dfc09063eceda /files/zh-tw/orphaned | |
parent | 8260a606c143e6b55a467edf017a56bdcd6cba7e (diff) | |
download | translated-content-43a5cac2eff22c21071800e13bef12af9d3a37d0.tar.gz translated-content-43a5cac2eff22c21071800e13bef12af9d3a37d0.tar.bz2 translated-content-43a5cac2eff22c21071800e13bef12af9d3a37d0.zip |
unslug zh-tw: move
Diffstat (limited to 'files/zh-tw/orphaned')
69 files changed, 4486 insertions, 0 deletions
diff --git a/files/zh-tw/orphaned/core_javascript_1.5_正規表達式的建立/index.html b/files/zh-tw/orphaned/core_javascript_1.5_正規表達式的建立/index.html new file mode 100644 index 0000000000..c7fe61614d --- /dev/null +++ b/files/zh-tw/orphaned/core_javascript_1.5_正規表達式的建立/index.html @@ -0,0 +1,9 @@ +--- +title: Core JavaScript 1.5 正規表達式的建立 +slug: Core_JavaScript_1.5_正規表達式的建立 +--- +<p> </p> + +<p>This page was auto-generated because a user created a sub-page to this page.</p> + +<p> </p> diff --git a/files/zh-tw/orphaned/cross-site_xmlhttprequest/index.html b/files/zh-tw/orphaned/cross-site_xmlhttprequest/index.html new file mode 100644 index 0000000000..9ffdd6ca6e --- /dev/null +++ b/files/zh-tw/orphaned/cross-site_xmlhttprequest/index.html @@ -0,0 +1,108 @@ +--- +title: Cross-site XMLHttpRequest +slug: Cross-site_XMLHttpRequest +--- +<p>Firefox 3 支援了 <a class="external" href="http://www.w3.org/TR/access-control/">W3C Access Control</a> working draft,這讓你可以對其他網站作 XMLHttpRequests 以取得其他網站的資料,並加以管理,在自己建立的網站中,混入來自多個其他網站的內容。 </p> +<h3 id="Firefox_3_.E6.94.AF.E6.8F.B4_Cross-site_XMLHttpRequest"> Firefox 3 支援 Cross-site XMLHttpRequest </h3> +<h4 id=".E6.A6.82.E8.A7.80"> 概觀 </h4> +<p>W3C 存取控制(<a class="external" href="http://www.w3.org/TR/access-control/">The W3C Access Control</a>)的架構讓客戶端文件對於誰可以、誰不可以向它們發出「以瀏覽器為基礎的 request」(例如 XMLHttpRequest)有更好的控制。 +</p><p>除此之外,這個 access control scheme 讓網路應用程式擁有允許「跨站要求(cross-site request)」的能力。理論上,這讓你在部署好存取控制點(Access Control Point)後,可以由 yoursite.com 的一個頁面透過 XMLHttpRequest 向 google.com 要求一份文件。這個層級的控制,讓管理網站內容的人員在決定是否「讓他們的使用者建立混合不同網站內容的網頁(mashup)或網站應用程式」時更有彈性。 +</p> +<h3 id=".E7.94.A8.E6.B3.95"> 用法 </h3> +<p>在 Firefox 3,要使用 W3C 存取控制(W3C Access Controls)有兩個方法。第一個是透過「加入新的存取控制檔頭」(在任何 Resouece Type 都能運用此方式,但你對網站伺服器必須有較高的控制權),另一個是透過「存取控制處理指示」(The Access-control Processing Instruction)(僅能用於 XML 文件)。 +</p> +<h4 id=".E5.AD.98.E5.8F.96.E6.8E.A7.E5.88.B6.E6.AA.94.E9.A0.AD.EF.BC.88Access-Control_Headers.EF.BC.89"> 存取控制檔頭(Access-Control Headers) </h4> +<p>這是在允許跨站的 XMLHttpRequests 時最有彈性的作法。如果你在你的 Request Response 中加入額外的存取控制檔頭,像下面這樣,你就可以給予 mozilla.org 上的任何網路應用程式擁有存取的權限。 +</p> +<pre>Access-Control: allow <mozilla.org></pre> +<p>存取控制檔頭讓你有能力可以依據來源、要求方式(request method)來決定是否給予、或拒絕別人存取特定資源。 +</p><p>例如,下面這些都是有效的存取控制檔頭: +</p> +<pre> // 任何人都可以存取這項資源 - 沒有限制 + Access-Control: allow <*> + + // 任何人都不可以存取這項資源 - 沒有例外 + Access-Control: deny <*> + + // 只有在 'mozilla.org' 上面的網站可以存取這項資源 + // (這也包含了 sub-domains) + Access-Control: allow <mozilla.org> + + // 除了 developer.mozilla.org 以外,其他所有 mozilla.org 的 sub-domain 都可以存取這項資源 + Access-Control: allow <mozilla.org> exclude <developer.mozilla.org> + + // 只有這個 domain、在這個 port、運用此方式的 request 可以存取這項資源 + Access-Control: allow <developer.mozilla.org:80> method GET, POST +</pre> +<p>在 <a class="external" href="http://www.w3.org/TR/access-control/#access-control0">W3C Access Control working draft</a> 有更多例子可看。 +</p> +<h5 id=".E4.BE.8B.E5.AD.90"> 例子 </h5> +<h4 id="XML_Processing_Instruction"> XML Processing Instruction </h4> +<p>XML 有「include 額外命令讓 XML processor 針對它特別處理」的能力。The Access Control draft 就是利用這種特性指定了一種額外的命令,讓 XML 文件變成可以在遠端被跨站存取。 +</p><p>例如: 使用下列存取控制處理指示 (access-control processing instruction)會給 mozilla.org 上的任何網站有存取 XML 文件的能力: +</p> +<pre> <?access-control allow="mozilla.org"?> +</pre> +<p>這裡有一些使用存取控制處理指示(access-control processing instruction)來給予 XML 文件存取權限的簡單例子: +</p> +<pre> // 任何人都可以存取這項資源 - 沒有限制 + <?access-control allow="*"?> + + // 任何人都不可以存取這項資源 - 沒有例外 + <?access-control deny="*"?> + + // 只有在 'mozilla.org' 上面的網站可以存取這項資源 + // (這也包含了 sub-domains) + <?access-control deny="mozilla.org"?> + + // 除了 developer.mozilla.org 以外,其他所有 mozilla.org 的 sub-domain 都可以存取這項資源 + <?access-control allow="mozilla.org" exclude="developer.mozilla.org"?> + + // 只有這個 domain、在這個 port、運用此方式的 request 可以存取這項資源 + <?access-control allow="developer.mozilla.org" method="GET POST"?> +</pre> +<p>你可以在 W3C Access Control working draft 中找到更多例子。 +</p> +<h5 id=".E4.BE.8B.E5.AD.90_2"> 例子 </h5> +<p>這個簡單的例子從一個網站向另一個網站要求 XML 檔。這個 XML 檔包含了「存取控制的處理指示」(Access-control processing instruction),這些指示給予任何向伺服器發出要求的網站存取的權限。如果你複製 ac.html 到你自己的伺服器,你就會看到 request 仍然可以作用(因為所有網站都被允許向它發出請求)。 +</p><p><a class="external" href="http://ejohn.org/apps/xdomain/ac.html">ac.html</a> +</p> +<pre> <html> + <head> + <script> + window.onload = function(){ + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://dev.jquery.com/~john/xdomain/test.xml", true); + xhr.onreadystatechange = function(){ + if ( xhr.readyState == 4 ) { + if ( xhr.status == 200 ) { + document.body.innerHTML = "My Name is: " + + xhr.responseXML.getElementsByTagName("name")[0].firstChild.nodeValue; + } else { + document.body.innerHTML = "ERROR"; + } + } + }; + xhr.send(null); + }; + </script> + </head> + <body> + Loading... + </body> + </html> +</pre> +<p><a class="external" href="http://dev.jquery.com/~john/xdomain/test.xml">test.xml</a> +</p> +<pre> <?xml version="1.0" encoding="UTF-8"?> + <?access-control allow="ejohn.org"?> + <simple><name>John Resig</name></simple> +</pre> +<h3 id=".E5.BB.B6.E4.BC.B8.E9.96.B1.E8.AE.80"> 延伸閱讀 </h3> +<ul><li><a class="external" href="http://developer.mozilla.org/en/docs/XMLHttpRequest">XMLHttpRequest</a> +</li><li><a class="external" href="http://www.w3.org/TR/access-control/">W3C Access Control working draft</a> +</li><li><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=389508">The bug tracking the implementation of Cross-Site XMLHttpRequest</a> +</li></ul> +<div class="noinclude"> +</div> +{{ languages( { "en": "en/Cross-Site_XMLHttpRequest", "fr": "fr/Requ\u00eates_XMLHttpRequest_inter-sites", "ja": "ja/Cross-Site_XMLHttpRequest", "pl": "pl/\u017b\u0105dania_XMLHttpRequest_przesy\u0142ane_mi\u0119dzy_witrynami" } ) }} diff --git a/files/zh-tw/orphaned/dom_觀察器/index.html b/files/zh-tw/orphaned/dom_觀察器/index.html new file mode 100644 index 0000000000..9b597bb306 --- /dev/null +++ b/files/zh-tw/orphaned/dom_觀察器/index.html @@ -0,0 +1,5 @@ +--- +title: DOM 觀察器 +slug: DOM_觀察器 +--- +<div id="test"> <div id="board"> </div></div> diff --git a/files/zh-tw/orphaned/firefox_3.5_技術文件/index.html b/files/zh-tw/orphaned/firefox_3.5_技術文件/index.html new file mode 100644 index 0000000000..0d151ee276 --- /dev/null +++ b/files/zh-tw/orphaned/firefox_3.5_技術文件/index.html @@ -0,0 +1,240 @@ +--- +title: Firefox 3.5 技術文件 +slug: Firefox_3.5_技術文件 +tags: + - Firefox + - Firefox 3.5 +--- +<p>Firefox 3.5 加入很多新功能,當然也加強了對各式網際標準的支援程度。這篇文章大致說明改進的部份、詳細的說明可見英文版原文。</p> +<p>限於人力,大部分的文章都是英文版。如果您有興趣,請協助翻譯。</p> +<h2 id="3.5_技術面新功能">3.5 技術面新功能</h2> +<h3 id="網站、網際程式部份">網站、網際程式部份</h3> +<h4 id="加強支援_HTML_5">加強支援 HTML 5</h4> +<dl> + <dt> + <a class="internal" href="/En/Using_audio_and_video_in_Firefox" title="En/Using audio and video in Firefox">在 Firefox 中操作影片、音效</a></dt> + <dd> + Firefox 3.5 支援 HTML 5 的 <a class="internal" href="/En/HTML/Element/Audio" title="En/HTML/Element/Audio"><code>audio</code></a> 及 <a class="internal" href="/En/HTML/Element/Video" title="En/HTML/Element/Video"><code>video</code></a> 元素。藉由原生支援,影片、音效可以經由 JavaScript 直接操作 (播放、暫停等)。目前只支援 Ogg 及 WAV 兩種格式的影音檔,未來可能支援其他的格式。</dd> + <dt> + <a class="internal" href="/en/Offline_resources_in_Firefox" title="En/Offline resources in Firefox">離線資源</a></dt> + <dd> + Firefox 3.5 現在完整支援 HTML 5 的離線資源規格。需注意的是,在 Firefox 3 雖已經支援部份規格、但由於推出後 HTML 5 離線資源規格已然修改,是以毋需再針對 Firefox 3 設計相關程式。3.5 支援的是最新的規格。</dd> + <dt> + <a class="internal" href="/En/DragDrop/Drag_and_Drop" title="En/DragDrop/Drag and Drop">拖放事件</a></dt> + <dd> + HTML 5 拖放 (drag & drop) API 提供在網站內 (甚至跨網站) 拖放物件的相關功能。同時,這也讓 Mozilla 相關的程式擴充套件有了比較簡單的 API 可以使用。</dd> +</dl> +<h4 id="新增功能:CSS_部份">新增功能:CSS 部份</h4> +<dl> + <dt> + <a class="internal" href="/en/CSS/@font-face" title="En/CSS/@font-face">動態下載字形</a></dt> + <dd> + 新支援的 <code>@font-face</code> 樣式規則,網頁可以藉此提供字形讓使用者動態下載、以設計師所期待的最佳字形檢視網頁。</dd> + <dt> + <a class="internal" href="/En/CSS/Media_queries" title="En/CSS/Media queries">CSS 媒介判讀</a></dt> + <dd> + Firefox 3.5 現在支援 CSS 媒介判讀 (media queries),可以讓不同的媒介使用不同的樣式規則。</dd> + <dt> + 更新 <a class="internal" href="/en/CSS/:before" title="En/CSS/:before"><code>::before</code></a> 及 <a class="internal" href="/en/CSS/:after" title="En/CSS/:after"><code>::after</code></a> 行為以符合 CSS 2.1</dt> + <dd> + <code>::before</code> 及 <code>::after</code> 兩個擬態元素 (pseudo-element) 已經更新,以便完整支援 CSS 2.1 相關規格。新增關於 <code>position</code>、<code>float</code>、<code>list-style-*</code> 及部份 <code>display</code> 特性。</dd> +</dl> +<dl> + <dt> + <a class="internal" href="/en/CSS/opacity" title="En/CSS/Opacity"><code>opacity</code></a></dt> + <dd> + Mozilla 先前提供的 <code>-moz-opacity</code> 特性已經停止支援,請改用標準的 <code>opacity</code> 特性。</dd> + <dt> + <a class="internal" href="/en/CSS/text-shadow" title="En/CSS/Text-shadow"><code>text-shadow</code></a></dt> + <dd> + Firefox 3.5 開始支援 <code>text-shadow</code> 特性,可以為網頁上的文字加上陰影效果。</dd> + <dt> + <a class="internal" href="/En/CSS/Word-wrap" title="En/CSS/Word-wrap"><code>word-wrap</code></a></dt> + <dd> + 此特性可設定是否允許某行文字溢出版面時自動調整斷行。</dd> + <dt> + <a class="internal" href="/en/CSS/-moz-box-shadow" title="En/CSS/-moz-box-shadow"><code>-moz-box-shadow</code></a></dt> + <dt> + <a class="internal" href="/En/CSS/-moz-border-image" title="En/CSS/-moz-border-image"><code>-moz-border-image</code></a></dt> + <dt> + <a class="internal" href="/En/CSS/-moz-column-rule" title="En/CSS/-moz-column-rule"><code>-moz-column-rule</code></a></dt> + <dt> + <a class="internal" href="/En/CSS/-moz-column-rule-width" title="En/CSS/-moz-column-rule-width"><code>-moz-column-rule-width</code></a></dt> + <dt> + <a class="internal" href="/En/CSS/-moz-column-rule-style" title="En/CSS/-moz-column-rule-style"><code>-moz-column-rule-style</code></a></dt> + <dt> + <a class="internal" href="/En/CSS/-moz-column-rule-color" title="En/CSS/-moz-column-rule-color"><code>-moz-column-rule-color</code></a></dt> + <dt> + <a class="internal" href="/en/CSS/-moz-column-gap" title="En/CSS/-moz-column-gap"><code>-moz-column-gap</code></a></dt> + <dd> + Firefox 3.1 開始新增上述 Mozilla 擴充特性。</dd> + <dt> + <a class="internal" href="/en/CSS/color#Mozilla_Specific_Colors" title="En/CSS/color#Mozilla Specific Colors"><code>-moz-nativehyperlinktext</code> 色彩值</a></dt> + <dd> + 新的色彩設定值,顯示為系統的預設連結色彩。</dd> + <dt> + <a class="internal" href="/En/CSS/-moz-window-shadow" title="En/CSS/-moz-window-shadow"><code>-moz-window-shadow</code></a> 及 <a class="internal" href="/En/CSS/:-moz-system-metric(mac-graphite-theme)" title="En/CSS/:-moz-system-metric(mac-graphite-theme)"><code>-moz-system-metric(mac-graphite-theme)</code></a> 特性</dt> + <dd> + 為了方便佈景主題製作而新增的 CSS 特性。</dd> + <dt> + <a class="internal" href="/en/CSS/-moz-appearance" title="En/CSS/-moz-appearance"><code>-moz-appearance</code></a> 支援新設定值</dt> + <dd> + <code>-moz-appearance</code> 開始支援 <code>-moz-win-glass</code> 及 <code>-moz-mac-unified-toolbar</code> 兩種新設定值。</dd> + <dt> + <a class="internal" href="/En/CSS/Using_CSS_transforms" title="En/CSS/Using CSS transforms">CSS 變形</a></dt> + <dd> + Firefox 3.5 開始支援 CSS 變形特性,詳情請見 <a class="internal" href="/En/CSS/-moz-transform" title="En/CSS/-moz-transform"><code>-moz-transform</code></a> 及 <a class="internal" href="/En/CSS/-moz-transform-origin" title="En/CSS/-moz-transform-origin"><code>-moz-transform-origin</code></a>。</dd> + <dt> + <a class="internal" href="/en/CSS/:nth-child" title="En/CSS/:nth-child"><code>:nth-child</code></a></dt> + <dt> + <code><a class="internal" href="/en/CSS/:nth-last-child" title="En/CSS/:nth-last-child">:nth-last-child</a></code></dt> + <dt> + <code><a class="internal" href="/en/CSS/:nth-of-type" title="En/CSS/:nth-of-type">:nth-of-type</a></code></dt> + <dt> + <code><a class="internal" href="/en/CSS/:nth-last-of-type" title="En/CSS/:nth-last-of-type">:nth-last-of-type</a></code></dt> + <dt> + <code><a class="internal" href="/en/CSS/:first-of-type" title="En/CSS/:first-of-type">:first-of-type</a></code></dt> + <dt> + <code><a class="internal" href="/en/CSS/:nth-last-of-type" title="En/CSS/:nth-last-of-type">:last-of-type</a></code></dt> + <dt> + <a class="internal" href="/en/CSS/:only-of-type" title="En/CSS/:only-of-type"><code>:only-of-type</code></a></dt> + <dd> + Firefox 3.5 開始支援上述選取符。</dd> +</dl> +<h4 id="新增功能:DOM_部份">新增功能:DOM 部份</h4> +<dl> + <dt> + <a class="internal" href="/En/Using_web_workers" title="En/Using DOM workers">DOM 背景工作序</a></dt> + <dd> + Firefox 3.5 支援 DOM 背景工作緒 (workers),方便網際應用程式以多執行緒方式執行。</dd> + <dt> + <a class="internal" href="/En/Using_geolocation" title="En/Using geolocation">地理位置</a></dt> + <dd> + Firefox 3.5 支援地理資訊 (Geolocation) API,在安裝有相關元件 (Geolocation provider)並啟用的狀態下、允許網際應用程式取得使用者目前的所在地。</dd> + <dt> + <a class="internal" href="/En/Using_JSON_in_Firefox" title="En/Using JSON in Firefox">在 Firefox 中使用 JSON</a></dt> + <dd> + DOM 已經整合對 <a class="internal" href="/en/JSON" title="En/JSON">JSON</a> 的支援。</dd> +</dl> +<dl> + <dt> + <a class="internal" href="/En/DOM/Locating_DOM_elements_using_selectors" title="en/DOM/Locating DOM elements using selectors">以選取符取用 DOM 元素</a></dt> + <dd> + 選取符 API 讓開發人員以類似 CSS 的選取符指定 DOM 元素方便操作。</dd> + <dt> + <a class="internal" href="/En/DOM/NodeIterator" title="En/DOM/NodeIterator"><code>NodeIterator</code> 物件</a></dt> + <dd> + <code>NodeIterator</code> 提供在DOM子樹中對節點列表進行往返(iterating)的支援。</dd> + <dt> + <a class="internal" href="/en/Gecko-Specific_DOM_Events#MozAfterPaint" title="en/Gecko-Specific DOM Events#MozAfterPaint">MozAfterPaint 事件</a></dt> + <dd> + 新 DOM 事件,在視窗重繪時觸發。</dd> + <dt> + <a class="internal" href="/en/Gecko-Specific_DOM_Events#MozMousePixelScroll" title="en/Gecko-Specific DOM Events#MozMousePixelScroll">MozMousePixelScroll 事件</a></dt> + <dd> + 新 DOM 事件,允許偵測滑鼠滾輪事件,且是以像素為單位、非以往的「行」。</dd> +</dl> +<h4 id="新增功能:JavaScript">新增功能:JavaScript</h4> +<dl> + <dt> + <a class="internal" href="/En/Core_JavaScript_1.5_Reference/Global_Objects/Object/GetPrototypeOf" title="En/Core JavaScript 1.5 Reference/Global Objects/Object/GetPrototypeOf"><code>Object.getPrototypeOf()</code></a></dt> + <dd> + 傳回指定物件的原型。</dd> + <dt> + 字串物件的「修剪」方法</dt> + <dd> + <a class="internal" href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String" title="en/Core JavaScript 1.5 Reference/Global Objects/String"><code>String</code></a> 物件現在可藉 <a class="internal" href="../../../../En/Core_JavaScript_1.5_Reference/Global_Objects/String/Trim" rel="internal"><code>trim()</code></a>、<a class="internal" href="../../../../En/Core_JavaScript_1.5_Reference/Global_Objects/String/TrimLeft" rel="internal"><code>trimLeft()</code></a> 及 <a class="internal" href="../../../../En/Core_JavaScript_1.5_Reference/Global_Objects/String/TrimRight" rel="internal"><code>trimRight()</code></a> 等方法清除空白部份。</dd> +</dl> +<h4 id="其他新功能">其他新功能</h4> +<dl> + <dt> + <a class="internal" href="/En/ICC_color_correction_in_Firefox" title="en/ICC color correction in Firefox">ICC 色彩校正</a></dt> + <dd> + Firefox 3.5 現在支援圖片的 ICC 色彩校正。</dd> + <dt> + <a class="internal" href="/En/HTML/Element/Script" title="En/HTML/Element/script"><code>script</code></a> 元素支援 <code>defer</code> 屬性</dt> + <dd> + 此屬性讓瀏覽器可以決定是否要等待此段腳本執行完畢後再繼續分析、繪制網頁。</dd> + <dt> + <a class="internal" href="/En/Controlling_DNS_prefetching" title="en/Controlling DNS prefetching">控制預讀 DNS</a></dt> + <dd> + Firefox 3.5 提供預讀 DNS 功能,不必等到真的按下連結、就可以先行處理本頁裡各連結網址的域名查詢,讓使用者感覺更快。本文說明操作這個行為的方法,包括如何停用、如何調整此功能。</dd> +</dl> +<h4 id="新增功能:Canvas_部份">新增功能:Canvas 部份</h4> +<dl> + <dt> + <a class="internal" href="/en/Drawing_text_using_a_canvas" title="en/Drawing text using a canvas"><code>canvas</code> 元素中的 HTML 5 text API</a></dt> + <dd> + Canvas 元素開始支援 HTML 5 text API。</dd> + <dt> + <a class="internal" href="/en/Canvas_tutorial/Applying_styles_and_colors#Shadows" title="en/Canvas tutorial/Applying styles and colors#Shadows"><code>canvas</code> 支援陰影效果</a></dt> + <dd> + 此版開始支援 Canvas 陰影效果。</dd> + <dt> + <code>moz-opaque</code> 屬性</dt> + <dd> + 增加 <code>moz-opaque</code> DOM 屬性,指定 canvas 是否需要使用透明效果。如果一開始就確定不會有透明效果、那麼繪製的效率便能最佳化。</dd> +</dl> +<h4 id="新增功能:SVG_部份">新增功能:SVG 部份</h4> +<dl> + <dt> + <a class="internal" href="/En/Applying_SVG_effects_to_HTML_content" title="en/Applying SVG effects to HTML content">在 HTML 內容中套用 SVG 特效</a></dt> + <dd> + 你現在可以在 HTML 及 XHTML 內容中套用 SVG 特效。</dd> +</dl> +<h3 id="其他改良要點">其他改良要點</h3> +<ul> + <li><code>ch</code> 已可用於任何支援<a class="internal" href="/en/length" title="En/Length">單位設定值</a>之處;「1 ch」便是「0」字元的寬度。</li> + <li><a class="internal" href="/en/CSS/white-space" title="En/CSS/White-space"><code>white-space</code></a> 特性開始支援 <code>pre-line</code> 設定值。</li> + <li>文字結點已經實現 <code><a class="internal" href="../../../../En/DOM/Text.wholeText" rel="internal">wholeText</a></code> 屬性和 <code><a class="internal" href="../../../../En/DOM/Text.replaceWholeText" rel="internal">replaceWholeText()</a></code> 方法。</li> + <li>增加了 <code><a class="internal" href="../../../../En/DOM/Element.children" rel="internal">element.children</a></code> 屬性。它會回傳在指定元素下的子元素<em>集合</em>。</li> + <li>DOM的 <a class="internal" href="../../../../en/DOM/element" rel="internal">Element</a> 物件現在支援了Element Traversal API。</li> + <li>HTML 節點可以使用 <a class="internal" href="/En/DOM/Node/CloneNode" title="En/DOM/Node/CloneNode"><code>cloneNode()</code></a> 複製。</li> + <li>被傳送(Dispatch)過的 DOM 事件可以再被傳送。這讓 Firefox 3.5 通過了 Acid 3 中的 test 30.</li> + <li>改進了DOM 2 Range 的處理。</li> + <li>在非 chrome 範圍下,在例外中被擲回的物件現在確實是該擲回的物件,而並非一個包含該被擲回物件的 <a class="internal" href="/en/XPConnect" title="En/XPConnect">XPConnect</a> wrapper。</li> + <li>SVG 的 ID references 現在可用了。</li> + <li>SVG filters 現在對 <code>foreignObject</code> 也有用。</li> + <li>為了相容性,<code>GetSVGDocument()</code> 方法已加入到 <a class="internal" href="/en/HTML/Element/object" title="En/HTML/Element/Object"><code>object</code></a> 和 <a class="internal" href="/en/HTML/Element/Iframe" title="en/HTML/Element/Iframe"><code>iframe</code></a> 元素。</li> +</ul> +<h3 id="XUL_及套件開發相關">XUL 及套件開發相關</h3> +<p>如果您曾開發擴充套件,那麼請先閱讀<a class="internal" href="/En/Updating_extensions_for_Firefox_3.5" title="En/Updating extensions for Firefox 3.5">為 Firefox 3.5 更新套件</a>(英文),裡頭說明了新版本對套件可能衍生的影響。</p> +<h4 id="新元件、函式">新元件、函式</h4> +<dl> + <dt> + <a class="internal" href="/En/HTTP_access_control" title="En/HTTP access control">跨網域 HTTP 存取控制</a></dt> + <dd> + 當伺服器提供相關支援,則 Firefox 3.5 可以操作包含 <a class="internal" href="/en/XMLHttpRequest" title="En/XMLHttpRequest"><code>XMLHttpRequest</code></a> 在內的跨網域 HTTP 存取方式。</dd> + <dt> + <a class="internal" href="/En/Using_XMLHttpRequest#Monitoring_progress" title="En/Using XMLHttpRequest#Monitoring progress"><code>XMLHttpRequest</code> 進度事件</a></dt> + <dd> + 讓擴充套件得以監控相關進度。</dd> + <dt> + <a class="internal" href="/En/Supporting_private_browsing_mode" title="En/Supporting private browsing mode">支援隱密瀏覽模式</a></dt> + <dd> + Firefox 3.5 支援隱密瀏覽模式,不會紀錄使用者的活動。擴充套件如需支援隱密模式,可以參考這份文件。</dd> + <dt> + <a class="internal" href="/En/Security_changes_in_Firefox_3.5" title="en/Security changes in Firefox 3.1">Firefox 3.5 安全相關變動</a></dt> + <dd> + Firefox 3.5 安全性相關的變動說明。</dd> + <dt> + <a class="internal" href="/En/Theme_changes_in_Firefox_3.5" title="En/Theme changes in Firefox 3.1">Firefox 3.5 佈景主題變動</a></dt> + <dd> + Firefox 3.5 佈景主題相關的變動說明。</dd> +</dl> +<h4 id="其他值得一提的改良、改變">其他值得一提的改良、改變</h4> +<ul> + <li>XUL 的 <code><a class="internal" href="../../../../en/XUL/textbox" rel="internal">textbox</a></code> widget 現在提供了搜尋欄位用的 <code><a class="internal" href="../../../../en/XUL/Attribute/textbox.type" rel="internal">search</a></code> 類型。</li> + <li>為了支援跨視窗間的滑鼠拖放,<a class="internal" href="/en/XUL/browser" title="En/XUL/Browser"><code>browser</code></a> 新增了 <a class="internal" href="/En/XUL/Method/SwapDocShells" title="En/XUL/Method/SwapDocShells"><code>swapDocShells()</code></a> 方法。</li> + <li><a class="internal" href="/En/XUL/Attribute/Panel.level" title="en/XUL/Attribute/panel.level">En/XUL/Attribute/Panel.level</a> <a class="internal" href="/en/XUL/panel" title="En/XUL/Panel"><code>panel</code></a> 元素新增了 <a class="internal" href="/En/XUL/Attribute/Panel.level" title="en/XUL/Attribute/panel.level"><code>level</code></a> 屬性;可用於指定 Panel 要顯示在所有程式的頂端,或是只在包含此Panel之視窗的頂端。</li> + <li>XUL 元素開始支援 <code>clientXXX</code> 及 <code>scrollXXX</code> 等特性。</li> + <li><a class="internal" href="/en/XUL/keyset" title="En/XUL/Keyset"><code>keyset</code></a> 現在可以包含 <code>disabled</code> 屬性。</li> + <li>另外,<code>keyset</code> 現在也可以使用 <a class="internal" href="/En/DOM/Node.removeChild" title="En/DOM/Node.removeChild"><code>removeChild()</code></a> 方法來移除。</li> + <li><span class="lang lang-en"><code><a href="../../../../en/mozIStorageStatement" rel="internal">mozIStorageStatement</a></code> </span>移除了 <code>initialize()</code> 方法;consumer應該改用 <span class="lang lang-en"><code><a href="../../../../en/mozIStorageConnection#createStatement%28%29" rel="internal">createStatement()</a></code> </span> 方法而非取得一個新的 statment 物件。</li> + <li><a class="internal" href="/en/Storage" title="En/Storage">Storage</a> API 現在支援了非同步請求。</li> + <li><a class="internal" href="/en/nsICookie2" title="En/NsICookie2"><code>nsICookie2</code></a> 介面現在會透過其新的 <code>creationTime</code> 屬性透露Cookie被建立的時間。</li> + <li>在 <code><a class="internal" href="../../../../en/nsIProtocolHandler" rel="internal">nsIProtocolHandler</a></code> 增加了一個旗標 (<code>URI_IS_LOCAL_RESOURCE</code>) ,會在 Chrome 註冊時被檢查已確定這樣的協定(Protocol)是否可被允許建立。</li> + <li>Firefox 現在在 Linux 下會在 <code>/usr/lib/mozilla/plugins</code> ,以及過去支援的位置,尋找 Plugin。</li> + <li>Plugin API 更新了對於隱私瀏覽模式的支援。你現在可以使用 <a class="internal" href="/en/NPN_GetValue" title="En/NPN GetValue"><code>NPN_GetValue()</code></a> ,使用變數 <code>NPNVprivateModeBool</code> 來查詢隱私瀏覽模式的狀態。</li> +</ul> +<p>{{ languages( { "en": "en-US/Firefox/Releases/3.5"} ) }}</p> diff --git a/files/zh-tw/orphaned/firefox_中的離線資源/index.html b/files/zh-tw/orphaned/firefox_中的離線資源/index.html new file mode 100644 index 0000000000..0b1180d3ca --- /dev/null +++ b/files/zh-tw/orphaned/firefox_中的離線資源/index.html @@ -0,0 +1,48 @@ +--- +title: Firefox 中的離線資源 +slug: Firefox_中的離線資源 +tags: + - HTML5 離線 + - application cache +--- +<p> </p> +<div> <div> <p>原文 : <a href="/en/Using_Application_Cache" title="https://developer.mozilla.org/en/Using_Application_Cache">Using Application Cache</a></p> <p> </p> <h2 id="介紹">介紹</h2> <p> HTML5 提供了 cache 機制,使得網路應用程式能較不受到網路狀態的影響。開發人員可以藉由 Application Cache (AppCache) 的介面來定義哪些資源應當被瀏覽器儲存起來 - 如此一來即使網路斷線使用者依舊可以取得這些資源。同時,應用程式也能正確的運行即使使用者按下了「重新載入」的按鈕。</p> <p> 大抵來說,使用 Application Cache 可以取得下列好處:</p> <ul> <li>離線瀏覽:使用者可以在斷線/離線時瀏覽你的網站</li> <li>網站加速:善用 AppCache 就可以減少載入重複資源的狀況,進而加速網站讀取速度</li> <li>減少伺服器的負擔:瀏覽器僅只有在伺服器上資源發生變動時才重新抓取資料</li> </ul> <h2 id="application_cache_運作的機制">application cache 運作的機制</h2> <h3 id="啟動_application_cache">啟動 application cache</h3> <p> 啟動 AppCache 的方法很簡單,你只需要在你程式頁面中,html 元素裡指名 manifest 的位置即可,這裡有個簡單範例:</p> <div> <pre class="eval"><span class="nowiki"><html manifest="example.appcache"> </span> + ... +</html> +</pre> </div> <p>manifest 指向了一個<strong> cache manifest</strong> 的檔案,他指出了在你的應用程式中哪些資源該當被瀏覽器儲存以作為快取。</p> <p> 你應該在每一個你希望瀏覽器替你儲存資源的頁面加上 manifest。瀏覽器不會自作主張的去儲存 manifest 指定以外的資源。事實上,你並不需要列出所有你想要被快取的頁面,瀏覽器會儲存使用者曾經瀏覽過的所有頁面以及你指名的那些資源。</p> <p> 某些瀏覽器 - 例如 FireFox - 會在使用者第一次讀取有使用 Application Cache 的時候提醒他們。提示訊息可能會是這樣:</p> <p>This website (<code>www.example.com</code>) is asking to store data on your computer for offline use. [Allow] [Never for This Site] [Not Now]</p> <p>The term "offline(-enabled) applications" sometimes refers specifically to applications that the user has allowed to use offline capabilities.</p> <h3 id="讀取文件">讀取文件</h3> <div> <p> Application Cache 的運作是基於讀取 manifest 檔案:</p> <ul> <li>倘若 application cache 存在,瀏覽器會直接取用本地端的快取而非經由網路請求資源。這可以加速網頁讀取。</li> <li>倘若 cache manifest 檔案被更新了,瀏覽器會下載新版的 manifest 並且依此and the resources listed in the manifest. This is done in the background and does not affect performance significantly.</li> </ul> <p> 其運作流程如下:</p> <ol> <li>當瀏覽器造訪一個有使用 AppCache 的網站時 (根據 <html> 判定),若發現自己並沒有本地快取,就按照該 manifest 建立第一版的本地快取。</li> <li>在接下來的瀏覽行為中,倘然觸及被快取的資源,瀏覽器將會直接自本地端給予回應。在此同時,瀏覽器也會傳送一個確認的事件給 <code><a href="/en/DOM/window.applicationCache" title="en/DOM/window.applicationCache">window.applicationCache</a></code> 物件,其會按照 HTTP cache rules 取回 manifest 檔案。</li> <li>假使目前本地擁有的 manifest 已經是最新,瀏覽器將會送一個「不需更新」的事件給 applicationCache 物件。所以<strong>假設任何一個在伺服器端被你註明要被快取住的物件更動了,務必改動 manifest 檔案</strong>,如此一來使用者的瀏覽器才知道要重新下載所有的資源。</li> <li>當 manifest 更新後,所有列在其中的資源會由 <code><a href="/en/nsIDOMOfflineResourceList#add.28.29" title="en/nsIDOMOfflineResourceList#add.28.29">applicationCache.add()</a></code>透過 HTTP caching rules 被重新抓取至本地的暫存快取。當一個檔案被抓到本地快取後,瀏覽器會送出 progress 的事件到 applicationCache 物件。如果發生了錯誤,瀏覽器會送出 error 事件並停止更新。</li> <li>當所有資源都被成功的取得後,他們便會被真正地移到離線時也能存取的快取區。此時,cached 事件會被發送給 applicationCache 物件。此時瀏覽器已經能顯示畫面了,未來只有當使用者重新整理頁面、手動操作或被其他程式驅動才會重新從快取中讀到瀏覽器。</li> </ol> </div> <h3 id="清除_application_cache">清除 application cache</h3> <p> 在 Chrome 中,使用者可以藉由選擇 preferences 中 <em>Clear browsing data...</em> 清除 application cache 的內容 (此外,也可以造訪 <a class="external" title="chrome://appcache-internals/">chrome://appcache-internals/</a> )。Safari 中也有類似的設計,你可以選用 preference 中的 <em>Empty cache</em> 達到一樣的目的 (但 safari 此時可能會要求你重啟瀏覽器)。</p> <p> 而 Firefox 則將這些資料放置在一般的硬碟快取中 (非在 Firefox 的 profile 中):</p> <ul> <li>Windows Vista/7: <code>C:\Users\<username>\AppData\<strong>Local</strong>\Mozilla\Firefox\Profiles\<salt>.<profile name>\OfflineCache</code></li> <li>Mac/Linux: <code>/Users/<username>/Library/Caches/Firefox/Profiles/<salt>.<profile name>/OfflineCache</code></li> </ul> <p>使用者可以透過檢查 about:cache 中 <em>Offline cache device</em> 下的資訊來得知目前狀態。</p> <p> 使用者可以清除特定網站的快取藉由 Tools -> Options -> Advanced -> Network -> Offline 中的 "Remove..." 按鈕。補充一下,以下兩個方法<strong>無法</strong>清除快取</p> <ul> <li>Clear Recent History (<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=538595" title="https://bugzilla.mozilla.org/show_bug.cgi?id=538595">bug 538595</a>)</li> <li>Options -> Advanced -> Network -> Offline data -> Clear Now (<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=538588" title="https://bugzilla.mozilla.org/show_bug.cgi?id=538588">bug 538588</a>)</li> </ul> <p>相關資訊亦可參考 <a href="/en/DOM/Storage#Storage_location_and_clearing_the_data" title="en/DOM/Storage#Storage location and clearing the data">clearing the DOM Storage data</a> 。</p> <div> <p> Application cache 也會有失效的時候。當伺服器端移除了 manifest 後,瀏覽器會自動清除所有在本地端的快取,並且發送 obsoleted 的事件給 <code>applicationCache 物件。這會使得 application cache 的狀態變為 </code>OBSOLETE。</p> </div> <h2 id="關於_cache_manifest_file">關於 cache manifest file</h2> <h3 id="如何引用_cache_manifest_file">如何引用 cache manifest file</h3> <p> 在 manifest 中定義資源的路徑可以分為兩種 - 相對路徑及絕對路徑 (絕對路徑:起始點是 application 所在的那層目錄)。並且,manifest 的 MIME 格式必須為 text/cache-manifest。</p> <h3 id="cache_manifest_file_的起始點">cache manifest file 的起始點</h3> <p> Manifest 文件中的資源必須以 URI 格式表示。所有列於 manifest 中的資源,他們的 scheme、host以及 port 都得和 manifest 文件一樣。</p> <h3 id="範例_1_一個簡單的_cache_manifest_file">範例 1: 一個簡單的 cache manifest file</h3> <div> <p> 這是一個簡單的範例, <code>example.appcache</code>, 我們假設他屬於 <span class="nowiki">www.example.com</span></p> <pre class="eval">CACHE MANIFEST +# v1 - 2011-08-13 +# This is a comment. +<span class="nowiki">http://www.example.com/index.html</span> +<span class="nowiki">http://www.example.com/header.png</span> +<span class="nowiki">http://www.example.com/blah/blah</span> +</pre> <p> 一個 manifest 檔案可以有三種不同的段落 - <code>CACHE</code>、<code>NETWORK</code> 以及 <code>FALLBACK (容後再敘)。在 example.appcache 中我們並未指定段落名,是以所有資源會被以預設方式解析,也就是「需要被加到快取」(意義上屬於 CACHE 段)。如前所提到,資源可以用相對或絕對路徑表示(例如可以把 </code><a class=" external" href="http://www.example.com/index.html" rel="freelink">http://www.example.com/index.html</a> 改為 index.html)。</p> <p> 在這裡要特別指出被放置在註解中的「v1」字樣。顯然他表達的是版本資訊。但在 manifest 中這樣的表達方式有大用。假設今天 header.png 改變了,你只需要改動版本資訊 (或註解中的內容),則此 manifest 就會被認為有改變而使得瀏覽器重新抓取快取。當然你可以改動檔案中的其他部分,可是改變版本號是比較建議的方式。</p> <div class="warning"><strong>重要提醒:</strong> 請勿將 manifest 檔案本身也列在 manifest 內容中,否則將使瀏覽器無法辦別 manifest 是否已被更新。這將使整個 application cache 機制失效。</div> <h3 id="cache_manifest_file_中的分類段落_CACHE_NETWORK_and_FALLBACK">cache manifest file 中的分類段落: <code>CACHE</code>, <code>NETWORK</code>, and <code>FALLBACK</code></h3> <p> 在 manifest 中我們可以有三種不同的段落: <code>CACHE</code>、 <code>NETWORK 以及</code> <code>FALLBACK。</code></p> <dl> <dt><code>CACHE:</code></dt> <dd>這是預設的段落。列於 CACHE 段落下的資源列表將在使用者第一次造訪時就被加到快取中。</dd> <dt><code>NETWORK:</code></dt> <dd>列於這個段落的資源表示一定得透過網路抓取而不從快取取得。可以使用萬用字元表示內容。</dd> <dt><code>FALLBACK:</code></dt> <dd>FALLBACK 指出了一種替代關係。在這個段落裡的每一行都有兩種 URI,其一指名有網路連線時使用的資源,第二個則是斷線時使用。這兩個 URI 的根目錄必須是相對於 manifest。可以使用萬用字元表示內容。</dd> </dl> <p> 這三種不同段落可以以任意順序出現在 manifest 中,並且都可出現多次而無次數限制。</p> <h3 id="範例_2_稍微複雜點的_cache_manifest_file">範例 2: 稍微複雜點的 cache manifest file</h3> <p> 這裡我們來看看稍微複雜點的 manifest。他存在於一個虛擬的網站 <span class="nowiki">www.example.com</span>:</p> <pre class="eval">CACHE MANIFEST +# v1 2011-08-14 +# This is another comment +index.html +cache.html +style.css +image1.png + +# Use from network if available +NETWORK: +network.html + +# Fallback content +FALLBACK: +/ fallback.html +</pre> <p> 這個範例中使用了 NETWORK 以及 FALLBACK:</p> <ul> <li>NETWORK:network.html 只能透過網路取回而不從快取。</li> <li>FALLBACK:倘若沒有網路連線就使用 fallback.html (這裡寫法意思是說無法讀取到網站的/ ,也就是無法顯示網站)</li> </ul> <h3 id="cache_manifest_file_的結構">cache manifest file 的結構</h3> <p> Cache manifest 檔案應該被定義成 text/cache-manifest 的 MIME 格式。而所有被定義成 text/cache-manifest MIME 格式的檔案將被以本章所規範的語法解析。</p> <p> 首先,Cache manifests 必須是一個 UTF-8 格式的文字檔。檔案中可以被嵌入 BOM (Byte-Order Mark)字元,舉例來說,換行會被表示成 「line feed (<code>U+000A</code>)」、「 carriage return (<code>U+000D</code>)」或 「carriage return 及 line feed both」。</p> <p> 第二,cache manifest 的第一行必須是「<code>CACHE MANIFEST」字串 (CACHE 和 MANIFEST 中間的那個空白是一個 </code>U+0020<code> 符號),其後可以任意加入 space 或 tab 字符。以這一行來說,其他被加入的字串將會被忽略。</code></p> <p> 最後,檔案中的剩餘部份是由零至多個下列所述的項目構成:</p> <dl> <dt>Blank line</dt> <dd>空白行。你可以任意用 space 或 tab 去產生新的一行。</dd> <dt>Comment</dt> <dd>註解。指的是以 # 起始的行。要注意 # 只在該行有效,你不能在後附加上其他行 (若你有多行註解,請在每行起始都加上 #)。</dd> <dt>Section header</dt> <dd>段落標頭。這裡指的是在前面我們討論過 CACHE、 NETWORK 以及 FALLBACK:</dd> </dl> <blockquote> <table class="standard-table"> <tbody> <tr> <th>Section header</th> <th>Description</th> </tr> <tr> <td><code>CACHE:</code></td> <td>其後內容指出哪些資源需要被加到瀏覽器的快取中</td> </tr> <tr> <td><code>NETWORK:</code></td> <td>其後內容指出哪些資源一定得從網路取得</td> </tr> <tr> <td><code>FALLBACK:</code></td> <td>其後內容指出資源在有網路連線及斷線時的替代關係</td> </tr> </tbody> </table> </blockquote> <dl> <dd>段落標頭行可以含有空白,但要記得在最後加上 「:」字元。</dd> <dt>Section data</dt> <dd>段落資料。其格式隨著不同段落而有所不同。在 CACHE 段落,每一行必須是符合規則的 URI 或 IRI (IRI 類似於 URI,但可使用 unicode),此外,在 CACHE 段落中不得使用萬用字元,但可自由使用空白 (前提自然是不能破壞 URI/IRI 內容)。而在 NETOWKR 段落中,其內容為符合規則之 URI/IRI,並可以使用萬用字元。最後,在 FALLBACK 段落,其每一行的構成是先寫出合於規則的 URI/IRI,接著寫出倘若網路不通時該用何資源取代。<br> <div class="note"><strong>注意:</strong>倘若使用相對路徑的 URI,那麼其相對的位置是「cache manifest 檔案的 URI」。</div> </dd> </dl> <p> Cache manifest 檔是以上述三種段落來依序判讀,是以每一段落可出現一次以上。甚至你也可以寫出內容為空的段落。</p> <h2 id="Application_cache_中的資源">Application cache 中的資源</h2> <p> Application cache 總是含有至少一個資源,並以 URI 形式敘述。下面列出資源種類,manifest 中的資源必屬其中。</p> <dl> <dt>Master entries</dt> <dd>這是一個瀏覽的入口,其引用了 manifest 檔案。</dd> <dt>Explicit entries</dt> <dd>描述 CACHE 段落的入口。</dd> <dt>Network entries</dt> <dd>描述 NETWORK 段落的入口。</dd> <dt>Fallback entries</dt> <dd>描述 FALLBACK 段落的入口。</dd> </dl> <div class="note"><strong>注意:</strong> R同一種資源可以屬於多種不同種類,例如一個 entry 可以同時是 explicit entry 和 fallback entry。</div> <p> 關於這些資源種類,下面會有更詳細的說明。</p> <h3 id="Master_entries">Master entries</h3> <p> Master entries 是一種在他們 {{ HTMLElement("html") }} element 中含有 {{ htmlattrxref("manifest","html") }} attribute 的 HTML 檔。舉例來說,如果我們說我們有一個 <code><a class="linkification-ext external" href="http://www.foo.bar/entry.html" title="Linkification: http://www.foo.bar/entry.html">http://www.example.com/entry.html</a> 的 HTML 檔,其內容為:</code></p> <pre><html manifest="example.appcache"> + <h1>Application Cache Example</h1> +</html> +</pre> <p>如果 <code>entry.html</code> 並未被列在 <code>example.appcache</code> 中,幫妳拜訪 <code>entry.html</code> 時,他就會被加到 application cache 中,並被指明為一個 master entry。</p> <h3 id="Explicit_entries">Explicit entries</h3> <p> 這指出了哪些檔案需要被存到快取中。</p> <h3 id="Network_entries">Network entries</h3> <p> 這指出了哪些檔案一定得透過網路取得。可以看成是列出了一張線上白名單 (online whitelist),提示了有些東西必須得透過網路向伺服器抓取。這有很多好處,其中一個好處是可以避開些安全漏洞,避免某些認證結果從本地端讀取而造成危險 (如果這個認證結果被竄改的話 ... )。</p> <p> 這裡有個例子,你可以要求執行的腳本一定得透過網路向伺服器抓取:</p> <pre>CACHE MANIFEST +NETWORK: +/api</pre> <div class="note"><strong>注意:</strong> Simply有人可能會覺得「一定向伺服器抓取資料」的這件事也可以透過把他們放置在 master entry 達成,但事實上 master entry 會被加入到 application cache 中。</div> <h3 id="Fallback_entries">Fallback entries</h3> <p> Fallback entry 的使用時機在於網路可能斷線。直接看例子,當我們說有個 manifest (<code><a class=" external" href="http://www.example.com/example.appcache" rel="freelink">http://www.example.com/example.appcache</a>),其檔案內容是:</code></p> <pre>CACHE MANIFEST +FALLBACK: +example/bar/ example.html +</pre> <p>任何企圖抓取 <code><a class=" external" href="http://www.example.com/example/bar/" rel="freelink">http://www.example.com/example/bar/</a></code> 或其子資料夾的請求若是失效,瀏覽器會讀取 <code>example.html</code> 作為替代。</p> <h2 id="Cache_的狀態">Cache 的狀態</h2> <p> 每一個 application cache 都有一個 <strong>state</strong>,表明目前在瀏覽器端的狀態。共用同一個 manifest URI 的 cache 擁有一樣的狀態。狀態的種類如下:</p> <dl> <dt><code>UNCACHED</code></dt> <dd>這是特殊的一個狀態,代表 cache 物件尚未初始化。</dd> <dt><code>IDLE</code></dt> <dd>代表 cache 並非處於更新中的狀態。</dd> <dt><code>CHECKING</code></dt> <dd>目前正在向伺服器端抓取 manifest 檔案以確認是否接下來要有更新資源的動作。</dd> <dt><code>DOWNLOADING</code></dt> <dd>因為 manifest 的更新,資源已經被下載到本地端的快取中。</dd> <dt><code>UPDATEREADY</code></dt> <dd>有一個新版的 application cache 是可用的狀態。這搭配著 <code>updateready</code> 的事件。相對於 <code>cached</code> 事件,他的意思是有新版的更新已經在本地,但尚未呼叫 <code>swapCache()函式。</code></dd> <dt><code>OBSOLETE</code></dt> <dd>Application cache 群組現在處於過時的狀態。</dd> </dl> <h2 id="測試_cache_manifest_的更新">測試 cache manifest 的更新</h2> <p> 你可以經由撰寫 JavaScript 程式來關注是否 manifest 檔有所更新。但未免在你漏失在 Listener 完成註冊之前就完成的事件,務必檢查 <code>window.applicationCache.status。如下所示:</code></p> <pre class="brush: js">function onUpdateReady() { + alert('found new version!'); +} +window.applicationCache.addEventListener('updateready', onUpdateReady); +if(window.applicationCache.status === window.applicationCache.UPDATEREADY) { + onUpdateReady(); +}</pre> <p> 倘若你想手動的去測試 manifest 檔案是否更新,你可以使用 <code>window.applicationCache.update()。</code></p> <h2 id="注意_!!!">注意 !!!</h2> <ul> <li>當 application cache 的機制被啟動,程式撰寫員無法簡單的透過更新資源本身就取得目前伺服器上最新的版本 (或許你已經自本地端快取讀出資源了!)。你必須在瀏覽器讀取資源之前就更新 manifest 檔。這個動作可以透過 <code>window.applicationCache.swapCache() 達到,但在此刻已經被讀取的資源將不受影響。最好的方式是重新刷新頁面。</code></li> <li>一個好的主意是是為你伺服器上所有副檔名為 appcache 的檔案設定為已經失效 (set expires headers)。這可以避免 manifest 被加到快取中的風險。以 Apache 為例,你可以這麼做:<br> <code>ExpiresByType text/cache-manifest "access plus 0 seconds"</code></li> </ul> <h2 id="支援_Application_Cache_的瀏覽器們">支援 Application Cache 的瀏覽器們</h2> <p>{{ CompatibilityTable() }}</p> <div id="compat-desktop"> <table class="compat-table"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>4.0</td> <td>3.5</td> <td>10.0</td> <td>10.6</td> <td>4.0</td> </tr> </tbody> </table> </div> <div id="compat-mobile"> <table class="compat-table"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>2.1</td> <td>{{ CompatUnknown() }}</td> <td>{{ CompatNo() }}</td> <td>11.0</td> <td>3.2</td> </tr> </tbody> </table> </div> <p>附註:先於 3.5 版以前的FireFox 忽略了 manifest 檔案中 NETWORK 以及 FALLBACK 的部分。</p> <h2 id="參考資料">參考資料</h2> <ul> <li><a class="external" href="http://www.html5rocks.com/en/tutorials/appcache/beginner/" title="http://www.html5rocks.com/en/tutorials/appcache/beginner/">HTML5Rocks - A Beginner's Guide to Using the Application Cache</a></li> <li><a class="external" href="http://appcachefacts.info/" title="http://appcachefacts.info/">appcachefacts.info</a> - detailed information on AppCache idiosyncrasies</li> <li><a class="external" href="http://hacks.mozilla.org/2010/01/offline-web-applications/" title="http://hacks.mozilla.org/2010/01/offline-web-applications/">offline web applications</a> at hacks.mozilla.org - showcases an offline app demo and explains how it works.</li> <li><a class="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline">HTML 5 working draft: Offline web applications</a></li> <li><a class="external" href="http://developer.teradata.com/blog/js186040/2011/11/html5-cache-manifest-an-off-label-usage" title="http://developer.teradata.com/blog/js186040/2011/11/html5-cache-manifest-an-off-label-usage">HTML5 Cache Manifest: An Off-label Usage</a></li> <li>{{ interface("nsIApplicationCache") }}</li> <li>{{ interface("nsIApplicationCacheNamespace") }}</li> <li>{{ interface("nsIApplicationCacheContainer") }}</li> <li>{{ interface("nsIApplicationCacheChannel") }}</li> <li>{{ interface("nsIApplicationCacheService") }}</li> <li>{{ interface("nsIDOMOfflineResourceList") }}</li> <li><a class="external" href="http://www.ibm.com/developerworks/web/library/wa-ffox3/">Get ready for Firefox 3.0 - A Web developer's guide to the many new features in this popular browser, especially the offline application features</a> (IBM developerWorks)</li> </ul> <p>{{ HTML5ArticleTOC() }}</p> <p>{{ languages( { "es": "es/Recursos_offline_en_firefox", "fr": "fr/Ressources_hors_ligne_dans_Firefox", "ja": "ja/Offline_resources_in_Firefox", "pl": "pl/Zasoby_offline_w_Firefoksie", "zh-tw": "zh_tw/Offline_resources_on_Firefox" } ) }}</p> </div> </div> +</div> diff --git a/files/zh-tw/orphaned/html5_cross_browser_polyfills/index.html b/files/zh-tw/orphaned/html5_cross_browser_polyfills/index.html new file mode 100644 index 0000000000..d823a44760 --- /dev/null +++ b/files/zh-tw/orphaned/html5_cross_browser_polyfills/index.html @@ -0,0 +1,34 @@ +--- +title: HTML5 跨瀏覽器兼容程式碼 +slug: HTML5_Cross_Browser_Polyfills +--- +<p>這是個蒐集中文世界開發(但不一定原創)的跨瀏覽器兼容代碼、連結的地方,作為 Paul Irish<a class=" link-https" href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills" title="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills">《HTML5 Cross Browser Polyfills》</a>的仿效文件。蒐集不會完全,因此也強烈建議繼續追蹤上述文件的進展,或是使用搜尋引擎。</p> +<p>歡迎貢獻新的代碼、連結,不過請注意放在這個地方的代碼皆屬於<a class=" external" href="http://zh.wikipedia.org/wiki/%E5%85%AC%E6%9C%89%E9%A0%98%E5%9F%9F" title="http://zh.wikipedia.org/wiki/公有領域">公有領域</a>。</p> +<h2 id="全頻(fullscreen)API">全頻(fullscreen)API</h2> +<p>支援 Gecko:FullScreenAPI 草案的 {{ domxref("window.fullScreen") }} 與 {{ domxref("element.onfullscreenchange", "fullscreenchange") }} 事件 ,由<a class=" external" href="http://hax.iteye.com/" title="http://hax.iteye.com/">贺师俊</a>(hax)所<a class=" external" href="http://lists.w3.org/Archives/Public/public-html-ig-zh/2011Aug/0005" title="http://lists.w3.org/Archives/Public/public-html-ig-zh/2011Aug/0005">提供</a>:</p> +<pre class="brush: js">if (!('fullScreen' in window)) Object.defineProperty(window, 'fullScreen', { + get: function() { + return (screen.width == window.outerWidth && screen.height == window.outerHeight) + } +}) + +var _fullScreen = window.fullScreen +if (!('onfullscreenchange' in window)) window.addEventListener('resize', function() { + var f = window.fullScreen + if (f != _fullScreen) { + _fullScreen = f + fireSimpleEvent('fullscreenchange', document, {bubbles:true}) + } +}, false) + +function fireSimpleEvent(type, target, option) { + if (!target) target = document + if (!option) option = {} + var evt = document.createEvent('Event') + evt.initEvent(type, !!option.bubbles, !!option.cancelable) + return target.dispatchEvent(evt) +} +</pre> +<h2 id="中文排版">中文排版</h2> +<ul> <li><a class=" external" href="http://ethantw.net/projects/han/" title="http://ethantw.net/projects/han/">漢字標準格式・CSS Reset</a>(Ethan) <ul> <li>{{ HTMLElement("ruby") }}(上測、右側)、用 {{ HTMLElement("em") }} 達到著重號的效果(CSS 屬性 {{ cssxref("text-emphasis") }}),非 CSS 模擬。</li> </ul> </li> +</ul> diff --git a/files/zh-tw/orphaned/learn/how_to_contribute/index.html b/files/zh-tw/orphaned/learn/how_to_contribute/index.html new file mode 100644 index 0000000000..f8a864b98d --- /dev/null +++ b/files/zh-tw/orphaned/learn/how_to_contribute/index.html @@ -0,0 +1,81 @@ +--- +title: 如何建設 MDN 學習專區 +slug: Learn/How_to_contribute +tags: + - Documentation + - 初學者 + - 貢獻 +translation_of: Learn/How_to_contribute +--- +<div>{{LearnSidebar}}</div> + +<p>無論你是初來乍到、抑或尋至深處無怨尤、都應該是對貢獻 MDN 學習專區起了興趣吧。那很棒!</p> + +<p><span class="seoSummary">在這裡,你會看到該如何改進 MDN 學習專區的內容。視你的時間多寡、以及你是<a href="/zh-TW/Learn/How_to_contribute#我是初學者">初學者</a>、<a href="/zh-TW/Learn/How_to_contribute#我是網路開發者">網路開發者</a>、<a href="/zh-TW/Learn/How_to_contribute#我是教師">教師</a>而定,有一些你可以完成的事情。</span></p> + +<div class="note"> +<p><strong>注意</strong>:你可以在<a href="/zh-TW/docs/MDN/Contribute/Howto/Write_an_article_to_help_learn_about_the_Web">如何撰寫幫助別人理解 Web 的文章</a>裡面找到指引如何撰寫學習專區的新文章。</p> +</div> + +<h2 id="找到特定的任務">找到特定的任務</h2> + +<p><strong>貢獻者們使用 <a href="https://trello.com/b/LDggrYSV">Trello board</a> 來組織工作事務。你可以透過這個方法,找出某個專案的工作。要加入的話,只要 <a href="https://trello.com/signup">建立一個 Trello 的帳號</a>、然後去 ping Chris Mills 叫他給你撰寫 board 的權限。</strong></p> + +<p>Contributing is a great way to have some fun while learning new stuff. If you ever feel lost or have questions, don't hesitate to reach us on <a href="/en-US/docs/MDN/Community#Join_our_mailing_lists">our mailing list</a> or <a href="/en-US/docs/MDN/Community#Get_into_IRC">IRC channel</a> (see at the bottom of this page for details). <a href="/en-US/profiles/chrisdavidmills">Chris Mills</a> is the topic driver for the Learning Area — you could also try pinging him directly.</p> + +<p>接下來的章節,會提供一些在你所能下的常見點子。</p> + +<h2 id="我是初學者">我是初學者</h2> + +<p>真棒!初學者在學習專區的創建與給予回饋,不但重要還很寶貴。身為目標閱聽者的你能在文章方面,提供令你成為團內重要成員的獨特觀點。如果你透過這些文章學習卻碰上問題、或是在某些地方稿不清楚,你可以自己去改它、或告訴我們以便我們修正之。</p> + +<p>我們建議你可以透過以下方法貢獻:</p> + +<dl> + <dt><a href="/zh-TW/docs/MDN/Contribute/Howto/Tag">給我們的文章添加標籤</a>(約五分鐘)</dt> + <dd>給 MDN 的文章添加標籤,是向 MDN 貢獻的最簡單方法。我們有很多功能會透過標籤助以呈現內文資訊,所以幫忙標籤的建設相當寶貴。從沒有任何標籤的<a href="/zh-TW/docs/MDN/Doc_status/Glossary#No_tags">術語表</a>以及<a href="/zh-TW/docs/MDN/Doc_status/Learn#No_tags">學習專區</a>開始吧。</dd> + <dt><a href="/zh-TW/docs/Glossary">閱讀並評價術語表</a>(約五分鐘)</dt> + <dd>我們需要身為初學者的眼光,來檢視我們的內容。如果你發現某個術語難以理解,就表示該術語需要改進。你可以作任何認為有需要的更動。如果你不認為自己有修改該術語的技能,至少請透過<a href="/zh-TW/docs/MDN/Community#Join_our_mailing_lists">我們的郵件清單</a>告訴我們。</dd> + <dt><a href="/docs/MDN/Contribute/Howto/Write_a_new_entry_in_the_Glossary">撰寫新的術語</a>(約二十分鐘)</dt> + <dd>這是最有效的新技能學習法。選一個你想理解的概念去研究。接著,撰寫這個術語。和別人解釋,是「固著」你腦內知識的好方法。既幫自己理解所知、也幫了其他人。利人利己,大家都贏!</dd> + <dt><a href="/zh-TW/Learn/Index">閱讀並評價術語表學習專區的文章</a>(約兩小時)</dt> + <dd>和閱讀術語表差不多,但因為文章會更長了些,所以要花更多時間。</dd> +</dl> + +<h2 id="我是網路開發者">我是網路開發者</h2> + +<p>好極了!我們需要你的技能,來確保我們教給初學者的內容正確無誤。因為這裡的宗旨是理解網路,請確保解釋儘可能簡單,但不致毫無用處。比起過度精確,可以理解才是最重要的。</p> + +<dl> + <dt><a href="/zh-TW/docs/Glossary">閱讀並評價術語表</a>(約五分鐘)</dt> + <dd>我們需要你確認文章的內容是正確又不過於艱澀難懂的。請你變更任何你認為有必要改善的地方。如果你想要在做變更之前討論一下內容,歡迎透過 <a href="/zh-TW/docs/MDN/Community#Join_our_mailing_lists">our mailing list</a> 或 <a href="/zh-TW/docs/MDN/Community#Get_into_IRC">IRC channel</a>通知我們。</dd> + <dt><a href="/docs/MDN/Contribute/Howto/Write_a_new_entry_in_the_Glossary">撰寫新的術語</a>(約二十分鐘)</dt> + <dd>闡明術語是一個簡單又精確的學習方式,初學者還會感激你。我們有<a href="/zh-TW/docs/Glossary#Contribute">很多尚未定義的用詞</a>需要你的協助,挑一個你擅長的吧。</dd> + <dt><a href="/zh-TW/Learn/Index">閱讀並評價術語表學習專區的文章</a>(約兩小時)</dt> + <dd>這跟評價數語表一樣(如上述),只是這些文章的篇幅更常,需要花更多的時間。</dd> + <dt><a href="/zh-TW/docs/MDN/Contribute/Howto/Write_an_article_to_help_learn_about_the_Web">撰寫新的學習專區文章</a> (<em>約四小時或更多</em>)</dt> + <dd>MDN缺少簡單易懂的網頁技術相關文章(例如<a href="/zh-TW/docs/Learn/CSS">HTML</a>, <a href="/zh-TW/docs/Learn/CSS">CSS</a>, <a href="/zh-TW/docs/Learn/JavaScript">JavaScript</a>)。我們也有較舊的文章需要重新審視並修正,請你將技能發揮到極致,讓初學者也能使用網頁技術。</dd> + <dt><a href="/zh-TW/docs/MDN/Contribute/Howto/Create_an_interactive_exercise_to_help_learning_the_web">提供練習題、範例或是互動式的教學工具。</a>(<em>? 小時</em>)</dt> + <dd>我們所有的文章都需要 "active learning" 的素材在內,因為讓人們學習的最好途徑就是讓他們自己實作。這些素材會是練習題或互動式的內容,能協助使用者將文章內詳述的概念實際運用。有很多方式能夠製作 "active learning" 的內容,像是使用 <a href="http://jsfiddle.net" rel="external">JSFiddle</a> 或相似的工具提供範例程式碼,或使用<a href="https://thimble.mozilla.org/" rel="external">Thimble</a>提供互動式的內容。 好好發揮你得創造力吧!</dd> +</dl> + +<h2 id="我是教師">我是教師</h2> + +<p>MDN 有著精良的技術史,但我們對教導新人觀念的最佳方法,缺乏深入了解。針對這方面,我們需要借重做為教師或導師身份的你。你能幫我們確保給讀者們的內容,有著良好而實用的教育路徑(educational track)。</p> + +<dl> + <dt><a href="/zh-TW/docs/Glossary">閱讀並評價術語表</a>(約十五分鐘)</dt> + <dd>Check out a glossary entry and feel free to make any changes you think are necessary. If you want to discuss the content before editing, ping us on <a href="/zh-TW/docs/MDN/Community#Join_our_mailing_lists">our mailing list</a> or <a href="/zh-TW/docs/MDN/Community#Get_into_IRC">IRC channel</a>.</dd> + <dt><a href="/docs/MDN/Contribute/Howto/Write_a_new_entry_in_the_Glossary">撰寫新的術語</a>(約一小時)</dt> + <dd>Clear, simple definitions of terms and basic overviews of concepts in the glossary are critical in meeting beginners' needs. Your experience as an educator can help create excellent glossary entries; we have <a href="/zh-TW/docs/Glossary#Contribute">many undefined terms</a> which need your attention. Pick one and go for it.</dd> + <dt><a href="/en-US/docs/tag/needsSchema">添加實例或圖表至文章</a> (<em>約一小時</em>)</dt> + <dd>As you might know, illustrations are an invaluable part of any learning content. This is something we often lack on MDN and your skills can make a difference in that area. Check out the <a href="/zh-TW/docs/tag/needsSchema">articles that lack illustrative content</a> and pick one you'd like to create graphics for.</dd> + <dt><a href="/en-US/Learn/Index">閱讀並審核教學文章</a> (約兩小時)</dt> + <dd>This is similar to reviewing glossary entries (see above), but it requires more time since the articles are typically quite a bit longer.</dd> + <dt><a href="/en-US/docs/MDN/Contribute/Howto/Write_an_article_to_help_learn_about_the_Web">撰寫新的教學文章</a> (<em>約四小時</em>)</dt> + <dd>We need simple, straightforward articles about the Web ecosystem and other functional topics around it. Since these learning articles need to be educational rather than trying to literally cover everything there is to know, your experience in knowing what to cover and how will be a great asset.</dd> + <dt><a href="/en-US/docs/MDN/Contribute/Howto/Create_an_interactive_exercise_to_help_learning_the_web">建立練習題,測驗或是互動式的學習工具</a>(<em>? 小時</em>)</dt> + <dd>All our learning articles require "active learning" materials. Such materials are exercises or interactive content which help a user learn to use and expand upon the concepts detailed in an article. There are lots of things you can do here, from creating quizzes to building fully hackable interactive content with <a href="https://thimble.mozilla.org/" rel="external">Thimble</a>. Unleash your creativity!</dd> + <dt><a href="/en-US/docs/MDN/Contribute/Howto/Create_learning_pathways">建立學習途徑</a> (<em>? 小時</em>)</dt> + <dd>In order to provide progressive and comprehensible tutorials, we need to shape our content into pathways. It's a way to gather existing content and figure out what is missing to create a learning article to write.</dd> +</dl> diff --git a/files/zh-tw/orphaned/learn/html/forms/html5_updates/index.html b/files/zh-tw/orphaned/learn/html/forms/html5_updates/index.html new file mode 100644 index 0000000000..6d83f5efea --- /dev/null +++ b/files/zh-tw/orphaned/learn/html/forms/html5_updates/index.html @@ -0,0 +1,83 @@ +--- +title: Forms in HTML +slug: Web/HTML/Forms_in_HTML +translation_of: Learn/HTML/Forms/HTML5_updates +--- +<div> + {{gecko_minversion_header("2")}}</div> +<h2 id="摘要">摘要</h2> +<p>HTML5的Form元素及其屬性比HTML4提供更大程度的語意標記,也移除了原本許多在HTML4所需要的繁瑣程式碼腳本與樣式控制。HTML5的Form元素讓表單在跨網頁上有更好的一致性,也提供即時的使用者輸入回饋,因為這些特色,HTML5的Form元素在使用者體驗上有更好的表現,甚至,這些體驗依然適用在瀏覽器關閉程式碼腳本執行的情況下。</p> +<p>本文旨在討論Gecko/Firefox, version 4或更新版本在新的或變更後的Form元素特色上的支援。</p> +<h2 id="<input>元素"><input>元素</h2> +<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input"><input></a>元素的<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type">type</a>屬性新增了一些屬性值。</p> +<ul> + <li><code>search</code>: 代表此為搜尋欄位,換行符號會自動從輸入值中刪除且沒有其他語法是必須的。</li> + <li><code>tel</code>: 代表此為電話編輯欄位,換行符號會自動從輸入值中刪除且沒有其他語法是必須的。基於各國電話號碼不一,你可以利用<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-pattern" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-pattern">pattern</a>和<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-maxlength" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-maxlength">maxlength</a>屬性來限制輸入。</li> + <li><code>url</code>: 代表此為URL編輯欄位,換行符號與前後空白符號會自動從輸入值中刪除。</li> + <li> + <p><code>email</code>: 代表此為email欄位,換行符號會自動從輸入值中刪除。只有在輸入符合ABNF規範: 1*( atext / "." ) "@" ldh-str 1*( "." ldh-str ),其中atext定義在<a href="http://tools.ietf.org/html/rfc5322#section-3.2.3" title="http://tools.ietf.org/html/rfc5322#section-3.2.3">RFC 5322 section 3.2.3</a>,而ldh-str定義在<a href="http://tools.ietf.org/html/rfc1034#section-3.5" title="http://tools.ietf.org/html/rfc1034#section-3.5">RFC 1034 section 3.5</a>。</p> + <div class="note"> + <strong>Note:</strong> 當有設定<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-multiple" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-multiple">multiple</a>屬性時,可以用逗號分隔email來一次輸入多個email,但目前FireFox不支援此功能。</div> + </li> +</ul> +<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input"><input></a>元素同時也新增了一些屬性:</p> +<ul> + <li>{{htmlattrxref("list", "input")}}: <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist"><datalist></a>元素的ID,這個元素下的內容,亦即<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option"><option></a>元素的值會顯示在輸入欄位的建議區來用於提示訊息。</li> + <li>{{htmlattrxref("pattern", "input")}}: 一個用來檢查輸入的正規表達式(regular expression),當type屬性值為text, tel, search, url與email時可以使用。</li> + <li>{{htmlattrxref("form", "input")}}: 指示該<input>隸屬於哪一個<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form"><form></a>元素的一串文字,一個input只能隸屬於一個form下。</li> + <li>{{htmlattrxref("formmethod", "input")}}: 指示使用的HTTP方法(GET或POST),這個屬性值會取代<form>元素下<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-method" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-method">method</a>屬性所定義的HTTP方法。這個屬性只有在<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form" title="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form">form</a>屬性出現而且type值為image或submit時才有效。</li> + <li>{{htmlattrxref("x-moz-errormessage", "input")}} {{non-standard_inline}}: 當欄位驗證失敗時顯示的訊息,此為Mozilla擴充功能、非標準。</li> +</ul> +<h2 id="<form>元素"><form>元素</h2> +<p>{{HTMLElement("form")}} 元素新增了一些屬性</p> +<ul> + <li>{{htmlattrxref("novalidate", "form")}}: 當表單送出時,阻止表單驗證。</li> +</ul> +<h2 id="The_datalist_element" name="The_datalist_element"> <code><datalist></code>元素</h2> +<p>{{HTMLElement("datalist")}}元素是{{HTMLElement("option")}}元素的列表,{{HTMLElement("option")}}元素會用於提示輸入建議。</p> +<p>可以利用{{HTMLElement("input")}}的{{htmlattrxref("list", "input")}}屬性來連結{{HTMLElement("input")}}元素與{{HTMLElement("datalist")}}</p> +<h2 id="The_output_element" name="The_output_element"><code><output></code>元素</h2> +<p><code>{{HTMLElement("output")}}</code>元素代表運算結果。</p> +<p>可以利用{{htmlattrxref("for", "output")}}屬性來設定<code>{{HTMLElement("output")}}</code>元素和其他影響計算結果的元素(如input或參數)的關係,{{htmlattrxref("for", "output")}}屬性的值為一串以空白分隔的元素ID。</p> +<p>{{non-standard_inline}} Gecko2.0(不一定適用其他瀏覽器引擎)支援自定義{{HTMLElement("output")}}元素的驗證條件和錯誤訊息,所以提供了其{{Cssxref(":invalid")}}, {{Cssxref(":valid")}}, {{Cssxref(":-moz-ui-invalid")}}和 {{Cssxref(":-moz-ui-valid")}}的CSS pseudo-class,在以下狀況這個特色將很有用,例如沒有輸入值有問題,但計算結果違反了商業規則(好比說總百分比不可超過100)。</p> +<h2 id="The_placeholder_attribute" name="The_placeholder_attribute">placeholder屬性</h2> +<p><code>{{HTMLElement("input")}}</code>元素和<code>{{HTMLElement("textarea")}}</code>元素的{{htmlattrxref("placeholder", "input")}}屬性會在輸入欄位上顯示輸入提示,這個屬性的值不可以含有回車或換行符號。</p> +<h2 id="The_autofocus_attribute" name="The_autofocus_attribute">autofocus屬性</h2> +<p>{{htmlattrxref("autofocus", "input")}}屬性指示除非使用者另有指定(例如在其他控制項上進行輸入操作),否則當載入網頁時表單控制項要自動聚焦於特定元素上;autofocus屬性值為布林值(Boolean),一份文件只能有一份表單設定autofocus屬性。能夠設定這個屬性的元素有<code>{{HTMLElement("input")}}</code>, <code>{{HTMLElement("button")}}</code>, <code>{{HTMLElement("select")}}</code>與<code>{{HTMLElement("textarea")}}</code>,不過當{{htmlattrxref("type", "input")}}屬性為隱藏(hidden)下,autofocus是無效的,也就是說,不能自動聚焦於隱藏元素上。</p> +<h2 id="The_label.control_DOM_property" name="The_label.control_DOM_property">label.control DOM屬性</h2> +<p><code><a href="/en-US/docs/DOM/HTMLLabelElement" title="DOM/HTMLLabelElement">HTMLLabelElement</a></code> DOM介面提供了<code>{{HTMLElement("label")}}</code>元素一個新的control屬性,control屬性會回傳被標記的控制項,這個控制項便是該label適用的控制項,也就是<label>元素{{htmlattrxref("for", "label")}}屬性指定的元素(如果有的話)或是第一個後代控制項元素。</p> +<h2 id="Constraint_Validation" name="Constraint_Validation">約束驗證</h2> +<p>HTML5提供了客戶端表單驗證的語法和API,基於安全性與資料正確性,雖然這並不能取代伺服器端驗證,但是客戶端驗證可以提拱使用者更好的立即輸入回饋體驗。</p> +<p>當{{HTMLElement("input")}}元素設定了title屬性,其值會作為提示框之內容,若是驗證失敗,提示框的內容會換成相關的錯誤訊息,我們可以利用非標準的{{htmlattrxref("x-moz-errormessage")}}屬性或setCustomValidity()方法來自定義錯誤訊息。</p> +<pre class="brush: html"><input type="email" title="Please, provide an e-mail" x-moz-errormessage="This is not a valid e-mail"></pre> +<div class="note"> + <strong>Note:</strong> 約束驗證不支援表單的{{HTMLElement("button")}}元素,若是想根據表單驗證果來設定按鈕樣式,可以利用{{cssxref(":-moz-submit-invalid")}} pseudo-class。</div> +<h3 id="HTML_Syntax_for_Constraint_Validation" name="HTML_Syntax_for_Constraint_Validation">約束驗證的HTML語法</h3> +<p>下列是HTML5用來約束表單資料的語法</p> +<ul> + <li>{{HTMLElement("input")}}, {{HTMLElement("select")}},和{{HTMLElement("textarea")}}的{{htmlattrxref("required", "input")}}屬性表示輸入不可為空。{{HTMLElement("input")}}元素在用{{htmlattrxref("required", "input")}}屬性時需要搭配某些特定{{htmlattrxref("type", "input")}}屬性值)</li> + <li>{{HTMLElement("input")}}元素的{{htmlattrxref("pattern", "input")}}屬性規範了輸入必須符合指定的正規表達式。</li> + <li>{{HTMLElement("input")}}元素的{{htmlattrxref("min", "input")}}和{{htmlattrxref("max", "input")}}屬性規範了最小和最大輸入值。</li> + <li>{{HTMLElement("input")}}元素的{{htmlattrxref("step", "input")}}屬性(和{{htmlattrxref("min", "input")}}和{{htmlattrxref("max", "input")}}屬性結合使用)規範了輸入值一次調整的幅度,當輸入值不符合允許的調整幅度即驗證失敗。</li> + <li>{{HTMLElement("input")}}和{{HTMLElement("textarea")}}元素的{{htmlattrxref("maxlength", "input")}}屬性規範了最大輸入字元數(以Unicode編碼計算)。</li> + <li>{{htmlattrxref("type", "input")}}值的url和email表示輸入必須是合格的URL或email格式。</li> +</ul> +<p>另外,我們可以在{{HTMLElement("form")}}元素上設定{{htmlattrxref("novalidate", "form")}}屬性或是在{{HTMLElement("button")}}元素以及{{htmlattrxref("type", "input")}}為submit或image的{{HTMLElement("input")}}元素上設定{{htmlattrxref("formnovalidate", "button")}}屬性來避免輸入約束驗證。這些屬性都會指示表單送出時不要進行驗證。</p> +<h3 id="Constraint_Validation_API" name="Constraint_Validation_API">約束驗證API</h3> +<p>下列是客戶端驗證可用的DOM屬性和方法:</p> +<ul> + <li><code><a href="/en-US/docs/DOM/HTMLFormElement" title="DOM/HTMLFormElement">HTMLFormElement</a></code>物件有checkValidity()方法會回傳true當表單下所有元素都通過約束驗證,false當任一沒有通過。</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement?redirectlocale=en-US&redirectslug=DOM%2FHTMLFormElement" title="https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement?redirectlocale=en-US&redirectslug=DOM%2FHTMLFormElement">表單相關元素:</a> + <ul> + <li><code>willValidate</code> 屬性為false若該元素沒有通過驗證。</li> + <li><code>validity</code> 屬性( <code><a href="/en-US/docs/DOM/ValidityState" title="DOM/ValidityState Interface">ValidityState</a></code> 物件)代表該元素目前的驗證結果。</li> + <li><code>validationMessage</code>屬性是驗證失敗時的訊息。</li> + <li><code>checkValidity()</code> 方法會回傳true當表單下所有元素都通過約束驗證,false當任一沒有通過。</li> + <li><code>setCustomValidity()</code> 可以自定義驗證失敗訊息。</li> + </ul> + </li> +</ul> +<h2 id="See_also">See also</h2> +<ul> + <li><a href="/en-US/docs/HTML/Forms" title="/en-US/docs/HTML/Forms">HTML Forms Guide</a></li> +</ul> diff --git a/files/zh-tw/orphaned/mdn/community/conversations/index.html b/files/zh-tw/orphaned/mdn/community/conversations/index.html new file mode 100644 index 0000000000..955d241ece --- /dev/null +++ b/files/zh-tw/orphaned/mdn/community/conversations/index.html @@ -0,0 +1,53 @@ +--- +title: MDN的社群論壇 +slug: MDN/Community/論壇 +tags: + - MDN 資料 + - 指南 + - 社群論壇 +translation_of: MDN/Community/Conversations +--- +<div>{{MDNSidebar}}</div> + +<div>MDN的『 工作 』通常在MDN的網頁上,但『社群』也會透過異步討論(Asynchronous discussions),及同步線上討論或會議(Synchronous chat)進行。</div> + +<h2 id="異步討論_Asynchronous_discussions">異步討論 Asynchronous discussions</h2> + +<p>為了分享資訊及持續的溝通,MDN在Mozilla論壇中有獨立的類別(<a href="https://discourse.mozilla.org/c/mdn/zh-TW/docs/">"MDN"</a>),這個類別連結所有與MDN相關的主題,包括文檔內容的創建,翻譯和維護; MDN平台開發;以及計劃,目標設定和進度跟踪。</p> + +<ul> + <li>為了加入To join Mozilla's Discourse, see <a href="https://discourse.mozilla-community.org/t/signing-up-and-logging-in/16017">Signing up and logging in</a>; if you have a Mozilla LDAP account, you can use that instead of "Login with email".</li> + <li>To subscribe to the MDN category, see <a href="https://discourse.mozilla-community.org/t/subscribing-to-categories-and-topics/16024">Subscribing to categories and topics</a>.</li> + <li>(Optional) If you prefer to interact with Discourse primarily by email, see <a href="https://discourse.mozilla-community.org/t/mailman-mode/15279">Set up a mailing list experience for yourself</a>. You can start a discussion in Discourse by sending an email message to: <a href="mailto://mdn@mozilla-community.org">mdn@mozilla-community.org</a>. If you use Discourse via email, you can reply to a message by replying to the notification email that you receive. If you want to intersperse comments inline within a reply, please put two carriage-returns before and after your inline chunks, so that Discourse parses them correctly.</li> +</ul> + +<h3 id="歷史檔案館"><a href="https://www.books.com.tw/products/0010621631">歷史檔案館</a></h3> + +<p>Prior to June 2017, MDN-related discussions took place in mailings lists that were gatewayed and archived with Google groups. If you want to search these past discussions, you can look at the Google groups corresponding to the old mailing lists. (Yes, we know these names are overlapping and confusing. Historical accident. Sorry about that.)</p> + +<dl> + <dt><a href="https://groups.google.com/forum/#!forum/mozilla.dev.mdc">mozilla.dev.mdc</a> a.k.a. <strong>dev-mdc</strong></dt> + <dd>This list was for discussions about documentation content on MDN.</dd> + <dt><a href="https://groups.google.com/forum/#!forum/mozilla.dev.mdn">mozilla.dev.mdn </a>a.k.a. <strong>dev-mdn</strong></dt> + <dd>This list was about the development work on MDN's underlying <a href="/en-US/docs/Project:MDN/Kuma">Kuma</a> platform.</dd> + <dt><a href="https://groups.google.com/forum/#!forum/mozilla.mdn">mozilla.mdn </a>a.k.a. <strong>mdn@</strong></dt> + <dd>This forum was for high-level planning and prioritization discussions, for the MDN website and other related initiatives.</dd> +</dl> + +<h2 id="同步討論(Synchronous_chat)">同步討論(Synchronous chat)</h2> + +<p>Mozilla's platform for real-time discussions is <a href="https://matrix.org/">Matrix</a>, a chat protocol for which <a href="https://chat.mozilla.org/">Mozilla has its own server</a>.</p> + +<p>The <a href="https://chat.mozilla.org/#/room/#mdn:mozilla.org">MDN Web docs chat room</a> is a major channel for discussing the content of MDN. We talk about writing, organization of content, and so on. We also have "water cooler" conversations here—it's a way our community can keep in touch and just hang out. This room is most likely to be active during weekdays in North America and Europe.</p> + +<p>You might want to learn more about using <a href="https://wiki.mozilla.org/Matrix">Matrix with Mozilla</a>, and, if you're really into it, install a stand-alone Matrix application such as <a href="https://about.riot.im/">Riot.im</a>.</p> + +<h3 id="IRC?"> IRC?</h3> + +<p>For many years, Mozilla used Internet Relay Chat (IRC) for real-time discussions. As of early 2020, IRC has been deprecated in favor of Matrix. You may see references to IRC channels in many places, including on MDN. You can help by updating links to IRC channels that you find on MDN to point to the corresponding Matrix rooms instead. If you're not sure what the Matrix room is for a topic, ask in the <a href="https://chat.mozilla.org/#/room/#general:mozilla.org">General</a> room. Projects or topics that are no longer active might not have a Matrix room; in such cases, just delete the link.</p> + +<h2 id="參與我們的會議_或其他活動">參與我們的會議 (或其他活動)</h2> + +<p>MDN團隊舉辦了許多對MDN社群開放的常規會議,請參閱Mozilla wiki上的<a href="https://wiki.mozilla.org/MDN/Meetings">MDN Meetings</a>頁面,可以獲取日程、議程、註釋相關以及如何加入的訊息。</p> + +<p>有關這些會議及其他會議,當地聚會和其他活動,可參閱<a href="https://www.google.com/calendar/embed?src=mozilla.com_2d35383434313235392d323530%40resource.calendar.google.com">MDN 活動日曆</a>。定期會議會呈現在<a href="https://wiki.mozilla.org/MDN/Meetings">MDN Meetings wiki page</a>。</p> diff --git a/files/zh-tw/orphaned/mdn/community/index.html b/files/zh-tw/orphaned/mdn/community/index.html new file mode 100644 index 0000000000..3c6fcda1a2 --- /dev/null +++ b/files/zh-tw/orphaned/mdn/community/index.html @@ -0,0 +1,52 @@ +--- +title: 加入 MDN 社群 +slug: MDN/Community +tags: + - 教學 + - 社群 +translation_of: MDN/Community +--- +<div>{{MDNSidebar}}</div> + +<div>{{IncludeSubnav("/zh-TW/docs/MDN")}}</div> + +<div class="summary"> +<p>MDN (Mozilla Developer Network 的縮寫) 比 wiki 更強大: 它是一個屬於開發者們的社群,致力於讓 MDN 這個龐大資源更加傑出。</p> +</div> + +<p>我們非常感謝您對 MDN 的貢獻,但是我們更希望您加入我們的社群,這裡有三個加入我們社群的方法:</p> + +<ol> + <li><a href="/zh-TW/docs/MDN/Contribute/Howto/Create_an_MDN_account">建立 MDN 帳戶</a></li> + <li><a href="/zh-TW/docs/MDN/Community/論壇">加入會談</a></li> + <li><a href="/zh-TW/docs/MDN/Community/Whats_happening">追蹤新資訊</a></li> +</ol> + +<h2 id="社群如何運作">社群如何運作</h2> + +<p>以下更多文章關於更多 MDN 的社群。</p> + +<div class="row topicpage-table"> +<div class="section"> +<dl> + <dt class="landingPageList"><a href="/zh-TW/docs/MDN/Community/Roles">社群角色</a></dt> + <dd class="landingPageList">在MDN社群中,有著許多負責不同部分的角色。</dd> + <dt class="landingPageList"><a href="/zh-TW/docs/MDN/Community/Doc_sprints">文件生成聚會</a></dt> + <dd class="landingPageList">這是一個文件生成聚會的指南。它包含了過去人們舉辦文件生成聚會所提供的一些建議與訣竅,以幫助你也舉辦一個。</dd> + <dt class="landingPageList"><a href="/zh-TW/docs/MDN/Community/Whats_happening">追蹤新資訊</a></dt> + <dd class="landingPageList">MDN 是由 <a class="external" href="https://wiki.mozilla.org/MDN">Mozilla Developer Network community</a> 所維護。 這裡有一些我們分享我們在做什麼的資訊管道。</dd> +</dl> + +<dl> +</dl> +</div> + +<div class="section"> +<dl> + <dt class="landingPageList"><a href="/zh-TW/docs/MDN/Community/Conversations">MDN社群會議</a></dt> + <dd class="landingPageList">許多的社群工作都發生在MDN上,然而社群工作也同時發生在一些 討論(非即時性) 與 線上聊天或會議(即時性)中。</dd> + <dt class="landingPageList"><a href="/zh-TW/docs/MDN/Community/Working_in_community">與社群一同工作</a></dt> + <dd class="landingPageList">絕大部分相當程度對於MDN文件的貢獻來自於了解如何與社群一同工作。這份文章提供一些訣竅以幫助你與其他文件生成者及開發團隊交流。</dd> +</dl> +</div> +</div> diff --git a/files/zh-tw/orphaned/mdn/contribute/howto/create_an_mdn_account/index.html b/files/zh-tw/orphaned/mdn/contribute/howto/create_an_mdn_account/index.html new file mode 100644 index 0000000000..6f3f294e88 --- /dev/null +++ b/files/zh-tw/orphaned/mdn/contribute/howto/create_an_mdn_account/index.html @@ -0,0 +1,34 @@ +--- +title: 如何創建 MDN 帳戶 +slug: MDN/Contribute/Howto/Create_an_MDN_account +translation_of: MDN/Contribute/Howto/Create_an_MDN_account +--- +<div>{{MDNSidebar}}</div><p><span class="seoSummary">要針對 MDN 做出任何改變,你需要一個 MDN 帳戶。不要擔心,如果你只是想閱讀和搜索 MDN,你並不需要帳戶!這個簡單的指南幫助你設置 MDN 帳戶。</span></p> + +<div class="pull-aside"> +<div class="moreinfo"><strong>為什麼 MDN 需要我的電子郵件地址?</strong><br><br> + +<p>你的電子郵件地址用於帳戶恢復,MDN 管理員也會在必要時,用它來和你討論你的帳戶或你在網站上的活動。</p> +<p>此外,你可以選擇註冊的通知(例如<a href="/zh-TW/docs/MDN/Contribute/Howto/Watch_a_page">特定頁面被更改時</a>)和信息(例如,如果你選擇加入我們的 beta 測試團隊,你可能會收到需要測試的新功能)的電子郵件。</p> +<p>你的電子郵件地址永遠不會在 MDN 顯示,而且只會在符合我們的<a href="https://www.mozilla.org/privacy/websites/">隱私權政策</a>下使用。</p> + +<div class="note">如果你透過 Github 登入 MDN,而且在 Github 使用了 noreply 的電子郵件地址,你<em>不會</em>收到來自 MDN 的訊息(包含你訂閱頁面的訊息)。</div> +</div> +</div> + +<ol> + <li>在 MDN 每一頁的最上方,你會發現有一個<strong>登入</strong>的按鈕。滑鼠滑到那邊後點一下(如果是移動設備就輕按)以表列 MDN 支持的驗證服務列表。</li> + <li>選擇要登入的服務。目前只支持 GitHub。請注意如果選了 GitHub,你的 MDN 公開用戶頁會包含一個指向你 GitHub 頁面的連結。</li> + <li>按照 GitHub 的提示把您的帳戶連接到 MDN。</li> + <li>一旦認證服務把你帶回 MDN 以後,MDN 就會提示你輸入一個用戶名和電子郵件地址。<em><strong>您的用戶名會被公開顯示以表彰你所做的工作。不要使用您的電子郵件地址作為用戶名。</strong></em>。</li> + <li>點擊「創建我的 MDN 配置文件」按鈕。</li> + <li>如果您在步驟四指定的電子郵件地址,與認證服務使用的不一樣,你需要檢查這個電子郵件地址,並點擊確認電子郵件中的鏈接。</li> +</ol> + +<p>就是這樣!你有一個MDN帳戶,並可以立即編輯或標籤頁,或者提交演示!</p> + +<p>您可以在任何 MDN 頁面的頂部點擊你的名字,看看你的公開檔案。從那裡,你可以點擊「編輯」按鈕,進行更改或添加到您的個人資料,所以你可以分享更多關於您的利益,把鏈接添加到你的推特帳戶或部落格等等。</p> + +<div class="note"> +<p>用戶名新不能包含空格或“@”字符。請記住,你的用戶名會被公開顯示,以確定你所做的工作!</p> +</div> diff --git a/files/zh-tw/orphaned/mdn/contribute/howto/do_a_technical_review/index.html b/files/zh-tw/orphaned/mdn/contribute/howto/do_a_technical_review/index.html new file mode 100644 index 0000000000..ecb35fe0be --- /dev/null +++ b/files/zh-tw/orphaned/mdn/contribute/howto/do_a_technical_review/index.html @@ -0,0 +1,50 @@ +--- +title: 如何進行技術審查 +slug: MDN/Contribute/Howto/Do_a_technical_review +translation_of: MDN/Contribute/Howto/Do_a_technical_review +--- +<div>{{MDNSidebar}}</div><div>{{IncludeSubnav("/zh-TW/docs/MDN")}}</div> + +<p class="summary"><strong>技術審查</strong>包含檢查文章的正確與完整性,並在需要時進行修正。若文章作者需要其他人來檢查文章的技術性內容,可以在編輯時勾選「技術審查」(Technical review)。通常由作者連絡特定工程師來進行技術審查,但具備該主題技術專長者亦可參與。</p> + +<p><span class="seoSummary">本文描述如何執行技術審查,以協助確保 MDN 的內容是正確的。</span></p> + +<dl> + <dt>要做什麼?</dt> + <dd>審查並修正文章在技術上的正確與完整性。</dd> + <dt>要審查的文章在哪?</dt> + <dd>找被標記為「<a href="/zh-TW/docs/needs-review/technical">技術審查</a>」(technical review)的特定文章。</dd> + <dt>要知道些什麼?</dt> + <dd> + <ul> + <li>針對文章主題的專業知識。若閱讀該文章並沒有對你傳授非常新的東西,那就視你自己為專家。</li> + <li>編輯 MDN 上維基文章的方法。</li> + </ul> + </dd> + <dt>有哪些步驟?</dt> + <dd> + <ol> + <li>選擇要審查的文章 + <ol> + <li>前往<a href="/zh-TW/docs/needs-review/technical">技術審查</a>(technical reviews)清單頁面。這裡列出所有請求技術審查的頁面。</li> + <li>選擇一個頁面,而你對該主題非常熟練。</li> + <li>點擊文章連結以載入頁面。</li> + </ol> + </li> + <li><a id="core-steps" name="core-steps"></a>閱讀文章並密切關注技術性細節:這篇文章正確嗎?有沒有漏掉什麼?若初次選擇的頁面並不適合由你來審查,不要猶豫,選擇其他頁面。</li> + <li>若沒有錯誤,你不需要透過編輯將文章標記為已審查。找到頁面左方側邊攔的「快速回顧」(quick review),黃色框框會列出任何等待中的審查,並讓你清除審查請求的標記。若有審查請求會顯示如下:<br> + <img alt="Screenshot of the sidebar's box listing reviews that have been requested and allowing the flags to be changed." src="https://mdn.mozillademos.org/files/13016/SidebarTechReviewRequested.png"></li> + <li>取消選取「<strong>技術</strong>」(<strong>Technical</strong>),然後點擊「<strong>儲存</strong>」(<strong>Save</strong>)。</li> + <li>若發現有錯誤需要修正,亦可在編輯器中改變審查請求的狀態。操作過程如下: + <ol> + <li>點擊靠近頁面頂端的「<strong>編輯</strong>」(<strong>Edit</strong>)按鈕以編輯頁面,這會帶你到 <a href="/en-US/docs/MDN/Contribute/Editor">MDN editor</a>。</li> + <li>修正任何錯誤的技術資訊,並且(或者)增加任何重要但被遺漏的訊息。</li> + <li>在文章底部填寫<strong>版本註解</strong>(<strong>Revision Comment</strong>)。這是用來描述你做了什麼事的簡短訊息,如:「技術審查完成」。當你做了些修正,將相關資訊納入你的註解,如:「技術審查並修正參數描述」。這會幫助其他貢獻者和網站編輯知道你變更的內容和理由。你也可提出(若有的話)自認不夠資格審查的部分。</li> + <li>在 「<strong>需要審核嗎?</strong>」(<strong>Review Needed?</strong>) 下方,取消選取「<strong>技術</strong>」(<strong>Technical</strong>),就在頁面底部版本註解區塊附近。</li> + <li>點擊「<strong>發布</strong>」(<strong>PUBLISH</strong>)按鈕。</li> + </ol> + </li> + </ol> + <p>恭喜!你已經完成你的第一份技術審查!感謝你的幫助!</p> + </dd> +</dl> diff --git a/files/zh-tw/orphaned/mdn/contribute/howto/do_an_editorial_review/index.html b/files/zh-tw/orphaned/mdn/contribute/howto/do_an_editorial_review/index.html new file mode 100644 index 0000000000..8ef91de87d --- /dev/null +++ b/files/zh-tw/orphaned/mdn/contribute/howto/do_an_editorial_review/index.html @@ -0,0 +1,55 @@ +--- +title: 如何進行編輯審查 +slug: MDN/Contribute/Howto/Do_an_editorial_review +tags: + - 如何 + - 指南 + - 文件 + - 編輯審查 +translation_of: MDN/Contribute/Howto/Do_an_editorial_review +--- +<div>{{MDNSidebar}}</div> + +<div>{{IncludeSubnav("/zh-TW/docs/MDN")}}</div> + +<p class="summary">一個主題的編輯審查包含錯字、拼字、文法、語法或其他文字錯誤。並非所有貢獻者都是語言專家,但他們的知識可以提供極為有用的資訊,因此需要審稿和校對。這就是編輯審查在做的事。</p> + +<p><span class="seoSummary">這個主題將會介紹如何進行編輯審查,以幫助確保在 MDN 的資訊是正確的。</span></p> + +<dl> + <dt>有哪些任務?</dt> + <dd>必要的有審稿和校對。</dd> + <dt>有哪些東西需要編輯審查?</dt> + <dd>那些被標記需要審查的主題。</dd> + <dt>進行編輯審查需要知道什麼?</dt> + <dd>你需要具有良好的英文文法和拼字能力(即能準確翻譯英文成中文的能力)。編輯審查在於確保文法、拼字和語法的正確和意義,並遵守 <a href="/zh-TW/docs/MDN/Contribute/Guidelines/Writing_style_guide">MDN 編輯指南</a>。</dd> + <dt>有哪些步驟?</dt> + <dd> + <ol> + <li>選擇一個主題: + <ol> + <li>前往<a href="/zh-TW/docs/needs-review/editorial">待審查清單</a>。這個表列出了要求審查的主題。</li> + <li>選擇一個中文標題且不帶有 <code>Template:</code> (<code>Template:</code> 包含 MDN 功能碼) 的主題。</li> + <li>點擊該主題的連結。</li> + </ol> + </li> + <li>閱讀主題,注意錯字、拼字、文法、語法或其他錯誤。如果你覺得無法應付,請找下一個主題。</li> + <li>如果沒有錯誤,你不需要編輯主題來標記為已審查。在左方導覽列尋找「快速審查」方塊:<br> + <img alt="快速審查" src="http://i.imgur.com/3T2JKns.jpg" style="height: 104px; width: 321px;"></li> + <li>取消選取 <strong>編輯 </strong>方塊並點擊 <strong>儲存。</strong></li> + <li>如果有錯誤需要被糾正: + <ol> + <li>點擊在頁面頂端附近的 <strong>編輯</strong> 按鈕,接著會轉到 <a href="/zh-TW/docs/MDN/Contribute/Editor">MDN 編輯器</a>。</li> + <li>修正你找到的錯字、拼字、文法、語法或其他錯誤。你並不需要修正所有錯誤,但若你不確定你已經完整的審查主題,請留下編輯審查請求。</li> + <li>在主題尾端留下 <strong>版本註解</strong> 。像是「編輯審查:修正錯字、文法和拼字」。這能讓其他貢獻者和網站編輯者知道你改了什麼和為什麼。</li> + <li>取消選取在 <strong>需要審查嗎?</strong> 中的 <strong>編輯 </strong>方塊。他在版本註解下面。</li> + <li>按下 <strong>發布</strong>。</li> + </ol> + </li> + </ol> + + <div class="note"> + <p>你的變更不一定會立刻出現,他可能會因送出和儲存延遲一會。</p> + </div> + </dd> +</dl> diff --git a/files/zh-tw/orphaned/mdn/contribute/howto/set_the_summary_for_a_page/index.html b/files/zh-tw/orphaned/mdn/contribute/howto/set_the_summary_for_a_page/index.html new file mode 100644 index 0000000000..e44a6fb7ce --- /dev/null +++ b/files/zh-tw/orphaned/mdn/contribute/howto/set_the_summary_for_a_page/index.html @@ -0,0 +1,50 @@ +--- +title: 如何撰寫文章摘要? +slug: MDN/Contribute/Howto/Set_the_summary_for_a_page +tags: + - 摘要 +translation_of: MDN/Contribute/Howto/Set_the_summary_for_a_page +--- +<div>{{MDNSidebar}}</div><p> </p> + +<p><span class="seoSummary">你可以在MDN用各式各樣的方式來定義一個頁面的摘要,像是搜尋引擎結果,在其他的MDN網頁如某些到達頁(<a href="https://cola.workxplay.net/what-is-an-landing-page/">Landing Pages</a>),以及提示中。他應該是在頁面的上下文中有意義的文本,並且在上下文中顯示時,沒有其餘的頁面內容。</span></p> + +<p>在頁面中摘要是明確定義的。如果沒有被明確定義的話,通成會拿第一句來當摘要,但並不總是最適合的。</p> + +<dl> + <dt> + <h3 id="任務是什麼?"><strong>任務是什麼?</strong></h3> + </dt> + <dd>在頁面中找出可以當成摘要的文字,且用別種文字說明寫成適當的摘要。</dd> + <dt> + <h3 id="哪些地方需要撰寫摘要?"><strong>哪些地方需要撰寫摘要?</strong></h3> + </dt> + <dd>缺少摘要的頁面,或是摘要不足的頁面。</dd> + <dt> + <h3 id="撰寫摘要之前,你需要具備知道什麼?"><strong>撰寫摘要之前,你需要具備/知道什麼?</strong></h3> + </dt> + <dd>會使用MDN編輯器、擅長寫英文作文以及對於該頁面要有足夠的了解,才能寫出好的摘要。</dd> + <dt> + <h3 id="撰寫摘要的步驟:"><strong>撰寫摘要的步驟:</strong></h3> + </dt> + <dd> + <ol> + <li>選一個頁面: + <ol> + <li>在 <a href="/en-US/docs/MDN/Doc_status">MDN documentation status</a> 頁面中, 在<strong>Sections(章節)</strong>下方,點選任何一個你熟悉或是對其有所了解的標題連結(ex:HTML):<br> + <img alt="" src="https://mdn.mozillademos.org/files/8681/sections.png" style="height: 130px; width: 504px;"></li> + <li>在此文件狀態頁面上方的摘要表格內,點選<strong>Pages(頁面)。</strong>點選後會導向關於這個標題(ex:HTML)的全部頁面的索引頁。左邊欄位顯示這個頁面的連結,右邊則是顯示tags(標籤)以及該頁面的摘要。<img alt="" src="https://mdn.mozillademos.org/files/8675/pages.png" style="height: 82px; width: 361px;"></li> + <li>挑選一個沒有摘要的頁面,或是摘要太少的頁面:<br> + <img alt="" src="https://mdn.mozillademos.org/files/8677/summary.png" style="height: 38px; width: 296px;"></li> + <li>點選該頁面的連結。</li> + </ol> + </li> + <li>點選<strong>編輯</strong>打開MDN編輯器。</li> + <li>找出一句或是兩句可以總結上下文的摘要。如果需要的話,編輯現有的內容以創造或是修改成好的摘要。</li> + <li>選擇要當成摘要的文字。</li> + <li>點選在編輯器工具列中的格式化樣式,選擇<strong>SEO Summary</strong>. (在原始碼中,這會在被選起來的文字旁,產生一個HTML元素: {{HTMLElement("span")}} element with <code>class="seoSummary"</code> )<br> + <img alt="" src="https://mdn.mozillademos.org/files/8679/styles.png" style="height: 231px; width: 403px;"></li> + <li>使用修訂評論保存您的更改。評論為非必填項目,但我們鼓勵您填寫。能使其他人更容易追蹤文章的變化。</li> + </ol> + </dd> +</dl> diff --git a/files/zh-tw/orphaned/mdn/editor/basics/index.html b/files/zh-tw/orphaned/mdn/editor/basics/index.html new file mode 100644 index 0000000000..d33daf9aeb --- /dev/null +++ b/files/zh-tw/orphaned/mdn/editor/basics/index.html @@ -0,0 +1,55 @@ +--- +title: Editor UI elements +slug: MDN/Editor/Basics +translation_of: MDN/Editor/Basics +--- +<div>{{MDNSidebar}}</div><p><span class="seoSummary">The built-in WYSIWYG editor on MDN is designed to make it as easy as possible to create, edit, and improve articles and other pages almost anywhere on the site.</span> The editor window, shown below, consists of eight key area. This guide provides information about each section so you know how to use our entire editing environment.</p> + +<div class="note"> +<p>We're constantly working on improvements to MDN, so there will be times when this documentation or the screen shots below may be slightly out-of-date. We'll periodically update this documentation, though, to avoid it being unusably behind.</p> +</div> + +<p><img alt="Screenshot of the editor UI (August 2017) with each section labeled" src="https://mdn.mozillademos.org/files/15261/edit-page-with-labels.png" style="border-style: solid; border-width: 2px; height: 723px; width: 808px;"></p> + +<p>The editor UI contains the following sections, as shown above. Click a link below to read about that section of the editor.</p> + +<ul> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Basics/Page_info">Page info</a></li> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Basics/Page_controls">Page controls</a></li> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Basics/Toolbar">Toolbar</a></li> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Edit_box">Edit box</a></li> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Basics/Tags">Tags</a></li> + <li><a href="#Revision_comment">Revision comment</a></li> + <li><a href="#Review_requests">Review requests</a></li> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Basics/Attachments">Attachments</a></li> +</ul> + +<h2 id="Revision_comment">Revision comment</h2> + +<p>After you've made your changes, it's strongly recommended you add a comment to your revision. This is displayed in the revision history for the page, as well as on the <a href="/en-US/dashboards/revisions" title="/en-US/dashboards/revisions">Revision Dashboard</a>. It helps to explain or justify your changes to others that may review your work later. To add a revision comment, simply type the note into the revision comment box before clicking either of the <strong>Publish</strong> buttons at the top or bottom of the page.</p> + +<p>There are a few reasons this is helpful:</p> + +<ul> + <li>If the reason for your change isn't obvious, your note can explain the reasoning to others.</li> + <li>If your change is technically complex, it can explain to editors the logic behind it; this can include a bug number, for example, that editors can refer to for more information.</li> + <li>If your edit involves deleting a large amount of content, you can justify the deletion (for example, "I moved this content to article X").</li> +</ul> + +<h2 id="Review_requests">Review requests</h2> + +<p>The MDN community uses <strong>reviews</strong> to try to monitor and improve the quality of MDN's content. This works by setting a flag on an article indicating that a review is needed. You can learn more about <a href="/en-US/docs/MDN/Contribute/Howto/Do_a_technical_review" title="/en-US/docs/Project:MDN/Contributing/How_to_help#Content_reviews">technical reviews</a> and <a href="/en-US/docs/MDN/Contribute/Howto/Do_an_editorial_review">editorial review</a> in the <a href="/en-US/docs/MDN/Contribute/Howto" title="/en-US/docs/Project:MDN/Contributing/How_to_help">How to</a> guides.</p> + +<p>To request a review on the article you've worked on, toggle on the checkbox next to the type of review that's needed. Technical reviews should be requested any time you make changes to the explanation of how something technical works, while editorial reviews are a good idea when you've made changes and would like someone to review your writing and style choices.</p> + +<p>While selecting a review checkbox adds the article to the lists of those <a href="/en-US/docs/needs-review/technical">needing technical review</a> or <a href="/en-US/docs/needs-review/editorial">needing editorial review</a>, it does not guarantee that anyone will immediately review the article. For technical reviews, it's a good idea to directly contact a <a href="/en-US/docs/MDN/Community/Roles/Subject-matter_experts">subject-matter expert</a> in the relevant technical area. For editorial reviews, you can post in the <a href="/https://discourse.mozilla.org/c/mdn">MDN discussion forum</a> to request that someone review your changes.</p> + +<p>Be sure to click one of the <strong>Publish</strong> buttons after making your selections, to commit your review request.</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li><a href="http://docs.cksource.com/CKEditor_3.x/Users_Guide">CKEditor User's Guide</a></li> +</ul> + +<h6 id="EditorGuideQuicklinks">{{EditorGuideQuicklinks}}<span id="cke_bm_73C" style="display: none;"> </span></h6> diff --git a/files/zh-tw/orphaned/mdn/editor/index.html b/files/zh-tw/orphaned/mdn/editor/index.html new file mode 100644 index 0000000000..5cf0ac0a43 --- /dev/null +++ b/files/zh-tw/orphaned/mdn/editor/index.html @@ -0,0 +1,23 @@ +--- +title: Guide to the MDN editor UI +slug: MDN/Editor +tags: + - Documentation + - Guide + - Landing + - MDN + - MDN Meta + - 指南 +translation_of: MDN/Editor +--- +<div>{{MDNSidebar}}</div><div>{{IncludeSubnav("/zh-TW/docs/MDN")}}</div> + +<p><span class="seoSummary">MDN線上文件百科的WYSIWYG (what-you-see-is-what-you-get) 所見即所得編輯器讓人可以輕鬆地對新內容做出貢獻。</span></p> + +<p><span class="seoSummary">這個指南將教會您如何使用編輯器以及提升你的生產力,在您開始編輯或創造新頁面前,請先閱讀並同意遵守<a href="https://www.mozilla.org/en-US/about/legal/terms/mozilla/">Mozilla Terms</a> 。</span></p> + +<p><a href="/en-US/docs/MDN/Contribute/Content/Style_guide" title="Read the MDN style guide">MDN style guide</a> 提供了內容的編排方法與風格,其中包含了我們建議的文法與拼字規則。</p> + +<p>{{LandingPageListSubpages}}</p> + +<p>{{EditorGuideQuicklinks}}</p> diff --git a/files/zh-tw/orphaned/mdn/editor/keyboard_shortcuts/index.html b/files/zh-tw/orphaned/mdn/editor/keyboard_shortcuts/index.html new file mode 100644 index 0000000000..3c691a124b --- /dev/null +++ b/files/zh-tw/orphaned/mdn/editor/keyboard_shortcuts/index.html @@ -0,0 +1,134 @@ +--- +title: Edit box of the MDN editor +slug: MDN/Editor/Edit_box +translation_of: MDN/Editor/Keyboard_shortcuts +--- +<div>{{MDNSidebar}}</div><p>The edit box is, of course, where you actually do your writing. Right-clicking in the editor box offers appropriate additional options depending on the context of your click: right-clicking in a table offers table-related options and right-clicking in a list offers list-related options, for example.</p> + +<p>By default, the editor uses its own contextual menu when you right-click on the editor. To access your browser's default contextual menu (such as to access the Firefox spell checker's list of suggested corrections), hold down the <kbd>Shift</kbd> or <kbd>Control</kbd> key (the <kbd>Command</kbd> key on Mac OS X) while clicking.</p> + +<h2 id="鍵盤快捷鍵">鍵盤快捷鍵</h2> + +<p>There are a number of convenient keyboard shortcuts available to help you avoid taking your hands off the keyboard while you work. The shortcuts are listed for Windows and Linux; on Mac, instead of using the <kbd>Control</kbd> key, you can use the <kbd>Command</kbd> key.</p> + +<table class="standard-table"> + <colgroup> + <col style="width: 15em;"> + </colgroup> + <tbody> + <tr> + <th>快捷鍵</th> + <th>說明</th> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>A</kbd></td> + <td>全選</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>C</kbd></td> + <td>複製到剪貼簿</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>V</kbd></td> + <td>從剪貼簿貼上</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>X</kbd></td> + <td>剪下</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>Z</kbd></td> + <td>回到上一步</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>Y</kbd></td> + <td>重置</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>K</kbd></td> + <td>開啟連結編輯器/新增連結</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd></td> + <td>移除連結游標位置。</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>B</kbd></td> + <td>粗體</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>I</kbd></td> + <td>斜體</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>O</kbd></td> + <td>切換 <code><code></code> 樣式。</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd></td> + <td> + <p>切換原始碼顯示模式。</p> + + <div class="note">在原始碼模式下編輯時請小心,您需要遵守我們的內容標準。更多細節關於如何使用原始碼模式與使用之優缺點請參照<a href="/en-US/docs/MDN/Contribute/Editor/Source_mode">原始碼模式編輯教學</a>。</div> + </td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>P</kbd></td> + <td>切換 <code><pre></code> 樣式在當前區塊中的開啟與關閉。</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>U</kbd></td> + <td>底線。</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>S</kbd></td> + <td>儲存修改並關閉編輯器。</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>S</kbd></td> + <td>儲存修改但不要關閉編輯器。</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>0</kbd></td> + <td>Remove formatting from the selected area (That's a zero, not the letter "O").</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>2</kbd> through <kbd>Ctrl</kbd> + <kbd>6</kbd></td> + <td>Select heading level 2 through 6. Heading level 1 is reserved for the page title displayed at the top of the article.</td> + </tr> + <tr> + <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd></td> + <td>Toggle from bulleted list to numbered list to and paragraph format</td> + </tr> + <tr> + <td><kbd>Tab</kbd></td> + <td>Increase indent level if in indent mode, otherwise inserts two spaces as a tab. Inside tables, this moves the cursor to the next cell, or inserts a new row if there is no next cell. If the cursor is currently in the page title or in a heading, the cursor jumps to the next paragraph.</td> + </tr> + <tr> + <td><kbd>Shift</kbd> + <kbd>Tab</kbd></td> + <td>Decrease indent level if in indent mode. Inside tables, this jumps to the previous cell, or inserts a new row if there is no previous cell. If the cursor is currently in the page title or in a heading, the cursor jumps to the next paragraph.</td> + </tr> + <tr> + <td><kbd>Shift</kbd> + <kbd>Space</kbd></td> + <td>Insert a non-breaking space (<code>&nbsp;</code>)</td> + </tr> + <tr> + <td><kbd>Shift</kbd> + <kbd>Enter</kbd></td> + <td> + <p>Exits out of the current block. For example, if you're currently editing a <code><pre></code> block, <kbd>Shift</kbd> + <kbd>Enter</kbd> exits the block, putting you back in the body of the article.</p> + + <div class="note style-wrap"> + <p>Not currently implemented; see {{bug(780055)}}.</p> + </div> + </td> + </tr> + </tbody> +</table> + +<h2 id="See_also">See also</h2> + +<ul> + <li><a href="/en-US/docs/MDN/Contribute/Editor/Basics">Editor UI elements</a></li> + <li><a href="/en-US/docs/MDN/Contribute">Contributing to MDN</a></li> + <li><a href="/en-US/docs/MDN/Getting_started">Getting started on MDN</a></li> +</ul> diff --git a/files/zh-tw/orphaned/mozilla/firefox/releases/4/firefox_4_開發者新功能概覽/index.html b/files/zh-tw/orphaned/mozilla/firefox/releases/4/firefox_4_開發者新功能概覽/index.html new file mode 100644 index 0000000000..c36dad8487 --- /dev/null +++ b/files/zh-tw/orphaned/mozilla/firefox/releases/4/firefox_4_開發者新功能概覽/index.html @@ -0,0 +1,228 @@ +--- +title: Firefox 4 for developers +slug: Mozilla/Firefox/Releases/4/Firefox_4_開發者新功能概覽 +--- +<div>{{FirefoxSidebar}}</div><p>2010 年六月起進入 Beta 測試期的 Firefox 4,增進了效能、加強針對 HTML 5 及其他創新網際科技的支援程度,也更加安全。本文為網頁、附加元件、Gecko 平台開發者們提供這一版的簡要技術相關資訊。</p> + +<div class="geckoVersionNote"> +<p>{{ gecko_callout_heading("2") }}</p> + +<p>Gecko 1.9.3 即將更名為 Gecko 2,但許多文件還沒有針對此點更新,在接下來的幾個星期中才會有所更動。</p> +</div> + +<p>以下大部分的功能都已經可以在 <a class="external" href="http://nightly.mozilla.org/" title="http://nightly.mozilla.org/">逐日建置版</a>中試用。</p> + +<div class="note"><strong>註:</strong>本文、以及本文所連結的其他文件仍持續編修中,很多文件的名稱只是暫定、有些主題的文件也可能會拆成幾份子文件以方便閱讀。中文團隊的目標將僅翻譯這份概覽,其他子文件則有待大家的幫忙。</div> + +<h2 id="Features_for_web_developers">Features for web developers</h2> + +<p>Gecko now uses the <a href="/en/HTML/HTML5" title="en/HTML/HTML5">HTML5</a> parser, which fixes bugs, improves interoperability, and improves performance. It also lets content embed <a href="/en/SVG" title="en/SVG">SVG</a> and <a href="/en/MathML" title="en/MathML">MathML</a> directly in the HTML markup.</p> + +<h3 id="HTML">HTML</h3> + +<dl> + <dt>Introduction to the HTML5 parser</dt> + <dd>A look at what the HTML5 parser means to you, and how to embed SVG and MathML into your content inline.</dd> + <dt><a href="/en/HTML/HTML5/Forms_in_HTML5" title="en/HTML/Forms in HTML5">Forms in HTML5</a></dt> + <dd>A look at improvements to web forms in HTML5.</dd> + <dt><a href="/en/Sections_and_Outlines_of_an_HTML5_document" title="en/Sections and Outlines of an HTML5 document">HTML5 Sections</a></dt> + <dd>Gecko now supports the new HTML5 elements related to sections in a document: {{ HTMLElement("article") }}, {{ HTMLElement("section") }}, {{ HTMLElement("nav") }}, {{ HTMLElement("aside") }}, {{ HTMLElement("hgroup") }}, {{ HTMLElement("header") }} and {{ HTMLElement("footer") }}.</dd> + <dt>Other HTML5 elements</dt> + <dd>Gecko now also supports the following new HTML5 elements: {{ HTMLElement("mark") }}, {{ HTMLElement("figure") }} and {{ HTMLElement("figcaption") }}.</dd> + <dt>WebSockets</dt> + <dd>A guide to using the new WebSockets API for real-time communication between a web application and a server.</dd> +</dl> + +<h4 id="Miscellaneous_HTML_changes">Miscellaneous HTML changes</h4> + +<ul> + <li>{{ HTMLElement("textarea") }} elements are now resizable by default; you can use the {{ cssxref("resize") }} CSS property to disable this.</li> + <li><code>canvas.getContext</code> and <code>canvas.toDataURL</code> no longer throw an exception when called with unrecognized arguments.</li> + <li><code>canvas2dcontext.globalCompositeOperation</code>, <code>canvas2dcontext.lineCap</code> and <code>canvas2dcontext.lineJoin</code> no longer throw an exception when set to an unrecognized value.</li> +</ul> + +<h3 id="CSS">CSS</h3> + +<dl> + <dt><a href="/en/CSS/CSS_transitions" title="en/CSS/CSS transitions">CSS transitions</a></dt> + <dd>New CSS transitions support is available in Firefox 4.</dd> + <dt>Computed values in CSS</dt> + <dd>Support for<code> calc() </code>to compute values in CSS is in progress. See {{ bug(363249) }}.</dd> + <dt>Selector grouping</dt> + <dd>Support for {{ cssxref(":-moz-any") }} to group selectors and factorize combinators.</dd> + <dt>Background image subrectangle support</dt> + <dd>The {{ cssxref("-moz-image-rect") }} property makes it possible to use subrectangles of images as a background image.</dd> + <dt>CSS touch properties</dt> + <dd>Support for touch properties is added. Details, and real article names, to come later.</dd> + <dt><a href="/en/CSS/Privacy_and_the_:visited_selector" title="en/CSS/Privacy and the :visited selector">Privacy and the :visited selector</a></dt> + <dd>Changes have been made to what information can be obtained about the style of visited links using CSS selectors. This may affect some web applications.</dd> +</dl> + +<h4 id="Miscellaneous_CSS_changes">Miscellaneous CSS changes</h4> + +<ul> + <li>The {{ cssxref("text-shadow") }} property now caps the blur radius to 300px for sanity and performance reasons.</li> + <li>The {{ cssxref(":-moz-window-inactive") }} pseudoclass has been implemented.</li> + <li>The {{ cssxref("-moz-tab-size") }} property lets you specify the width in space characters of a tab character (U+0009) when rendering text.</li> + <li>The CSS3 {{ cssxref("resize") }} property has been implemented.</li> + <li>The<code> -moz-background-size </code>property has been renamed to its final {{ cssxref("background-size") }} naming; <code>-moz-background-size</code> is no longer supported.</li> + <li>The {{ cssxref("oveflow") }} property no longer applies to table-group elements ({{ HTMLElement("thead") }}, {{ HTMLElement("tbody") }}, and {{ HTMLElement("tfoot") }}).</li> +</ul> + +<h3 id="Graphics_and_video">Graphics and video</h3> + +<dl> + <dt> </dt> + <dt><a href="/en/WebGL" title="en/WebGL">WebGL</a></dt> + <dd>The developing WebGL standard is now supported by Firefox.</dd> + <dt>Optimizing graphics performance</dt> + <dd>Tips and tricks for getting the most out of graphics and video performance in Firefox 4.</dd> + <dt><a href="/En/Media_formats_supported_by_the_audio_and_video_elements#WebM" title="En/Media formats supported by the audio and video elements#WebM">Support for WebM video</a></dt> + <dd>The new open <a class="external" href="http://www.webmproject.org/" title="http://www.webmproject.org/">WebM</a> video format is supported by Gecko 1.9.3; support is included in nightlies as of 9 June.</dd> + <dt>Full screen API</dt> + <dd>Details coming soon.</dd> + <dt>SMIL animation</dt> + <dd>Support for SMIL animation of SVG is now available. See {{ bug(482402) }}.</dd> + <dt>Using SVG as images and as CSS backgrounds</dt> + <dd>You can now use SVG with the {{ htmlelement("img") }} element, as well as the background image in CSS. See {{ bug(272288) }}, {{ bug(276431) }} and {{ bug(231179) }}.</dd> +</dl> + +<h3 id="DOM">DOM</h3> + +<dl> + <dt>Obtaining boundary rectangles for ranges</dt> + <dd>The Range object now has <code>getClientRects()</code> and <code>getBoundingClientRect()</code> methods. See {{ bug(396392) }}.</dd> + <dt>Capturing mouse events on arbitrary elements</dt> + <dd>Support for the Internet Explorer-originated <code>setCapture()</code> and <code>releaseCapture()</code> APIs has been added. See {{ bug(503943) }}.</dd> + <dt><a href="/en/DOM/Manipulating_the_browser_history" title="en/DOM/Manipulating the browser history">Manipulating the browser history</a></dt> + <dd>The existing document history object, available through the {{ domxref("window.history") }} object, now supports the new HTML5 <code>pushState()</code> and <code>replaceState()</code> methods.</dd> + <dt>Touch and multi-touch events</dt> + <dd>Support has been added for touch and multi-touch events.</dd> + <dt><a href="/en/IndexedDB" title="IndexedDB">IndexedDB</a></dt> + <dd>The proposed IndexedDB standard, which provides a local database store for web applications, will be supported by Firefox 4.</dd> +</dl> + +<h4 id="Miscellaneous_DOM_changes">Miscellaneous DOM changes</h4> + +<ul> + <li>The wrapping of a {{ HTMLElement("textarea") }} element can now be controlled via the DOM, via the <code>wrap</code> DOM attribute. {{ bug(41464) }}</li> + <li>DOM {{ domxref("file") }} objects now offer a <code>url</code> property.</li> + <li>DOM {{ domxref("file") }} objects now have a new <code>click()</code> method. (Note: not done yet, see <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=36619" title="https://bugzilla.mozilla.org/show_bug.cgi?id=36619">bug 36619</a>.)</li> + <li><a href="/En/XMLHttpRequest/Using_XMLHttpRequest#Using_FormData_objects" title="en/XMLHttpRequest/Using XMLHttpRequest#Using FormData objects">FormData</a> support for XMLHttpRequest.</li> + <li>The {{ domxref("element.isContentEditable") }} property has been implemented.</li> + <li>Added the <a href="/En/DragDrop/DataTransfer#mozSourceNode" title="En/DragDrop/DataTransfer#mozSourceNode"><code>mozSourceNode</code></a> property to the <a href="/En/DragDrop/DataTransfer" title="En/DragDrop/DataTransfer"><code>DragTransfer</code></a> object.</li> + <li>Added the <a href="/en/DOM/Selection/modify" title="en/DOM/selection/modify"><code>selection.modify()</code></a> method to the {{ domxref("Selection") }} object; this lets you easily alter the current text selection or cursor position in a browser window.</li> + <li>Support for the <code>window.directories</code> object and the <code>directories</code> feature for {{ domxref("window.open") }}, which are not supported in any other browser, has been removed. Use <code>personalbar</code> instead. {{ Bug(474058) }}</li> + <li>The {{ domxref("event.mozInputSource") }} property has been added to DOM user interface events; this non-standard property lets you determine the type of device that generated an event.</li> + <li>The {{ domxref("document.onreadystatechange") }} event has been implemented.</li> + <li>The {{ domxref("document.createElement") }} method no longer accepts <code><</code> and <code>></code> around the tag name in quirks mode.</li> +</ul> + +<h3 id="Security">Security</h3> + +<dl> + <dt><a href="/en/Introducing_Content_Security_Policy" title="en/Introducing Content Security Policy">Introducing Content Security Policy</a></dt> + <dd>Content Security Policy (CSP) is a Mozilla proposal designed to help web designers and server administrators specify how content on their web sites interacts. The goal is to help detect and mitigate attacks including cross-site scripting and data injection attacks.</dd> + <dt>ForceTLS</dt> + <dd>Details soon.</dd> + <dt>The Account Manager</dt> + <dd>Details soon.</dd> +</dl> + +<h3 id="JavaScript">JavaScript</h3> + +<p>For an overview of the changes implemented in JavaScript 1.8.5, see <a href="/en/New_in_JavaScript_1.8.5" title="en/New in JavaScript 1.8.5">New in JavaScript 1.8.5</a>. JavaScript in Firefox 4 will have additional adherence to the ECMAScript 5 standard.</p> + +<h2 id="Changes_for_Mozilla_and_add-on_developers">Changes for Mozilla and add-on developers</h2> + +<p>For helpful tips on updating existing extensions for Firefox 4, see <a href="/en/Extensions/Updating_extensions_for_Firefox_4" title="en/Extensions/Updating extensions for Firefox 4">Updating extensions for Firefox 4</a>.</p> + +<h3 id="JavaScript_code_modules">JavaScript code modules</h3> + +<dl> + <dt><a href="/en/JavaScript/Code_modules/Services.jsm" title="en/JavaScript code modules/Services.jsm">Services.jsm</a></dt> + <dd>The <code>Services.jsm</code> code module provides getters that make it easy to obtain references to commonly-used services, such as the preferences service or the window mediator, among others.</dd> +</dl> + +<dl> + <dt><a href="/en/JavaScript/Code_modules/ctypes.jsm" title="en/JavaScript code modules/ctypes.jsm">JS-ctypes API</a></dt> + <dd>The JS-ctypes API makes it possible to call C-compatible foreign library functions without using XPCOM.</dd> + <dt><a href="/en/Addons/Add-on_Manager" title="en/Addons/Add-on Manager">Add-ons Manager</a></dt> + <dd>The new Add-ons Manager provides information about installed add-ons, support for managing them, and provides ways to install and remove add-ons.</dd> + <dt><a href="/en/JavaScript/Code_modules/Using#Locating_the_code_module" title="en/JavaScript code modules/Using JavaScript code modules#Locating the code module">Loading code modules from chrome: URLs</a></dt> + <dd>You can now load JavaScript code modules using <strong>chrome:</strong> URLs, even inside JAR files.</dd> +</dl> + +<h3 id="DOM_changes">DOM changes</h3> + +<dl> + <dt>{{ domxref("ChromeWorker") }}</dt> + <dd>A new type of worker for privileged code; this lets you use things like <a href="/en/js-ctypes" title="en/js-ctypes">js-ctypes</a> from workers in extensions and application code.</dd> +</dl> + +<h3 id="XUL">XUL</h3> + +<h4 id="tabbrowser_(gBrowser)_changes">tabbrowser (gBrowser) changes</h4> + +<p>Several changes were made to the {{ XULElem("tabbrowser") }} element that impact extensions that interact with tabs.</p> + +<ul> + <li>TabClose/TabSelect/TabOpen events no longer bubble up to the {{ XULElem("tabbrowser") }} element (gBrowser). Event listeners for those events should be added to gBrowser.tabContainer rather than to gBrowser directly.</li> + <li>The tab context menu is no longer an anonymous child of the {{ XULElem("tabbrowser") }}. It can therefore be overlaid directly with <a href="/en/XUL_Overlays" title="en/XUL Overlays">XUL overlays</a>. It can also be accessed more directly in JS via gBrowser.tabContextMenu. See <a class="external" href="http://www.gavinsharp.com/blog/2010/03/31/accessingmodifying-the-firefox-tab-context-menu-from-extensions/" title="http://www.gavinsharp.com/blog/2010/03/31/accessingmodifying-the-firefox-tab-context-menu-from-extensions/">this blog post</a> for more details.</li> +</ul> + +<h4 id="Miscellaneous_XUL_changes">Miscellaneous XUL changes</h4> + +<ul> + <li>The {{ xulattr("readonly") }} attribute now correctly works for fields.</li> + <li>The {{ xulelem("resizer") }} element now lets you use the {{ xulattr("element") }} attribute to specify an element to resize, instead of resizing the window.</li> + <li>The "active" attribute no longer gets set on active XUL windows. Instead, you can use the new {{ cssxref(":-moz-window-inactive") }} pseudoclass in order to assign different styles to background windows.</li> + <li>The {{ xulattr("emptytext") }} attribute is now deprecated; you should use {{ xulattr("placeholder") }} instead.</li> + <li>The {{ xulelem("popup") }} element is no longer supported; you should use {{ xulelem("menupopup") }} instead.</li> +</ul> + +<h3 id="Storage">Storage</h3> + +<h4 id="Miscellaneous_storage_API_changes">Miscellaneous storage API changes</h4> + +<ul> + <li>The {{ interface("mozIStorageBindingParamsArray") }} interface now has a length attribute that indicates the number of {{ interface("mozIStorageBindingParams") }} objects in the array.</li> + <li>The {{ ifmethod("mozIStorageStatement", "bindParameters") }} now returns an error if the specified {{ interface("mozIStorageBindingParamsArray") }} is empty.</li> +</ul> + +<h3 id="XPCOM">XPCOM</h3> + +<dl> + <dt><a href="/en/Extensions/Updating_extensions_for_Firefox_4" title="https://developer.mozilla.org/en/Extensions/Updating_extensions_for_Firefox_4">XPCOM changes in Gecko 1.9.3</a></dt> + <dd>Details about changes to XPCOM that impact compatibility in Firefox 4.</dd> + <dt><a href="/en/Components.utils.getGlobalForObject" title="en/Components.utils.getGlobalForObject">Components.utils.getGlobalForObject()</a></dt> + <dd>This new method returns the global object with which an object is associated; this replaces a common use case of the now-removed <code>__parent__</code>.</dd> +</dl> + +<h3 id="Memory_management">Memory management</h3> + +<dl> + <dt><a href="/en/Infallible_memory_allocation" title="en/Infallible memory allocation">Infallible memory allocation</a></dt> + <dd>Mozilla now provides infallible memory allocators that are guaranteed not to return null. You should read this article to learn how they work and how to explicitly request fallible versus infallible memory allocation.</dd> +</dl> + +<h2 id="Other_changes">Other changes</h2> + +<dl> + <dt>Gopher support removed</dt> + <dd>The Gopher protocol is no longer supported natively. Continued support is available via the <a class="link-https" href="https://addons.mozilla.org/addon/7685/">OverbiteFF</a> extension.</dd> + <dt>Default plugin removed</dt> + <dd>The default plugin has been removed. The application plugins folder has also been removed by default, however support for installing plugins via this folder still exists. See <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=533891">bug 533891</a>.</dd> + <dt>Extension Manager replaced with AddonManager</dt> + <dd><a href="/en/XPCOM_Interface_Reference/nsIExtensionManager" title="en/nsIExtensionManager">nsIExtensionManager</a> has been replaced by <a href="/en/Addons/Add-on_Manager/AddonManager" title="en/Addons/Add-on_Manager/AddonManager">AddonManager</a>. Since there is apparently no way at present to obtain the install location from a given extension ID, the closest workaround is to use the directory service to find the profile directory and append "extensions" to it (though this approach will not catch extensions outside of the profile directory or those which are aliased to another location).</dd> +</dl> + +<h2 id="參考">參考</h2> + +<ul> + <li><a href="/en/Firefox_3.6_for_developers" title="en/Firefox 3.6 for developers">Firefox 3.6 for developers</a></li> + <li><a class="internal" href="/En/Firefox_3.5_for_developers" title="En/Firefox 3.5 for developers">Firefox 3.5 for developers</a></li> + <li><a class="internal" href="/en/Firefox_3_for_developers" title="en/Firefox 3 for developers">Firefox 3 for developers</a></li> + <li><a class="internal" href="/en/Firefox_2_for_developers" title="en/Firefox 2 for developers">Firefox 2 for developers</a></li> + <li><a class="internal" href="/en/Firefox_1.5_for_developers" title="en/Firefox 1.5 for developers">Firefox 1.5 for developers</a></li> +</ul> diff --git a/files/zh-tw/orphaned/web/css/border-image/border-image/index.html b/files/zh-tw/orphaned/web/css/border-image/border-image/index.html new file mode 100644 index 0000000000..210a2663eb --- /dev/null +++ b/files/zh-tw/orphaned/web/css/border-image/border-image/index.html @@ -0,0 +1,111 @@ +--- +title: border-image +slug: Web/CSS/border-image/border-image +tags: + - CSS +--- +<h3 id="摘要">摘要</h3> + +<p>CSS 屬性 <code>border-image</code> 可以讓你在元素的邊框上擺上圖片。這讓呈現看似很複雜的一個網頁的小單元簡單很多,它可以省最多九個元素。</p> + +<div class="warning"><strong>緊告:</strong>官方的 CSS3 規範描述的 border-image 屬性在這個功能被凍結並出現在 Gecko 1.9.1 的釋出版之後改變很多。因此,這項功能的語法跟呈現方法很可能在未來 Gecko 的釋出版改變。特別是選擇性的 <code>border-width</code> 參數,它覆蓋既有 <code>border-width</code> 取值的這項特性已經從規範移除了,因此勢必也會在未來的 Gecko 被拿掉。</div> + +<p>瀏覽器會顯示 <code>border-image</code> 指定的圖片而不是 {{ cssxref("border-style") }} 給的邊框樣式,但是若它的取值是 <code>none</code> 或是因某些理由無法顯示該圖片,瀏覽器就會顯示邊框樣式。<code>border-image</code> 會畫一個額外的背景圖片在原來 {{ cssxref("background-image") }} 指 定的背景圖片之上。</p> + +<ul> + <li>{{ Xref_cssinitial() }}:{{ Cssxref("none") }}</li> + <li>對象:所有除了 {{ cssxref("border-collapse") }} 是 <code class="css">collapse</code> 的表格元素</li> + <li>{{ Xref_cssinherited() }}:否</li> + <li>媒體:{{ Xref_cssvisual() }}</li> + <li>{{ Xref_csscomputed() }}:任何 URI 變為絕對,任何 <長度> 變為絕對,其他如同所指定</li> +</ul> + +<h3 id="語法">語法</h3> + +<pre class="eval">none | + [ <圖片> [ <數字> | <百分比> ]{1,4} [/ <邊框寬度>{1,4}]? ] && [ stretch | repeat | round ]{0,2} </pre> + +<h3 id="取值">取值</h3> + +<dl> + <dt>none</dt> + <dd>不顯示圖片,使用邊框樣式。</dd> + <dt><圖片> <small>(必填)</small></dt> + <dd>圖片值是一個 {{cssxref("<uri>")}},例: <code class="plain"> url(http://example.org/image.png)</code> 。</dd> + <dt><數> | <百分比> <small>(必填)</small></dt> + <dd>一個、兩個、三個、四個分別代表從頂邊、右邊、底邊、左邊從圖片外圍到切圖線的距離,將圖片切為九塊:四個角、四個邊跟一個中間部份。<br> + <img alt="" src="/@api/deki/files/3683/=slice.png" style="float: right;"><br> + 一個值的話,該值用於圖片的全部四個邊。<br> + 兩個值得話,值用於:一、頂邊與底邊 二、右邊與左邊。<br> + 三個值的話,值用於:一、頂邊 二、右邊與左邊 三、底邊。<br> + 四個值的情況,四個值分邊用在圖片的頂邊、右邊、底邊、左邊。<br> + <br> + 在 Gecko 1.9.1 (Firefox 3.5) 圖片的中間那個部份會被當做元素的背景。這在未來的版本可能會改變。<br> + <br> + <strong>百分比</strong> 由圖片的長度/寬度計算。<br> + <strong>數</strong> 但表圖片的像素(若為點陣圖)或向量座標(若為 SVG)。</dd> + <dt><邊框寬度> <small>(選擇性)</small></dt> + <dd>如果斜線 <strong>/</strong> 出現在屬性值的話,一個、兩個、三個或是四個在它之後的取值會被當成是 {{ cssxref("border-width") }} 的取值使用。取值的順序如同 {{ cssxref("border-width") }} 。</dd> + <dt>stretch | round | repeat <small>(選擇性)</small></dt> + <dd>一個或兩個關鍵字,指定邊上的圖片跟中間部份要如何縮放及鋪擺。<br> + <strong><code>stretch</code></strong> (預設值)縮放該圖片,使其與配置大小相等。<br> + <strong><code>round</code></strong> 鋪擺該圖片,但也縮放它使得被配置範圍鋪滿整數張該圖片。<br> + <strong><code>repeat </code></strong>直接鋪擺該圖片。<br> + 第一個關鍵字的對象是頂邊,中間跟底邊的圖片,而第二個關鍵字的對象是左邊跟右邊的邊框。如果第二個不存在,則沿用第一個關鍵字的設定。如果兩者皆不存在,預設值為 <code> stretch</code>。</dd> +</dl> + +<h3 id="範例">範例</h3> + +<p>[這裡還需要一些活範例]</p> + +<pre>#header { -moz-border-image: url(border.png) 27 27 27 27 round round; } + +.button { -moz-border-image: url(button.png) 0 5 0 5; } + +.example { -moz-border-image: url(example.jpg) 3 4 6 8 / 10px 12px 14px 22px; } +</pre> + +<pre>/* 鮮見例,在 Firefox 3.5 下看起來像是完全伸展的 background-image */ + + div { -moz-border-image: url(bgimage.png) 0; } +</pre> + +<h3 id="瀏覽器兼容性">瀏覽器兼容性</h3> + +<table class="standard-table"> + <tbody> + <tr> + <th>瀏覽器</th> + <th>最小版本</th> + <th>支援</th> + </tr> + <tr> + <td>Internet Explorer</td> + <td>---</td> + <td>---</td> + </tr> + <tr> + <td>Firefox (Gecko)</td> + <td><strong>3.5</strong> (1.9.1)</td> + <td><code>-moz-border-image</code></td> + </tr> + <tr> + <td>Opera</td> + <td>10.5</td> + <td><code>border-image</code></td> + </tr> + <tr> + <td>Safari (WebKit)</td> + <td><strong>3.0</strong> (522)</td> + <td><code>-webkit-border-image</code></td> + </tr> + </tbody> +</table> + +<h3 id="規範">規範</h3> + +<ul> + <li><a class="external" href="http://www.w3.org/TR/css3-background/#border-images" title="http://www.w3.org/TR/css3-background/#border-images">CSS 3 背景與邊界模組 #border-image</a></li> +</ul> + +<p>{{ languages( { "en": "en/CSS/-moz-border-image"} ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/javascript_概要/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/javascript_概要/index.html new file mode 100644 index 0000000000..9c74f992c9 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/javascript_概要/index.html @@ -0,0 +1,43 @@ +--- +title: JavaScript 概要 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/JavaScript_概要 +--- +<p> </p> +<h3 id="什麼是_JavaScript?" name="什麼是_JavaScript?">什麼是 JavaScript?</h3> +<p>JavaScript 是跨平台、物件導向的 Script 語言。JavaScript 是小巧、輕量的語言,以單獨的語言來看 JavaScript 並不是很有用,不過 JavaScript 被設計成易於嵌入至其他產品和應用程式(如 Web 瀏覽器)。在宿主環境裡,JavaScript 可連接至由環境提供的可操控的物件。</p> +<p>核心 JavaScript 包含 <code>Array</code>、<code>Date</code>、<code>Math</code> 等等的物件核心組件,以及運算子、控制結構、語法等等的語言元素的核心組件。核心 JavaScript 可藉由追加額外的物件而為各種用途來做擴充,例如︰</p> +<ul> <li><em>客戶端 JavaScript</em> 藉由追加的物件擴充核心語言,以操控瀏覽器(Navigator 或其他 Web 瀏覽器)及其 Document Object Model (DOM)。例如,客戶端的擴充可讓應用程式在 HTML 表單上放置一些元素,並回應滑鼠點擊、表單輸入、頁面瀏覽等的使用者事件。</li> <li><em>伺服端 JavaScript</em> 藉由追加與執行在伺服器上的 JavaScript 有關的物件來擴充核心語言。例如,伺服端的擴充可讓應用程式與相關的資料庫通訊、提供從應用程式的一端發出至另一端的資訊的連續性、在伺服器上進行檔案管理。</li> +</ul> +<p>藉由 JavaScript 的 LiveConnect 的機能,還可讓 Java 和 JavaScript 的代碼互相通訊。你可以從 JavaScript 生成 Java 物件,並存取他們的公開方法和欄位。也可以從 Java 存取 JavaScript 的物件、屬性、方法。</p> +<p>Netscape 發明 JavaScript,且 JavaScript 是初次用於 Netscape 瀏覽器。</p> +<h3 id="JavaScript_和_Java" name="JavaScript_和_Java">JavaScript 和 Java</h3> +<p>JavaScript 和 Java 在某些方面類似,但在很多方面完全不同。JavaScript 語言很像 Java,但沒有 Java 的靜態類型和強固的類型檢查。JavaScript 支援 Java 的表達結構和基本的流程控制結構。</p> +<p>相對於 Java 藉由宣告來建構類別的編譯時期系統,JavaScript 支援的執行時期系統,是建立在表示為數值、布林、字串值的少數幾個資料類型。JavaScript 使用以原型為基礎的物件模型,以代替更常見的以類別為基礎的物件模型。以原型為基礎的模型可提供動態繼承,也就是可對個別的物件變更繼承。JavaScript 亦支援無須特別宣告的函數。函數可以是物件的屬性,以寬鬆的類型執行方法。</p> +<p>JavaScript 與 Java 相比,是一種在形式上要自由很多的語言。你不必宣告所有的變數、類別或方法。你不必關心方法是不是公開、私有或保護,你也不必實作界面。變數、參數和函數返回的類型都不是明確的類型。</p> +<p>Java 是為了快速執行和類型的安全性而設計的一種以類別為基礎的程式語言。類型的安全性的意義,舉例來說,你不能把 Java 的整數類型強制轉換為物件類型,或有意的誤用 Java 的位元碼來存取私有記憶體。Java 的以類別為基礎的模型的意義是程式完全以類別及其方法所組成。Java 的類別階層和強固的類型通常需要緊密結合的物件階層。這些要求使 Java 的程式設計比 JavaScript 編寫要複雜的多。</p> +<p>相較之下,JavaScript 繼承了像 HyperTalk、dBASE 那樣的小型動態類型語言的精髓。這些 Script 語言提供工具給更廣大的使用者,因為他們的語法簡單、特殊的內建函數、對物件的建立的要求較少。</p> +<table class="fullwidth-table"> <tbody> <tr> <th>JavaScript</th> <th>Java</th> </tr> <tr> <td>物件導向。物件的類型之間沒有區別。繼承是透過原型機制達成,屬性和方法可動態的加入至任何物件。</td> <td>以類別為基礎。物件可細分為類別和實體,所有的繼承是透過類別階層達成。類別和實體不可動態的加入屬性或方法。</td> </tr> <tr> <td>不必宣告變數的資料類型(動態類型)。</td> <td>必須宣告變數的資料類型(靜態類型)。</td> </tr> <tr> <td>不可自動的寫入硬碟。</td> <td>不可自動的寫入硬碟。</td> </tr> </tbody> +</table> +<p><small><strong>表 1.1: JavaScript 和 Java 的比較</strong></small><br> +<br> +JavaScript 和 Java 之間的不同的更進一步資訊,參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8#%E7%89%A9%E4%BB%B6%E6%A8%A1%E5%9E%8B%E7%9A%84%E7%B4%B0%E7%AF%80" title="zh tw/Core JavaScript 1.5 教學#物件模型的細節">物件模型的細節</a> 章節。</p> +<h3 id="JavaScript_和_ECMAScript_規範" name="JavaScript_和_ECMAScript_規範">JavaScript 和 ECMAScript 規範</h3> +<p>Netscape 發明 JavaScript,且 JavaScript 最先使用於 Netscape 瀏覽器。然而,Netscape 與 <a class="external" href="http://www.ecma-international.org/">Ecma International</a> - 把資訊和通訊系統標準化的歐洲協會(以前稱為 ECMA - European Computer Manufacturers Association;歐洲電腦製造商協會)合作發表一份以核心 JavaScript 為基礎的國際程式語言的標準化。JavaScript 的標準化版本,稱為ECMAScript,使所有支援標準的應用程式都能有同樣的行為。企業可以使用這份開放的語言標準開發他們的 JavaScript 實作產品。ECMAScript 標準的文件在 ECMA-262 規範中。</p> +<p>ECMA-262 標準也受到 <a class="external" href="http://www.iso.ch/">ISO</a>(International Organization for Standardization;國際標準化組織)認可成為 ISO-16262。你可以在 Mozilla 網站上找到 <a class="external" href="http://www.mozilla.org/js/language/E262-3.pdf">ECMA-262 的 PDF 版本</a>。你也可以在 <a class="external" href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">Ecma International 網站</a> 上找到這份標準。ECMAScript 標準並未提到 Document Object Model (DOM),DOM 是由 <a class="external" href="http://www.w3.org/">World Wide Web Consortium (W3C)</a> 所標準化。DOM 定義了在 Script 中處理 HTML 文件裡的物件的方法。</p> +<h4 id="JavaScript_版本和_ECMAScript_修定版之間的關係" name="JavaScript_版本和_ECMAScript_修定版之間的關係">JavaScript 版本和 ECMAScript 修定版之間的關係</h4> +<p>Netscape 與 Ecma International 緊密合作產生 ECMAScript 規範 (ECMA-262)。下表說明了 JavaScript 版本和 ECMAScript 版本間的關係。</p> +<table class="fullwidth-table"> <tbody> <tr> <th>JavaScript 的版本</th> <th>與 ECMAScript 修定版之間的關係</th> </tr> <tr> <td>JavaScript 1.1</td> <td>ECMA-262 第一版是以 JavaScript 1.1 為基礎。</td> </tr> <tr> <td>JavaScript 1.2</td> <td>在 JavaScript 1.2 釋出時,ECMA-262 尚未完成。JavaScript 1.2 因為以下原因而不完全相容於 ECMA-262 第一版︰ <ul> <li>Netscape 在 JavaScript 1.2 中開發了未考慮到 ECMA-262 的額外機能。</li> <li>ECMA-262 加入兩個新的機能︰使用 Unicode 來國際化,統一所有平台的行為。JavaScript 1.2 的若干機能,如 Date 物件,依賴於平台,且使用平台規範的行為。</li> </ul> </td> </tr> <tr> <td> <p>JavaScript 1.3</p> </td> <td> <p>JavaScript 1.3 完全相容於 ECMA-262 第一版。</p> <p>JavaScript 1.3 解決了 JavaScript 1.2 和 ECMA-262 的不一致,除了 == 和 != 以外,保留 JavaScript 1.2 所有的額外機能,以符合 ECMA-262。</p> </td> </tr> <tr> <td> <p>JavaScript 1.4</p> </td> <td> <p>JavaScript 1.4 完全相容於 ECMA-262 第一版。</p> <p>在 JavaScript 1.4 釋出時,ECMAScript 規範的第三版仍尚未完成。</p> </td> </tr> <tr> <td>JavaScript 1.5</td> <td>JavaScript 1.5 完全相容於 ECMA-262 第三版。</td> </tr> </tbody> +</table> +<p><small><strong>表 1.2: JavaScript 版本和 ECMAScript 版本</strong></small></p> +<div class="note"><strong>附註</strong>: ECMA-262 第二版由次要的編修和對第一版規範的錯誤修正所組成。Ecma International 的 TC39 工作群組目前正工作於 ECMAScript 第四版,第四版將會對應下一個 JavaScript 的釋出版 JavaScript 2.0。</div> +<p><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83" title="zh tw/Core JavaScript 1.5 參考">Core JavaScript 參考</a> 指出哪些語言機能對應於 ECMAScript。</p> +<p>JavaScript 將會不斷包含尚未成為 ECMAScript 規範的新機能;JavaScript 在提供額外機能時仍會相容於 ECMAScript。</p><h4 id="JavaScript_文件與_ECMAScript_規範" name="JavaScript_文件與_ECMAScript_規範">JavaScript 文件與 ECMAScript 規範</h4> +<p>ECMAScript 規範是實作 ECMAScript 的必要條件的匯整;如果你想知道 JavaScript 機能 ECMAScript 規範是否支援,規範就會很有用。如果你有意只使用 ECMAScript 支援的機能來編寫 JavaScript 代碼,你會需要檢閱 ECMAScript 規範。</p> +<p>ECMAScript 文件不是為了幫助 Script 程式員;應該使用 JavaScript 文件取得有關編寫 Script 的資訊。</p> +<h4 id="JavaScript_和_ECMAScript_術語" name="JavaScript_和_ECMAScript_術語">JavaScript 和 ECMAScript 術語</h4> +<p>ECMAScript 規範使用的術語和語法對 JavaScript 程式員來說可能會很陌生。儘管在 ECMAScript 裡的語言說明有所不同,語言本身仍然是一樣的。JavaScript 支援所有在 ECMAScript 規範中描述的機能。</p> +<p>JavaScript 的文件為 JavaScript 程式員適當的描述語言的表面。例如︰</p> +<ul> <li>在 JavaScript 文件中不會討論全域物件,因為你不能直接使用。你使用的是全域物件的方法和屬性,已在 JavaScript 文件中稱為頂層函數和屬性來描述。</li> <li>在 JavaScript 文件中不會討論到沒有參數(零參數)的 <code>Number</code> 和 <code>String</code> 物件的建構子,因為產生的東西沒什麼用。沒有參數的 <code>Number</code> 建構子返回 +0,沒有參數的 <code>String</code> 建構子返回 ""(空字串)。</li> +</ul> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:關於", "Core_JavaScript_1.5_教學:值") }}</p> +<p> </p> <p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/JavaScript_Overview", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_de_JavaScript", "fr": "fr/Guide_JavaScript_1.5/Aper\u00e7u_de_JavaScript", "ja": "ja/Core_JavaScript_1.5_Guide/JavaScript_Overview", "ko": "ko/Core_JavaScript_1.5_Guide/JavaScript_Overview", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Przegl\u0105d_JavaScriptu", "zh-cn": "cn/Core_JavaScript_1.5_Guide/JavaScript\u603b\u89c8" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_概要/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_概要/index.html new file mode 100644 index 0000000000..985cfe5989 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_概要/index.html @@ -0,0 +1,11 @@ +--- +title: LiveConnect 概要 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要 +--- +<p> </p> +<h2 id="LiveConnect_概要" name="LiveConnect_概要">LiveConnect 概要</h2> +<p><strong><a class="internal" href="/zh_tw/LiveConnect" title="zh tw/LiveConnect">LiveConnect</a></strong> 是應用程式介面的名稱,可提供 JavaScript 呼叫 Java 類別的方法的能力,反之亦然,也可以使用 Java 既有的基礎反向運用。</p> +<dl> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E5%8C%85%E8%A3%9D%E5%99%A8%E7%9A%84%E9%81%8B%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/包裝器的運用">包裝器的運用</a></dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/JavaScript 向 Java 的通訊">JavaScript 向 Java 的通訊</a></dd> <dd> <dl> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A#Packages_%E7%89%A9%E4%BB%B6" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/JavaScript 向 Java 的通訊#Packages 物件">Packages 物件</a></dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A#Java_%E9%99%A3%E5%88%97%E7%9A%84%E9%81%8B%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/JavaScript 向 Java 的通訊#Java 陣列的運用">Java 陣列的運用</a></dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A#%E5%8C%85%E8%A3%9D%E5%92%8C%E9%A1%9E%E5%88%A5%E7%9A%84%E5%8F%83%E8%80%83" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/JavaScript 向 Java 的通訊#包裝和類別的參考">包裝和類別的參考</a></dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A#char_%E9%A1%9E%E5%9E%8B%E7%9A%84%E5%8F%83%E6%95%B8" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/JavaScript 向 Java 的通訊#char 類型的參數">char 類型的參數</a></dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A#%E5%9C%A8_JavaScript_%E4%B8%AD%E8%99%95%E7%90%86_Java_%E7%9A%84%E4%BE%8B%E5%A4%96" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/JavaScript 向 Java 的通訊#在 JavaScript 中處理 Java 的例外">在 JavaScript 中處理 Java 的例外</a></dd> </dl> </dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/Java_%E5%90%91_JavaScript_%E7%9A%84%E9%80%9A%E8%A8%8A" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/Java 向 JavaScript 的通訊">Java 向 JavaScript 的通訊</a></dd> <dd> <dl> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/Java_%E5%90%91_JavaScript_%E7%9A%84%E9%80%9A%E8%A8%8A/LiveConnect_%E9%A1%9E%E5%88%A5%E7%9A%84%E4%BD%BF%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/Java 向 JavaScript 的通訊/LiveConnect 類別的使用">LiveConnect 類別的使用</a></dd> </dl> </dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B%E7%9A%84%E8%BD%89%E6%8F%9B" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/資料類型的轉換">資料類型的轉換</a></dd> <dd> <dl> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B%E7%9A%84%E8%BD%89%E6%8F%9B/%E5%BE%9E_JavaScript_%E5%88%B0_Java_%E7%9A%84%E8%BD%89%E6%8F%9B" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/資料類型的轉換/從 JavaScript 到 Java 的轉換">從 JavaScript 到 Java 的轉換</a></dd> <dd><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B%E7%9A%84%E8%BD%89%E6%8F%9B/%E5%BE%9E_Java_%E5%88%B0_JavaScript_%E7%9A%84%E8%BD%89%E6%8F%9B" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/資料類型的轉換/從 Java 到 JavaScript 的轉換">從 Java 到 JavaScript 的轉換</a></dd> </dl> </dd> +</dl> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:再談屬性的繼承:沒有多重繼承", "Core_JavaScript_1.5_教學:LiveConnect_概要:包裝器的運用") }}</p> +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/index.html new file mode 100644 index 0000000000..9f369cbcac --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/index.html @@ -0,0 +1,39 @@ +--- +title: 例外處理語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/例外處理語法 +--- +<h3 id="例外處理語法" name="例外處理語法">例外處理語法</h3> +<p>你可以使用 <code>throw</code> 語法來拋出例外,並使用 <code>try...catch</code> 語法來處理例外。</p> +<p>你也可以使用 <code>try...catch</code> 語法來處理 Java 的例外。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E5%BE%9E_JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A#%E5%9C%A8_JavaScript_%E4%B8%AD%E8%99%95%E7%90%86_Java_%E7%9A%84%E4%BE%8B%E5%A4%96" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/從 JavaScript 向 Java 的通訊#在 JavaScript 中處理 Java 的例外">在 JavaScript 中處理 Java 的例外</a> 和 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E5%BE%9E_JavaScript_%E5%90%91_Java_%E7%9A%84%E9%80%9A%E8%A8%8A" title="zh tw/Core JavaScript 1.5 教學/LiveConnect 概要/從 JavaScript 向 Java 的通訊">從 JavaScript 向 Java 的通訊</a> 取得資訊。</p> +<ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E4%BE%8B%E5%A4%96%E8%99%95%E7%90%86%E8%AA%9E%E6%B3%95/throw_%E8%AA%9E%E6%B3%95" title="zh tw/Core JavaScript 1.5 教學/例外處理語法/throw 語法">throw 語法</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E4%BE%8B%E5%A4%96%E8%99%95%E7%90%86%E8%AA%9E%E6%B3%95/try...catch_%E8%AA%9E%E6%B3%95" title="zh tw/Core JavaScript 1.5 教學/例外處理語法/try...catch 語法">try...catch 語法</a></li> +</ul> +<h3 id="例外的類型" name="例外的類型">例外的類型</h3> +<p>在此列出 JavaScript 中所有可以拋出的物件。不過並非所有的可拋出物件都以同樣方式產生。雖然只是非常普通的拋出數字或字串來表示錯誤,只使用其中幾個特別為某些用途而產生的例外的類型,往往會更加有效率︰</p> +<ul> + <li>ECMAScript 的例外︰ + <ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/Error" title="zh tw/Core JavaScript 1.5 教學/Error">Error</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/EvalError" title="zh tw/Core JavaScript 1.5 教學/EvalError">EvalError</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/RangeError" title="zh tw/Core JavaScript 1.5 教學/RangeError">RangeError</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/ReferenceError" title="zh tw/Core JavaScript 1.5 教學/ReferenceError">ReferenceError</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/SyntaxError" title="zh tw/Core JavaScript 1.5 教學/SyntaxError">SyntaxError</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/TypeError" title="zh tw/Core JavaScript 1.5 教學/TypeError">TypeError</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/URIError" title="zh tw/Core JavaScript 1.5 教學/URIError">URIError</a></li> + </ul> + </li> + <li>DOM 的例外︰ + <ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/DOMException" title="zh tw/Core JavaScript 1.5 教學/DOMException">DOMException</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/EventException" title="zh tw/Core JavaScript 1.5 教學/EventException">EventException</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/RangeException" title="zh tw/Core JavaScript 1.5 教學/RangeException">RangeException</a></li> + <li>... (?)</li> + </ul> + </li> + <li><a class="internal" href="/zh_tw/nsIXPCException" title="zh tw/nsIXPCException">nsIXPCException</a> (<a class="internal" href="/zh_tw/XPConnect" title="zh tw/XPConnect">XPConnect</a>)</li> +</ul> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:註解", "Core_JavaScript_1.5_教學:例外處理語法:throw_語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/throw_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/throw_語法/index.html new file mode 100644 index 0000000000..83230830e6 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/throw_語法/index.html @@ -0,0 +1,34 @@ +--- +title: throw 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/例外處理語法/throw_語法 +--- +<h3 id="throw_語法" name="throw_語法">throw 語法</h3> +<p>使用 <code>throw</code> 語法來拋出例外。當你準備要拋出例外時,指定內含想要拋出的值的表達式︰</p> +<pre class="eval">throw expression; +</pre> +<p>你可以拋出任何的表達式,而不只是特定類型的表達式。以下代碼拋出各式各樣的例外︰</p> +<pre class="eval">throw "Error2"; +throw 42; +throw true; +throw {toString: function() { return "I'm an object!"; } }; +</pre> +<div class="note"> + <strong>附註:</strong> 當拋出例外時,還可以指定物件。然後可以在 <code>catch</code> 區塊裡參考物件的屬性。以下範例建立 <code>UserException</code> 類型的物件 <code>myUserException</code>,並使用在拋出語法之中。</div> +<pre class="eval">// 建立類型為 UserException 的物件 +function UserException (message) +{ + this.message=message; + this.name="UserException"; +} + +// 當用來當作字串時(例如,用於錯誤控制台), +// 就把例外轉換成適當的字串。 +UserException.prototype.toString = function () +{ + return this.name + ': "' + this.message + '"'; +} + +// 建立那一種物件類型的實體,並拋出 +throw new UserException("Value too high"); +</pre> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/try...catch_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/try...catch_語法/index.html new file mode 100644 index 0000000000..2bc150c6fc --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/例外處理語法/try...catch_語法/index.html @@ -0,0 +1,162 @@ +--- +title: try...catch 語法 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/例外處理語法/try...catch_語法 +--- +<h3 id="try...catch_語法" name="try...catch_語法">try...catch 語法</h3> + +<p><code>try...catch</code> 語法標記出一整塊需要測試的語句,並指定一個以上的回應方法,萬一有例外拋出時,<code>try...catch</code> 語句就會捕捉。</p> + +<p><code>try...catch</code> 語法由 <code>try</code> 區塊所組成,其中內含一個以上的語句,和零個以上的 <code>catch</code> 區塊,其中內含語句用來指明當例外在 try 區塊裡拋出時要做些什麼。也就是當你希望 <code>try</code> 區塊成功,但如果他不成功時,你會想要把控制權移交給 <code>catch</code> 區塊。如果任何在 <code>try</code> 區塊內部裡的語句(或者在 <code>try</code> 區塊內部呼叫的函數裡)拋出例外,控制權將立即轉移給 <code>catch</code> 區塊。如果沒有例外從 <code>try</code> 區塊裡拋出,就會跳過 <code>catch</code> 區塊。<code>finally</code> 區塊會在 <code>try</code> 或 <code>catch</code> 區塊執行之後才執行,但會在 <code>try...catch</code> 語法後面的語句之前執行。</p> + +<p>以下範例使用 <code>try...catch</code> 語法。本範例呼叫函數,這個函數是用來在陣列裡根據傳給函數的值來查詢月份的名稱。如果傳入的值不符合月份的數字 (1-12),就會拋出值為 <code>InvalidMonthNo</code> 的例外,而且在 <code>catch</code> 區塊裡的語句會把 <code>monthName</code> 變數設定為 <code>unknown</code>。</p> + +<pre class="notranslate">function getMonthName (mo) { + mo=mo-1; // 針對陣列索引調整月份的數字 (1=Jan, 12=Dec) + var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul", + "Aug","Sep","Oct","Nov","Dec"); + if (months[mo] != null) { + return months[mo] + } else { + throw "InvalidMonthNo" + } +} + +try { +// 需要測試的語句 + monthName=getMonthName(myMonth) // 可拋出例外的函數 +} +catch (e) { + monthName="unknown" + logMyErrors(e) // 把例外物件傳給錯誤處理器 +} +</pre> + +<h4 id="catch_區塊" name="catch_區塊">catch 區塊</h4> + +<p>你可以使用單一的 <code>catch</code> 區塊來處理所有在 <code>try</code> 區塊裡可能會產生的例外,或者你也可以使用分離的 <code>catch</code> 區塊,每一個皆各自處理特定的例外類型。</p> + +<p><strong>單一 catch 區塊</strong><br> + 使用單一 <code>try...catch</code> 語法的 <code>catch</code> 區塊針對在 <code>try</code> 區塊裡拋出的所有例外來執行錯誤處理的代碼。</p> + +<p>單一的 <code>catch</code> 區塊語句如下︰</p> + +<pre class="notranslate">catch (catchID) { + statements +} +</pre> + +<p><code>catch</code> 區塊所指定的識別子(前面語句裡的 <code>catchID</code>)持有由 <code>throw</code> 語法所指定的值。你可以使用這個識別子來取得有關於被拋出的例外的資訊。當進入 <code>catch</code> 區塊時,JavaScript 就會建立這個識別子。識別子只能在 <code>catch</code> 區塊的期間內持續作用。<code>catch</code> 區塊執行結束以後,識別子就不再能使用。</p> + +<p>舉例來說,以下代碼會拋出例外。當例外出現的時候,控制權就轉移給 <code>catch</code> 區塊。</p> + +<pre class="notranslate">try { + throw "myException" // 產生例外 +} +catch (e) { +// 用來處理任何例外的語句 + logMyErrors(e) // 把例外物件傳給錯誤處理器 +} +</pre> + +<p><strong>多重 catch 區塊</strong><br> + 單一的 <code>try</code> 語句可以對應複數個有前提條件的 <code>catch</code> 區塊,每一個皆可處理特定的例外的類型。於是,當指定的的例外被拋出時,就只會進入適當條件的 <code>catch</code> 區塊。你也可以針對所有未指定的例外,使用選用性的對應所有例外的 <code>catch</code> 區塊來作為語法裡最後一個的 catch 區塊。</p> + +<p>舉例來說,以下函數呼叫三個其他的函數(已在別處定義了)來檢驗自己的參數。如果檢驗函數判斷出他所要檢驗的元素是無效的話,他就返回 0,導致呼叫者拋出對應的例外。</p> + +<pre class="notranslate">function getCustInfo(name, id, email) +{ + var n, i, e; + + if (!validate_name(name)) + throw "InvalidNameException" + else + n = name; + if (!validate_id(id)) + throw "InvalidIdException" + else + i = id; + if (!validate_email(email)) + throw "InvalidEmailException" + else + e = email; + cust = (n + " " + i + " " + e); + return (cust); +} +</pre> + +<p>有各種條件的 <code>catch</code> 區塊會把控制權安排給適當的例外處理器。</p> + +<pre class="notranslate">try { +// 可以拋出三個例外的函數 + getCustInfo("Lee", 1234, "lee@netscape.com") +} + +catch (e if e == "InvalidNameException") { +// 針對無效的名稱呼叫處理器 + bad_name_handler(e) +} + +catch (e if e == "InvalidIdException") { +// 針對無效的 ID 呼叫處理器 + bad_id_handler(e) +} + +catch (e if e == "InvalidEmailException") { +// 針對無效的電子郵件位址呼叫處理器 + bad_email_handler(e) +} + +catch (e){ +// 不知道該做什麼,就記在日誌裡 + logError(e) +} +</pre> + +<h4 id="finally_區塊" name="finally_區塊">finally 區塊</h4> + +<p><code>finally</code> 區塊內含的語句,會在 try 和 catch 區塊執行以後、並在 <code>try...catch</code> 語法後面的語句之前來執行。無論有沒有被拋出的例外,<code>finally</code> 區塊都會執行。如果有被拋出的例外,即使沒有 catch 區塊來處理這些例外,還是會執行 <code>finally</code> 區塊裡的語句。</p> + +<p>當出現例外時,你可以使用 <code>finally</code> 區塊來使你的 Script 優美的停止。舉例來說,你可能需要釋放 Script 所佔用的資源。以下範例開啟了檔案,並執行使用這個檔案(伺服端的 JavaScript 可讓你存取檔案)的語句。如果在開啟檔案時有例外被拋出,<code>finally</code> 區塊會在 Script 停止之前把檔案關閉。</p> + +<pre class="notranslate">openMyFile(); +try { + writeMyFile(theData); // 這裡有可能拋出錯誤 +}catch(e){ + handleError(e); // 如果我們得到錯誤,就處理他 +}finally { + closeMyFile(); // 永遠會關閉這項資源 +} +</pre> + +<h4 id="try...catch_語法的嵌套" name="try...catch_語法的嵌套">try...catch 語法的嵌套</h4> + +<p>你可以嵌套一個以上的 <code>try...catch</code> 語法。如果有一個內部的 <code>try...catch</code> 語法沒有 catch 區塊,圍住這些 <code>try...catch</code> 語法的 catch 區塊就會被用來比對。</p> + +<h4 id="Error_物件的用處" name="Error_物件的用處">Error 物件的用處</h4> + +<p>根據錯誤的類型,你有可能使用 “name” 和 “message” 屬性來取得更多明確的訊息。“name” 提供錯誤的一般類別(例如,“DOMException” 或 “Error”),“message” 通常提供更為簡練的訊息,如此就能把錯誤物件轉換為字串來取得訊息。</p> + +<p>如果你要拋出你自己的例外,以從這些屬性取得好處(例如,如果你的 catch 區塊不區分你自己的例外和系統的例外的話),你可以使用錯誤建構子。例如︰</p> + +<pre class="notranslate">function doSomethingErrorProne () { + if (ourCodeMakesAMistake()) { + throw (new Error('The message')); + } + else { + doSomethingToGetAJavascriptError(); + } +} +.... +try { + doSomethingErrorProne(); +} +catch (e) { + alert(e.name);// 警報 'Error' + alert(e.message); // 警報 'The message' 或 JavaScript 錯誤訊息 +} +</pre> + +<div class="noinclude"> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:例外處理語法:throw_語法", "Core_JavaScript_1.5_教學:函數的定義") }}</p> +</div> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/函數的定義/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/函數的定義/index.html new file mode 100644 index 0000000000..f56f796a03 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/函數的定義/index.html @@ -0,0 +1,42 @@ +--- +title: 函數的定義 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/函數的定義 +--- +<div class="onlyinclude"> <h3 id="函數的定義" name="函數的定義">函數的定義</h3> <p>函數的定義由以下的關鍵字所組成︰</p> <ul> <li>函數的名稱。</li> <li>傳給函數的參數的列表,以小括弧包夾、並以逗號分隔。</li> <li>用來定義函數的 JavaScript 語句,以大括弧包夾 { }。在函數裡的語句裡可含有在應用程式中已定義的其他函數的呼叫。</li> </ul> <h4 id="簡單的範例" name="簡單的範例">簡單的範例</h4> <p>舉例來說,以下代碼定義了一個簡單的函數,名為 square︰</p> <pre class="eval">function square(number) { + return number * number; +} +</pre> <p>函數 <code>square</code> 接收一個參數,稱為 <code>number</code>。函數由一個語句所組成,指示要求返回函數的參數的平方。<code>return</code> 語句用來指定函數返回的值。</p> <pre class="eval">return number * number +</pre> <p>原始的參數是<em>以值</em>傳遞給函數。值是傳遞給函數,但是如果函數修改了參數的值,這項改變不會影響到全域或呼叫端函數裡的值。</p> <p>如果你以物件(例如,<a href="/en/JavaScript/Glossary" title="en/JS/Glossary">非原始值</a>,如陣列或使用者定義的物件)作為參數來傳遞,物件的參考會被傳遞給函數。這意味著如果函數修改了物件的屬性,函數之外也看得見這項改變,如以下範例所示︰</p> <pre class="eval">function myFunc(theObject) { + theObject.make="Toyota"; +} +var mycar = {make:"Honda", model:"Accord", year:1998}; +var x=mycar.make; // 返回 Honda +myFunc(mycar); +var y=mycar.make; // 返回 Toyota(屬性已被函數修改) +</pre> <p>注意,把新的物件代入給參數,在呼叫端將<em>不會</em>有任何的影響︰</p> <pre class="eval">function myFunc(theObject) { + theObject = {make:"Ford", model:"Focus", year:2006}; +} +var mycar = {make:"Honda", model:"Accord", year:1998}; +var x=mycar.make; // 返回 Honda +myFunc(mycar); +var y=mycar.make; // 仍然返回 Honda +</pre> <h4 id="Defining_functions_conditionally" name="Defining_functions_conditionally">有條件的函數的定義</h4> <p>函數可以根據條件來作定義。例如,給以下的函數定義︰</p> <pre class="eval">if (num == 0) +{ + function myFunc(theObject) { + theObject.make="Toyota" + } +} +</pre> <p><code>myFunc</code> 函數只會在變數 <code>num</code> 等於 0 時被定義。如果 <code>num</code> 不等於 0,函數就不會被定義,且任何企圖執行這個函數的嘗試都將會失敗。</p> <h4 id="函數的表達式" name="函數的表達式">函數的表達式</h4> <p>函數也可以在表達式裡來作定義。這稱為<strong>函數表達式</strong>。一般這類函數都是<em>無名的</em>,他沒有名稱也沒關係。例如,函數 <code>square</code> 可以定義成︰</p> <pre class="eval">var square = function(number) {return number * number}; +</pre> <p>當要傳遞函數作為參數給另一個函數時,這個作法會很方便。以下範例示範了 map 函數的定義,然後呼叫端使用無名函數作為第一個參數︰</p> <pre class="eval">function map(f,a) { + var result=new Array; + for (var i = 0; i != a.length; i++) + result[i] = f(a[i]); + return result; +} +</pre> <p>接著呼叫</p> <pre class="eval">map(function(x) {return x * x * x}, [0, 1, 2, 5, 10]); +</pre> <p>返回 {{ mediawiki.external('0, 1, 8, 125, 1000') }}。</p> +</div> +<h4 id="參閱" name="參閱">參閱</h4> +<p>除了如前所述定義函數以外,你也可以定義 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_教學/預先定義的核心物件/函數物件" title="zh tw/Core JavaScript 1.5 教學/預先定義的核心物件/函數物件">函數物件</a>。</p> +<p>方法就是和物件相關聯的函數。你將會在 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_教學#%E7%89%A9%E4%BB%B6%E7%9A%84%E9%81%8B%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學#物件的運用">第 8 章,「物件的運用」</a> 中學到更多有關於物件和方法。{{ PreviousNext("Core_JavaScript_1.5_教學:例外處理語法:try...catch_語法", "Core_JavaScript_1.5_教學:函數的呼叫") }}</p> +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/Defining_Functions", "fr": "fr/Guide_JavaScript_1.5/D\u00e9finition_de_fonctions", "ja": "ja/Core_JavaScript_1.5_Guide/Defining_Functions", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Definiowanie_funkcji" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/建立新的物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/建立新的物件/index.html new file mode 100644 index 0000000000..faadc10f07 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/建立新的物件/index.html @@ -0,0 +1,9 @@ +--- +title: 建立新的物件 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/建立新的物件 +--- +<p> </p> + +<p>This page was auto-generated because a user created a sub-page to this page.</p> + +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/break_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/break_語法/index.html new file mode 100644 index 0000000000..ea6551a851 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/break_語法/index.html @@ -0,0 +1,27 @@ +--- +title: break 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/循環語法/break_語法 +--- +<h3 id="break_語法" name="break_語法">break 語法</h3> +<p>使用 <code>break</code> 語法可以終止 <code>loop、switch、label</code> 語法。</p> +<ul> + <li>當你使用不加標籤的 <code>break</code> 時,他會立即終止最內層的 <code>while、do-while、for</code>、<code>switch</code> 的循環,並把控制權轉移給後面的語句。</li> + <li>當你使用加上標籤的 <code>break</code> 時,他會終止被指定的標籤所標記的語句。</li> +</ul> +<p>break 語法如下︰</p> +<ol> + <li><code>break;</code></li> + <li><code>break label;</code></li> +</ol> +<p>第一個語句形式會終止最內層的循環或 <code>switch</code>,第二個語句形式會終止指定標籤的語句。</p> +<p><strong>範例</strong><br> + 在以下的範例中,反覆操作陣列裡的元素,直到找到某個索引的元素的值等於 <code>theValue</code>︰</p> +<pre>for (i = 0; i < a.length; i++) { + if (a[i] == theValue) + break; +} +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法:label_語法", "Core_JavaScript_1.5_教學:循環語法:continue_語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/continue_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/continue_語法/index.html new file mode 100644 index 0000000000..68f757d572 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/continue_語法/index.html @@ -0,0 +1,49 @@ +--- +title: continue 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/循環語法/continue_語法 +--- +<h3 id="continue_語法" name="continue_語法">continue 語法</h3> +<p><code>continue</code> 語法可用來重新開始 <code>while、do-while、for、</code><code>label</code> 語法。</p> +<ul> + <li>當你使用沒加標籤的 <code>continue</code> 時,他會終止這一次的最內層的 <code>while、do-while</code>、<code>for</code> 語法的反覆過程,並繼續執行下一次的反覆過程。與 <code>break</code> 語法相較之下,<code>continue</code> 不會終止整個循環的執行。在 <code>while</code> 循環中,他會跳回條件處。在 <code>for</code> 循環中,他會跳回遞增表達式。</li> + <li>當你使用加上標籤的 <code>continue</code> 時,他會跳到以 <code>label</code> 標記的循環語句。</li> +</ul> +<p><code>continue</code> 語法如下︰</p> +<ol> + <li><code>continue</code></li> + <li><code>continue label</code></li> +</ol> +<p><strong>範例 1</strong><br> + 以下範例示範加上 <code>continue</code> 語法的 <code>while</code> 循環,<code>continue</code> 語法會在 <code>i</code> 值為 3 時執行。因此,<code>n</code> 的值依序為 1、3、7、12。</p> +<pre class="eval">i = 0; +n = 0; +while (i < 5) { + i++; + if (i == 3) + continue; + n += i; +} +</pre> +<p><strong>範例 2</strong><br> + 已加上標籤的語法 <code>checkiandj</code> 內含已加上標籤的語法 <code>checkj</code>。如果遇到 <code>continue</code>,程式會終止 <code>checkj</code> 這一次的反覆過程,並開始下一次的反覆過程。每當遇到 <code>continue</code>,就會反覆執行 <code>checkj</code> 直到他的條件返回 false 為止。當返回 false 時,<code>checkiandj</code> 語句完成了餘數的計算,且 <code>checkiandj</code> 會反覆執行,直到他的條件返回為 false 為止。當返回 false 時,程式繼續執行 <code>checkiandj</code> 後面的語句。</p> +<p>如果 <code>continue</code> 有一個 <code>checkiandj</code> 標籤,程式就會從 <code>checkiandj</code> 語句的開始處繼續執行。</p> +<pre>checkiandj : + while (i < 4) { + document.write(i + "<br/>"); + i += 1; + checkj : + while (j > 4) { + document.write(j + "<br/>"); + j -= 1; + if ((j % 2) == 0) + continue checkj; + document.write(j + " is odd.<br/>"); + } + document.write("i = " + i + "<br/>"); + document.write("j = " + j + "<br/>"); + } +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法:break_語法", "Core_JavaScript_1.5_教學:物件的操作語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/do...while_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/do...while_語法/index.html new file mode 100644 index 0000000000..5091d476fd --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/do...while_語法/index.html @@ -0,0 +1,22 @@ +--- +title: do...while 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/循環語法/do...while_語法 +--- +<h3 id="do...while_語法" name="do...while_語法">do...while 語法</h3> +<p><code>do...while</code> 語法會反覆執行直到指定條件的求值結果為 false 為止。<code>do...while</code> 語法如下︰</p> +<pre class="eval">do + statement +while (condition); +</pre> +<p><code>statement</code> 會在檢測條件之前就先執行一次。若要執行多個語句,就使用區塊語法(<code>{ ... }</code>)把語句群組化。如果 <code>condition</code> 為 true,就會再執行一次語句。每回執行以後,就會檢測條件。當條件為 false 時,就停止執行並把控制權轉移給 <code>do...while</code> 後面的語句。</p> +<p><strong>範例</strong><br> + 在以下範例中,do 循環至少會反覆執行一次,並一直反覆到 i 不再小於 5 為止。</p> +<pre class="eval">do { + i += 1; + document.write(i); +} while (i < 5); +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法:for_語法", "Core_JavaScript_1.5_教學:循環語法:while_語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/for_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/for_語法/index.html new file mode 100644 index 0000000000..8978b7ed27 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/for_語法/index.html @@ -0,0 +1,53 @@ +--- +title: for 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/循環語法/for_語法 +--- +<h3 id="for_語法" name="for_語法">for 語法</h3> +<p><code>for</code> 循環反覆執行直到指定的條件的求值為 false 為止。JavaScript 的 for 循環和 Java 和 C 的 for 循環很類似。<code>for</code> 語法如下︰</p> +<pre class="eval">for ([initialExpression]; [condition]; [incrementExpression]) + statement +</pre> +<p>執行 <code>for</code> 循環時,會執行以下步驟︰</p> +<ol> + <li>執行初始化表達式 <code>initialExpression</code>。這個表達式通常會初始化為 1 以上的計數器,不過也可以是任意複雜程度的表達式。也可以在表達式裡宣告變數。</li> + <li>對 <code>condition</code> 表達式求值。如果 <code>condition</code> 的值為 true,就會執行循環語法。如果 <code>condition</code> 的值為 false,就終止 <code>for</code> 循環。如果完全省略 <code>condition</code> 表達式,條件就會被代入為 true。</li> + <li>執行 <code>statement</code>。若要執行多個語句,就使用區塊語法(<code>{ ... }</code>)把這些語句群組化。</li> + <li>執行更新表達式 <code>incrementExpression</code>,並回到第 2 步驟。</li> +</ol> +<p><strong>範例</strong><br> + 以下函數內含 <code>for</code> 語法,計數至下拉式選單的已選擇選項的數目為止(Select 物件允許複選)。<code>for</code> 語法宣告變數 <code>i</code> 並以 0 初始化。他會檢驗 <code>i</code> 是否小於 <code>Select</code> 物件的選項數目,持續執行 <code>if</code> 語句,並在每一次循環之後以 1 遞增 <code>i</code>。</p> +<pre><script type="text/javascript">//<![CDATA[ + +function howMany(selectObject) { + var numberSelected = 0; + for (var i = 0; i < selectObject.options.length; i++) { + if (selectObject.options[i].selected) + numberSelected++; + } + return numberSelected; +} + +//]]></script> +<form name="selectForm"> + <p> + <strong>Choose some music types, then click the button below:</strong> + <br/> + <select name="musicTypes" multiple="multiple"> + <option selected="selected">R&B</option> + <option>Jazz</option> + <option>Blues</option> + <option>New Age</option> + <option>Classical</option> + <option>Opera</option> + </select> + </p> + <p> + <input type="button" value="How many are selected?" + onclick="alert ('Number of options selected: ' + howMany(document.selectForm.musicTypes))"/> + </p> +</form> +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法", "Core_JavaScript_1.5_教學:循環語法:do...while_語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/label_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/label_語法/index.html new file mode 100644 index 0000000000..8b63254ac1 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/label_語法/index.html @@ -0,0 +1,22 @@ +--- +title: label 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/循環語法/label_語法 +--- +<h3 id="label_語法" name="label_語法">label 語法</h3> +<p><code>label</code> 提供識別子作為語法,可讓你的程式的任何一處都能參考得到。舉例來說,你可以使用標籤來標識循環,然後使用 <code>break</code> 或 <code>continue</code> 語法來指示程式是否要中斷循環或繼續執行。</p> +<p><code>label</code> 語法如下︰</p> +<pre>label : + statement +</pre> +<p><code>label</code> 的值可以是任意的 JavaScript 識別子,只要不是保留字的話都可以使用。使用標籤來標識的 <code>statement</code> 可以是任意的語句。</p> +<p><strong>範例</strong><br> + 在以下範例中,標籤 <code>markLoop</code> 標識了 while 循環。</p> +<pre>markLoop: +while (theMark == true) + doSomething(); +} +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法:while_語法", "Core_JavaScript_1.5_教學:循環語法:break_語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/while_語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/while_語法/index.html new file mode 100644 index 0000000000..76beeaafeb --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/循環語法/while_語法/index.html @@ -0,0 +1,38 @@ +--- +title: while 語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/循環語法/while_語法 +--- +<h3 id="while_語法" name="while_語法">while 語法</h3> +<p><code>while</code> 語法會執行他的語句,只要指定的條件的求值結果為 true。<code>while</code> 語法如下︰</p> +<pre class="eval">while (condition) + statement +</pre> +<p>如果條件變成 false,就停止執行循環內部的 <code>statement</code>,並把控制權移交給循環後面的語句。</p> +<p>條件的測試會發生在執行循環裡的 <code>statement</code> 之前。如果返回的條件為 true,就會執行 <code>statement</code>,並再次測試條件。如果返回的條件為 false,就停止執行並把控制權移交給 <code>while</code> 後面的語句。</p> +<p>若要執行多個語句,就使用區塊語法({ ... })把這些語句群組化。</p> +<p><strong>範例 1</strong><br> + 以下 <code>while</code> 循環會一直反覆直到 <code>n</code> 小於 3 為止︰</p> +<pre class="eval">n = 0; +x = 0; +while (n < 3) { + n++; + x += n; +} +</pre> +<p>每一次的反覆,循環便會遞增 <code>n</code> 並且把 <code>n</code> 的值代入給 <code>x</code>。因此,<code>x</code> 和 <code>n</code> 持有下列的值︰</p> +<ul> + <li>第一次循環以後︰<code>n</code> = 1、<code>x</code> = 1</li> + <li>第二次循環以後︰<code>n</code> = 2、<code>x</code> = 3</li> + <li>第三次循環以後︰<code>n</code> = 3、<code>x</code> = 6</li> +</ul> +<p>第三次的循環完成以後,條件 <code>n</code> < 3 不再為 true,所以終止循環。</p> +<p><strong>範例 2</strong><br> + 應避免無限循環。確認循環裡的條件最終一定會變成 false。否則循環永遠不會終止。下面的 <code>while</code> 循環裡的語句將會永遠執行下去,因為條件永遠不會變成 false︰</p> +<pre class="eval">while (true) { + alert("Hello, world"); +} +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法:do...while_語法", "Core_JavaScript_1.5_教學:循環語法:label_語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/getter_和_setter_的定義/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/getter_和_setter_的定義/index.html new file mode 100644 index 0000000000..222529aa18 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/getter_和_setter_的定義/index.html @@ -0,0 +1,110 @@ +--- +title: Getter 和 Setter 的定義 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/Getter_和_Setter_的定義 +--- +<p> </p> + +<h3 id="Getter_和_Setter_的定義" name="Getter_和_Setter_的定義">Getter 和 Setter 的定義</h3> + +<p>Getter 是用來取得指定屬性的值的方法。Setter 是用來設定指定屬性的值的方法。你可以在所有預先定義的核心物件或使用者定義的物件(這類可支援新屬性的附加)中定義 Getter 和 Setter。為了定義 Getter 和 Setter,需要使用物件的字面表達語法。</p> + +<p>自 JavaScript 1.8.1 起,在設定物件和陣列裡的初始化子的屬性時,不再可以呼叫 Setter。</p> + +<p>以下的 JS shell 會話說明了 Getter 和 Setter 是如何在使用者定義的物件 o 裡運作的。<a class="internal" href="/zh_tw/SpiderMonkey/JavaScript_shell_%E7%B0%A1%E4%BB%8B" title="zh tw/SpiderMonkey/JavaScript shell 簡介">JS shell</a> 是一種應用程式,可讓開發者在分批模式或互動性的測試 JavaScript 代碼。</p> + +<pre>js> var o = {a:7, get b() {return this.a+1;}, set c(x) {this.a = x/2}}; +[object Object] +js> o.a; +7 +js> o.b; +8 +js> o.c = 50; +js> o.a; +25 +</pre> + +<p><code>o</code> 物件的屬性為︰</p> + +<ul> + <li>o.a - 數字</li> + <li>o.b - 返回 o.a 加 1 的 Getter</li> + <li>o.c - 把 o.a 的值設為所屬的 o.c 的值的一半的 Setter</li> +</ul> + +<p>另一種(Mozilla 限定)表示成一行的方式,也支援在物件的屬性上(如 "foo<strong>-</strong>bar")設定 Getter 和 Setter,其中物件需要加上引號。</p> + +<pre>var o = {a:7, 'b' getter:function () {return this.a + 1;}, c setter:function (x) {this.a = x / 2;}};</pre> + +<p>請注意定義在物件的字面表達中的 Getter 和 Setter 的函數名稱使用的〝[gs]et <em>property</em>()〞(有別於稍後介紹的 <code>__define[GS]etter__</code>)並不是 Getter 本身的名稱,即使 <code>[gs]et <em>propertyName</em>(){ }</code> 語法可能會使你把他誤解成別的事物。若要命名在 Getter 或 Setter 之中的函數的名稱,就使用〝[gs]et <em>property</em>()〞語法,把 Getter 的名稱放在 get 或 set 後面,然後在其後面放上函數的名稱。下面的範例示範如何在物件的字面表達中命名 Getter 函數︰</p> + +<pre>var objects = [{get a b(){return 1}}, + {a getter:function b(){return 1}}, + {"a" getter:function b(){return 1}}]; + +for (var i=0; i<objects.length; ++i) + print(objects[i].__lookupGetter__("a")) // 為每一個 Getter 輸出 "function b(){return 1}"。 +</pre> + +<p>這次 JavaScript shell 會話說明 Getter 和 Setter 如何擴充 Date 的原型,給所有預先定義的 <code>Date</code> 類別的實體加入 year 屬性。他使用了 <code>Date</code> 類別中既存的 <code>getFullYear</code> 以及 <code>setFullYear</code> 方法,以支援 year 屬性的 Getter 和 Setter。</p> + +<p>以下語句針對 year 屬性定義 Getter 和 Setter︰</p> + +<pre>js> var d = Date.prototype; +js> d.__defineGetter__("year", function() { return this.getFullYear(); }); +js> d.__defineSetter__("year", function(y) { this.setFullYear(y); }); +</pre> + +<p>以下語句在 <code>Date</code> 物件中使用 Getter 和 Setter︰</p> + +<pre>js> var now = new Date; +js> print(now.year); +2000 +js> now.year = 2001; +987617605170 +js> print(now); +Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001 +</pre> + +<div class="note">在 JavaScript 1.5 的開發期間,這些是內含用來在既存的物件上定義新的 Getter 或 Setter 的 <code>getter =</code> 或 <code>setter =</code> 表達式的摘要,這些語法現在已被廢棄,將會在目前的 JS 1.5 引擎中引發警告,在未來的版本中將會變成語法錯誤。這些都應該要避免。</div> + +<h3 id="Summary" name="Summary">概要</h3> + +<p>原則上,Getter 和 Setter 可以</p> + +<ul> + <li>使用 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E7%89%A9%E4%BB%B6%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AD%90%E7%9A%84%E4%BD%BF%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/新物件的建立/物件初始化子的使用">物件的初始化子</a> 定義,或</li> + <li>稍後在任意的時間點上對任意的物件使用 Getter 或 Setter 的添加方法來加入。</li> +</ul> + +<p>當要使用 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E7%89%A9%E4%BB%B6%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AD%90%E7%9A%84%E4%BD%BF%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/新物件的建立/物件初始化子的使用">物件的初始化子</a> 定義 Getter 和 Setter 的時候,你所需要做的是在 Getter 方法的前面加上 <code>get</code> 以及在 Setter 方法的前面加上 <code>set</code>。當然,Getter 方法不可以接受參數,Setter 方法則只能有一個參數(用來設定的新值)。舉例如下︰</p> + +<pre class="eval">o = { + a:7, + <strong>get</strong> b() { return this.a+1; }, + <strong>set</strong> c(x) { this.a = x/2; } +}; +</pre> + +<p>也可以在物件建立之後的任何時間點上,使用兩個稱作 <code>__defineGetter__</code> 和 <code>__defineSetter__</code> 的特殊方法,把 Getter 和 Setter 加到物件裡。這兩個方法需要 Getter 或 Setter 的名稱以字串的形式作為第一個參數。第二個參數是用來呼叫的函數作為 Getter 或 Setter。舉例如下(延用之前的例子):</p> + +<pre class="eval">o.__defineGetter__("b", function() { return this.a+1; }); +o.__defineSetter__("c", function(x) { this.a = x/2; }); +</pre> + +<p>這兩種形式的選擇,取決於你的程式設計風格以及手上的工作。如果你已經在定義原型的時候,使用了物件的初始化子,或許你在大多數時候都會選擇第一種形式。這種形式更加密集且自然。然而,如果你需要稍後加入 Getter 和 Setter – 因為你並未編寫原型或實際的物件 – 這時第二種形式就是唯一可行的形式。第二種形式或許是 JavaScript 的動態性質中最佳的表現 – 但這會使代碼難以閱讀和理解。</p> + +<div class="note"> +<p>在 Firefox 3.0 以前,Getter 和 Setter 並不支援 DOM 元素。舊版本的 Firefox 會默默的出錯。如果需要這些例外,修改 HTMLElement 的原型 <code>(HTMLElement.prototype.__define{{ mediawiki.external('SG') }}etter__)</code>,並且避免拋出例外。</p> +在 Firefox 3.0 中,在已定義的原型上定義 Getter 或 Setter 將會拋出例外。必須事先刪除這些屬性。舊版本的 Firefox 則沒有這個問題。</div> + +<h3 id="參閱">參閱</h3> + +<ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/%E7%89%A9%E4%BB%B6/defineGetter" title="zh tw/Core JavaScript 1.5 參考/全域物件/物件/defineGetter">__defineGetter__</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/%E7%89%A9%E4%BB%B6/defineSetter" title="zh tw/Core JavaScript 1.5 參考/全域物件/物件/defineSetter">__defineSetter__</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E9%81%8B%E7%AE%97%E5%AD%90/%E7%89%B9%E6%AE%8A%E9%81%8B%E7%AE%97%E5%AD%90/get_%E9%81%8B%E7%AE%97%E5%AD%90" title="zh tw/Core JavaScript 1.5 參考/運算子/特殊運算子/get 運算子">get</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E9%81%8B%E7%AE%97%E5%AD%90/%E7%89%B9%E6%AE%8A%E9%81%8B%E7%AE%97%E5%AD%90/set_%E9%81%8B%E7%AE%97%E5%AD%90" title="zh tw/Core JavaScript 1.5 參考/運算子/特殊運算子/set 運算子">set</a></li> +</ul> + +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:使用_this_取得物件的參考", "Core_JavaScript_1.5_教學:新物件的建立:屬性的刪除") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/index.html new file mode 100644 index 0000000000..687b428275 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/index.html @@ -0,0 +1,18 @@ +--- +title: 新物件的建立 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立 +--- +<p> </p> +<h3 id="新物件的建立" name="新物件的建立">新物件的建立</h3> +<p>JavaScript 具備許多預先定義的物件。此外,你也可以建立你自己的物件。在 JavaScript 1.2 以後的版本中,你可以使用物件的初始化子來建立物件。另一個選擇是,你可以先建立建構子函數,然後使用這個函數以及 new 運算子來實體化物件。</p> +<ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E7%89%A9%E4%BB%B6%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AD%90%E7%9A%84%E4%BD%BF%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/新物件的建立/物件初始化子的使用">物件初始化子的使用</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E5%BB%BA%E6%A7%8B%E5%AD%90%E5%87%BD%E6%95%B8%E7%9A%84%E4%BD%BF%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/新物件的建立/建構子函數的使用">建構子函數的使用</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E7%89%A9%E4%BB%B6%E5%B1%AC%E6%80%A7%E7%9A%84%E7%B4%A2%E5%BC%95" title="zh tw/Core JavaScript 1.5 教學/新物件的建立/物件屬性的索引">物件屬性的索引</a></li> + <li><a href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E9%87%9D%E5%B0%8D%E7%89%A9%E4%BB%B6%E7%9A%84%E9%A1%9E%E5%9E%8B%E5%AE%9A%E7%BE%A9%E5%B1%AC%E6%80%A7" title="zh_tw/Core_JavaScript_1.5_教學/新物件的建立/針對物件的類型定義屬性">針對物件的類型定義屬性</a></li> + <li><a href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9A%E7%BE%A9" title="zh_tw/Core_JavaScript_1.5_教學/新物件的建立/方法的定義">方法的定義</a></li> + <li><a href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E4%BD%BF%E7%94%A8_this_%E5%8F%96%E5%BE%97%E7%89%A9%E4%BB%B6%E7%9A%84%E5%8F%83%E8%80%83" title="zh_tw/Core_JavaScript_1.5_教學/新物件的建立/使用_this_取得物件的參考">使用 this 取得物件的參考</a></li> + <li><a href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/Getter_%E5%92%8C_Setter_%E7%9A%84%E5%AE%9A%E7%BE%A9" title="zh_tw/Core_JavaScript_1.5_教學/新物件的建立/Getter_和_Setter_的定義">Getter 和 Setter 的定義</a></li> + <li><a href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%96%B0%E7%89%A9%E4%BB%B6%E7%9A%84%E5%BB%BA%E7%AB%8B/%E5%B1%AC%E6%80%A7%E7%9A%84%E5%88%AA%E9%99%A4" title="zh_tw/Core_JavaScript_1.5_教學/新物件的建立/屬性的刪除">屬性的刪除</a></li> +</ul> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:物件和屬性", "Core_JavaScript_1.5_教學:新物件的建立:物件初始化子的使用") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/使用_this_取得物件的參考/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/使用_this_取得物件的參考/index.html new file mode 100644 index 0000000000..6af61628b5 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/使用_this_取得物件的參考/index.html @@ -0,0 +1,27 @@ +--- +title: 使用 this 取得物件的參考 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/使用_this_取得物件的參考 +--- +<p> </p> +<h3 id="使用_this_取得物件的參考" name="使用_this_取得物件的參考">使用 this 取得物件的參考</h3> +<p>JavaScript 有特別的關鍵字,<code>this</code>,你可以在方法內部使用,用來參考使用中的物件。舉例來說,假設你有稱為 <code>validate</code> 的函數可以檢驗物件的 value 屬性,傳入的參數是物件和上限、下限值︰</p> +<pre>function validate(obj, lowval, hival) { + if ((obj.value < lowval) || (obj.value > hival)) + alert("Invalid Value!"); +} +</pre> +<p>然後,你可以在每一個表單的 <code>onchange 事件處理器</code>中呼叫 <code>validate</code>,使用 <code>this</code> 把 <code>form</code> 元素傳給函數,如下所示︰</p> +<pre><input type="text" name="age" size="3" + onChange="validate(this, 18, 99)"> +</pre> +<p>一般來說,<code>this</code> 會參考方法裡的呼叫端物件。</p> +<p>如果和 <code>form</code> 的屬性結合使用<span style="font-family: monospace;">,</span><code>this</code> 可以參考使用中物件的親表單。在下面的範例中,表單 <code>myForm</code> 內含 <code>Text</code> 物件以及按鈕。當使用者按下按鈕,表單的名稱就會被設成 <code>Text</code> 物件裡的值。按鈕的 <code>onclick</code> 事件處理器使用 <code>this.form</code> 來參考親表單 <code>myForm</code>。</p> +<pre><form name="myForm"> +<p><label>Form name:<input type="text" name="text1" value="Beluga"></label> +<p><input name="button1" type="button" value="Show Form Name" + onclick="this.form.text1.value=this.form.name"> +</p> +</form> +</pre> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:方法的定義", "Core_JavaScript_1.5_教學:新物件的建立:Getter 和 Setter 的定義") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/屬性的刪除/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/屬性的刪除/index.html new file mode 100644 index 0000000000..ba099fa041 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/屬性的刪除/index.html @@ -0,0 +1,21 @@ +--- +title: 屬性的刪除 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/屬性的刪除 +--- +<p> </p> +<h3 id="屬性的刪除" name="屬性的刪除">屬性的刪除</h3> +<p>你可以使用 <code>delete</code> 運算子移除屬性。下面的代碼示範如何移除屬性︰</p> +<pre>// 建立新的物件 myobj,以及兩個屬性 a 和 b。 +myobj = new Object; +myobj.a = 5; +myobj.b = 12; + +// 移除一個屬性,只剩 b 屬性留在 myobj 裡。 +delete myobj.a; +</pre> +<p>你也可以使用 <code>delete</code> 來刪除全域變數,只要這個變數不是使用 <code>var</code> 關鍵字宣告的話︰</p> +<pre>g = 17; +delete g; +</pre> +<p>參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E9%81%8B%E7%AE%97%E5%AD%90/%E7%89%B9%E6%AE%8A%E9%81%8B%E7%AE%97%E5%AD%90#delete" title="zh tw/Core JavaScript 1.5 教學/運算子/特殊運算子#delete">delete</a> 取得更多資訊。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:Getter_和_Setter_的定義", "Core_JavaScript_1.5_教學:預先定義的核心物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/建構子函數的使用/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/建構子函數的使用/index.html new file mode 100644 index 0000000000..b9832bf245 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/建構子函數的使用/index.html @@ -0,0 +1,58 @@ +--- +title: 建構子函數的使用 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/建構子函數的使用 +--- +<p> </p> +<h3 id="建構子函數的使用" name="建構子函數的使用">建構子函數的使用</h3> +<p>還有一個選擇,你可以按照這兩個步驟來建立物件︰</p> +<ol> + <li>編寫建構子函數以完成物件類型的定義。</li> + <li>使用 new 建立物件的實體。</li> +</ol> +<p>若要定義物件類型,就指定物件類型的名稱、屬性、方法並建立函數。舉例來說,假設你想要給 car 建立物件類型。你希望這個物件的類型稱作<code> car</code>,而且你還希望他有 make、model、year 這些屬性。要做到這些,你需要編寫出以下的函數︰</p> +<pre>function car(make, model, year) { + this.make = make; + this.model = model; + this.year = year; +} +</pre> +<p>注意 <code>this</code> 是用來把傳送給函數的值代入給物件的屬性。</p> +<p>現在你可以建立稱作 <code>mycar</code> 的物件如下所示︰</p> +<pre>mycar = new car("Eagle", "Talon TSi", 1993); +</pre> +<p>這個語句建立 <code>mycar</code> 並且把指定的值代入給他自己的屬性。然後 <code>mycar.make</code> 的值是字串 "Eagle",<code>mycar.year</code> 是整數 1993,依此類推。</p> +<p>你可以藉由呼叫 <code>new</code> 來建立許多個 <code>car</code> 的物件。例如,</p> +<pre>kenscar = new car("Nissan", "300ZX", 1992); +vpgscar = new car("Mazda", "Miata", 1990); +</pre> +<p>物件可以有另一個物件本身的屬性。例如,假設你定義稱為 <code>person</code> 的物件如下︰</p> +<pre>function person(name, age, sex) { + this.name = name; + this.age = age; + this.sex = sex; +} +</pre> +<p>然後實體化兩個新的 person 物件如下︰</p> +<pre>rand = new person("Rand McKinnon", 33, "M"); +ken = new person("Ken Jones", 39, "M"); +</pre> +<p>然後你可以改寫 car 的定義,加入用來接受 <code>person</code> 物件的 owner 屬性,如下︰</p> +<pre>function car(make, model, year, owner) { + this.make = make; + this.model = model; + this.year = year; + this.owner = owner; +} +</pre> +<p>若要實體化新的物件,你可以如下使用︰</p> +<pre>car1 = new car("Eagle", "Talon TSi", 1993, rand); +car2 = new car("Nissan", "300ZX", 1992, ken); +</pre> +<p>注意,當建立新的物件的時候,傳入的並不是字面表達字串或整數值,上面的語句把 <code>rand</code> 和 <code>ken</code> 物件當作參數傳給 owners。然後如果你希望找出 car2 的 owner 的名稱,你可以如下存取屬性︰</p> +<pre>car2.owner.name +</pre> +<p>注意,你永遠可以給之前定義的物件加入屬性。例如,語句</p> +<pre>car1.color = "black" +</pre> +<p>把 <code>color</code> 屬性加入給 car1,並且把 "black" 的值代入給新加入的屬性。然而,這樣並不能影響到其他的任何物件。若要給所有同樣類型的物件加入新的屬性,你必須把新的屬性加入到 car 物件類型的定義。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:物件初始化子的使用", "Core_JavaScript_1.5_教學:新物件的建立:物件屬性的索引") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/方法的定義/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/方法的定義/index.html new file mode 100644 index 0000000000..67a9250b8e --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/方法的定義/index.html @@ -0,0 +1,40 @@ +--- +title: 方法的定義 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/方法的定義 +--- +<p> </p> +<h3 id="方法的定義" name="方法的定義">方法的定義</h3> +<p><em>方法</em>就是和物件連繫在一起的函數。定義方法和定義標準函數的方式皆相同。然後使用下面的語句把函數和現存的物件連繫在一起︰</p> +<pre>object.methodname = function_name +</pre> +<p>此處的 <code>object</code> 就是現存的物件,<code>methodname</code> 就是分配給方法的名稱,<code>function_name</code> 就是函數的名稱。</p> +<p>然後你可以呼叫物件中的方法如下︰</p> +<pre>object.methodname(params); +</pre> +<p>你可以藉由含入物件的建構子函數裡的方法定義,針對物件的類型來定義方法。例如,你可以定義函數,用來格式化並顯示先前定義的 car 物件的屬性。例如,</p> +<pre>function displayCar() { + var result = "A Beautiful " + this.year + " " + this.make + + " " + this.model; + pretty_print(result); +} +</pre> +<p>此處的 <code>pretty_print</code> 是用來顯示水平格線和字串的函數。注意 <code>this</code> 是用來參考方法所屬的物件。</p> +<p>你可以在物件的定義中加上如下語句,把這個函數作為 car 的方法。</p> +<pre>this.displayCar = displayCar; +</pre> +<p>於是,<code>car</code> 的完整定義就會變成這樣</p> +<pre>function car(make, model, year, owner) { + this.make = make; + this.model = model; + this.year = year; + this.owner = owner; + this.displayCar = displayCar; +} +</pre> +<p>然後你可以給每一個物件呼叫 <code>displayCar</code> 方法如下︰</p> +<pre>car1.displayCar() +car2.displayCar() +</pre> +<p>產生的輸出顯示在下圖中。</p> +<p><img alt="Image:obja.gif" class="internal" src="/@api/deki/files/786/=Obja.gif"> <span style="font-weight: bold;">圖</span><small><strong> 7.1: 方法的輸出的顯示</strong></small></p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:針對物件的類型定義屬性", "Core_JavaScript_1.5_教學:新物件的建立:使用_this_取得物件的參考") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/物件初始化子的使用/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/物件初始化子的使用/index.html new file mode 100644 index 0000000000..79b7e5041b --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/物件初始化子的使用/index.html @@ -0,0 +1,23 @@ +--- +title: 物件初始化子的使用 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/物件初始化子的使用 +--- +<p> </p> +<h3 id="物件初始化子的使用" name="物件初始化子的使用">物件初始化子的使用</h3> +<p>除了使用建構子函數來建立物件以外,你也可以使用物件的初始化子來建立物件。使用物件的初始化子,有時又被稱為以字面表達記法來建立物件。「物件初始化子」與 C++ 的術語一致。</p> +<p>使用物件初始化子的語句如下︰</p> +<pre class="eval">var obj = { property_1: value_1, // 通常以 property_# 代表識別子... + 2: value_2, // 或者使用數字... + ..., + "property_n": value_n }; // 或者使用字串</pre> +<p>此處的 <code>obj</code> 就是新物件的名稱,每一個 <code>property_<em>i</em></code> 都是識別子(可以是名稱、數字、字串的字面表達),而且每一個 <code>value_<em>i</em></code> 都是表達式,其值會代入給 <code>property_<em>i</em></code>。<code>obj</code> 和代入動作不是必要的;如果你不需要在其他地方參考這個物件,你就不需要把物件代入給變數。(注意,你也許需要以圓括弧代替花括弧來包裝物件的字面表達,如果預期物件出現的地方會有其他語句,就要避免和區塊語法相混淆。)</p> +<p>如果物件是在最頂層的 Script 中以物件初始化子來建立的,每一次要對內含該物件的字面表達求值時,JavaScript 就會把他解譯成物件。此外,用在函數裡的初始化子,會在每一次呼叫函數的時候建立。</p> +<p>以下的語句建立物件,並把他代入給變數 <code>x</code>,但只在表達式的條件為 true 時如此。</p> +<pre class="eval">if (cond) x = {hi:"there"}; +</pre> +<p>以下例子使用了三個屬性來建立 <code>myHonda</code>。注意,<code>engine</code> 屬性也是物件,並連結有自己的屬性。</p> +<pre class="eval">var myHonda = {color:"red",wheels:4,engine:{cylinders:4,size:2.2}}; +</pre> +<p>你也可以使用物件的初始化子來建立陣列。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E5%AD%97%E9%9D%A2%E8%A1%A8%E9%81%94#%E9%99%A3%E5%88%97%E7%9A%84%E5%AD%97%E9%9D%A2%E8%A1%A8%E9%81%94" title="zh tw/Core JavaScript 1.5 教學/字面表達#陣列的字面表達">陣列的字面表達</a>。</p> +<p>在 JavaScript 1.1 以後的版本中,你無法再使用物件的初始化子。你只能使用他們的建構子函數或者使用由某些其他用途的物件所提供的函數來建立物件。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E5%BB%BA%E7%AB%8B%E6%96%B0%E7%9A%84%E7%89%A9%E4%BB%B6/%E5%BB%BA%E6%A7%8B%E5%AD%90%E5%87%BD%E6%95%B8%E7%9A%84%E4%BD%BF%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/建立新的物件/建構子函數的使用">建構子函數的使用</a>。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立", "Core_JavaScript_1.5_教學:新物件的建立:建構子函數的使用") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/物件屬性的索引/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/物件屬性的索引/index.html new file mode 100644 index 0000000000..08e243c78b --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/物件屬性的索引/index.html @@ -0,0 +1,10 @@ +--- +title: 物件屬性的索引 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/物件屬性的索引 +--- +<p> </p> +<h3 id="物件屬性的索引" name="物件屬性的索引">物件屬性的索引</h3> +<p>在 JavaScript 1.0 中,你可以使用物件的屬性名稱或序號索引來參考物件的屬性。然而,在 JavaScript 1.1 以後的版本中,如果你最初使用名稱來定義屬性,你就必須永遠使用名稱來參考屬性,如果你最初使用索引來定義屬性,你就必須永遠使用索引來參考屬性。</p> +<p>這些限制出現在,當你使用建構子函數來建立物件及其屬性的時候(例如我們之前的 Car 物件類型),以及當你明確的定義個別的屬性的時候(例如,<code>myCar.color = "red"</code>)。如果你最初使用索引來定義物件的屬性,如 <code>myCar{{ mediawiki.external(5) }} = "25 mpg"</code>,隨後你只能以 <code>myCar{{ mediawiki.external(5) }}</code> 來參考這個屬性。</p> +<p>這個規則的例外是從 HTML 反映過來的物件,如 <code>forms</code> 陣列。你永遠可以使用序號(以在文件中出現的位置為基準)或他們的名稱(如果有定義的話)來參考這些陣列。舉例來說,如果在文件中的第二個 <code><FORM></code> 標記中有 "myForm" 的 <code>NAME</code> 屬性,你可以使用 <code>document.forms{{ mediawiki.external(1) }}</code> 或 <code>document.forms{{ mediawiki.external('\"myForm\"') }}</code> 或 <code>document.myForm</code> 來參考表單。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:建構子函數的使用", "Core_JavaScript_1.5_教學:新物件的建立:針對物件的類型定義屬性") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/針對物件的類型定義屬性/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/針對物件的類型定義屬性/index.html new file mode 100644 index 0000000000..0d1e55ac71 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/新物件的建立/針對物件的類型定義屬性/index.html @@ -0,0 +1,12 @@ +--- +title: 針對物件的類型定義屬性 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/新物件的建立/針對物件的類型定義屬性 +--- +<p> </p> +<h3 id="針對物件的類型定義屬性" name="針對物件的類型定義屬性">針對物件的類型定義屬性</h3> +<p>你可以透過 <code>prototype</code> 屬性的使用來給之前定義的物件加入新的屬性。這種屬性的定義方式可以共用給所有指定類型的物件,而不只是針對單一的物件實體。以下代碼給所有的 <code>car</code> 類型的物件加入 <code>color</code> 屬性,然後把值代入給 <code>car1</code> 物件的 <code>color</code> 屬性。</p> +<pre>Car.prototype.color=null; +car1.color="black"; +</pre> +<p>參閱 <a href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83" title="zh_tw/Core_JavaScript_1.5_參考">Core JavaScript 參考</a>・函數物件・<a href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/%E5%87%BD%E6%95%B8#%E5%B1%AC%E6%80%A7" title="zh_tw/Core_JavaScript_1.5_參考/全域物件/函數#屬性"><code>prototype</code> 屬性</a> 以取得更多資訊。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:新物件的建立:物件屬性的索引", "Core_JavaScript_1.5_教學:新物件的建立:方法的定義") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式模式的編寫/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式模式的編寫/index.html new file mode 100644 index 0000000000..e07b2f6aa4 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式模式的編寫/index.html @@ -0,0 +1,184 @@ +--- +title: 正規表達式模式的編寫 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/正規表達式模式的編寫 +--- +<p>正規表達式的模式是由簡單的字元所組成,如 <code>/abc/</code>,或由簡單的和特殊的字元所組成,如 <code>/ab*c/</code> 或 <code>/Chapter (\d+)\.\d*/</code>。後者含有用來記憶的括弧。以模式的某一部分所產生的比對結果會被記憶起來以供稍後使用,已在 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%AD%A3%E5%89%87%E8%A1%A8%E9%81%94%E5%BC%8F%E7%9A%84%E9%81%8B%E7%94%A8/%E6%8B%AC%E5%BC%A7%E5%AD%90%E5%AD%97%E4%B8%B2%E7%9A%84%E6%AF%94%E5%B0%8D%E7%B5%90%E6%9E%9C%E7%9A%84%E9%81%8B%E7%94%A8" title="zh tw/Core JavaScript 1.5 教學/正則表達式的運用/括弧子字串的比對結果的運用">括弧子字串的比對結果的運用</a> 一文中解說。</p> +<h2 id="簡單模式的使用" name="簡單模式的使用">簡單模式的使用</h2> +<p>簡單的模式直接由想要尋找的字元所組成。例如,<code>/abc/</code> 的模式只在字元 'abc' 以同樣順序一起出現時,比對出字串裡的字元。在字串 "Hi, do you know your abc's?" 和 "The latest airplane designs evolved from slabcraft." 中將會比對成功。在兩個例子中,都比對出子字串 'abc'。在字串 "Grab crab" 中沒有比對結果,因為字串裡並未含有子字串 'abc'。</p> +<h2 id="特殊字元的使用" name="特殊字元的使用">特殊字元的使用</h2> +<p>當搜尋的需求遠遠超出直接比對的能力時,如尋找 1 個以上的全部的 b,或是尋找含有特殊字元的空白部分。舉例來說,<code>/ab*c/</code> 的模式可比對出所有以 'a' 後接 0 個以上的全部的 'b'(* 的意思是前項出現 0 個以上)並緊接者 'c' 的字元。在字串 "cbbabbbbcdebc" 裡,可以比對出子字串 'abbbbc'。</p> +<p>下表提供完整的列表,並解說可用於正規表達式的特殊字元。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>字元</th> + <th>意義</th> + </tr> + <tr> + <td>\</td> + <td>可分為以下兩種︰ + <ul> + <li>對於那些沒有特殊意義的字元,反斜線可指示下一個字元為特殊的、不照字面解譯。舉例來說,<code>/b/ </code> 比對字元 'b'。藉由在 b 前面放置反斜線,也就是使用 <code>/\b/</code>,這個字元的特殊意義就變成比對文字的邊界。</li> + <li>對於那些有特別意義的字元,就利用反斜線指示下一個字元並非特殊的、應該照字面解譯。舉例來說,* 是一個意義為前項出現 0 個以上的特殊字元。例如,<code>/a*/</code> 意思是比對 0 個以上的全部的 a。如果要照字面比對 *,就在前面加上反斜線。例如,<code>/a\*/</code> 比對出 'a*'。</li> + </ul> + </td> + </tr> + <tr> + <td>^</td> + <td>比對輸入的開頭處。如果把多行標誌設為 true,也會比對緊接在換行字元之後的字元。舉例來說,<code>/^A/</code> 不會在 "an A" 裡比對出 'A',但會在 "An A" 裡比對出第一個 'A'。</td> + </tr> + <tr> + <td>$</td> + <td>比對輸入的末尾處。如果把多行標誌設為 true,也會比對緊接在換行字元之前的字元。舉例來說,<code>/t$/</code> 不會在 "eater" 裡比對出 't',但會在 "eat" 裡比對出來。</td> + </tr> + <tr> + <td>*</td> + <td>比對前面的字元 0 次以上。舉例來說,<code>/bo*/</code> 在 "A ghost booooed" 比對出 'boooo',並在 "A bird warbled" 比對出 'b',但不會在 "A goat grunted" 比對出來。</td> + </tr> + <tr> + <td>+</td> + <td>比對前面的字元 1 次以上。等價於 {1,}。舉例來說,<code>/a+/</code> 在 "candy" 比對出 'a',並在 "caaaaaaandy" 比對出所有的 a。</td> + </tr> + <tr> + <td>?</td> + <td>比對前面的字元 0 次或 1 次。 + <p>舉例來說,<code>/e?le?/</code> 在 "angel" 比對出 'el',並在 "angle" 比對出 'le'。</p> + <p>如果緊接在任何一個數量子 *、+、?、{} 之後來使用,將使數量子非貪婪(比對出最小的次數),而預設值是貪婪的(比對出最大的次數)。舉例來說,使用 <code>/\d+/</code> 比對 "123abc" 便返回 "123",如果使用 <code>/\d+?/</code>,只有 "1" 會被比對出來。</p> + 也用於表示預讀,在本表的 x(?=y) 和 x(?!y) 中有說明。</td> + </tr> + <tr> + <td>.</td> + <td>小數點比對任意的單一字元,除了換行字元以外。舉例來說,<code>/.n/</code> 在 "nay, an apple is on the tree" 比對出 'an' 和 'on',而非 'nay'。</td> + </tr> + <tr> + <td>(x)</td> + <td>比對 'x' 並記憶此項比對結果。又稱為截取括弧(capturing parentheses)。舉例來說,<code>/(foo)/</code> 在 "foo bar" 裡比對出並記憶 'foo'。比對出來的子字串可以從比對結果的陣列的元素 <code>1</code>, ..., <code>n</code> 取回。</td> + </tr> + <tr> + <td>(?:x)</td> + <td>比對 'x' 但不記憶此項比對結果。又稱為非截取括弧。比對出來的子字串無法從比對結果的陣列的元素 <code>1</code>, ..., <code>n</code> 取回。</td> + </tr> + <tr> + <td>x(?=y)</td> + <td>比對 'x' 但只在 'x' 後面接續著 'y' 的時候。舉例來說,<code>/Jack(?=Sprat)/</code> 只在後面接續著 'Sprat' 的時候比對出 'Jack'。<code>/Jack(?=Sprat|Frost)/</code> 只在後面接續著 'Sprat' 或 'Frost' 的時候比對出 'Jack'。然而,'Sprat' 或 'Frost' 都不是比對結果的一部分。</td> + </tr> + <tr> + <td>x(?!y)</td> + <td>比對 'x' 但只在 'x' 後面沒有接續著 'y' 的時候。舉例來說,<code>/\d+(?!\.)/</code> 只在後面沒有接續著小數點的時候比對出數字。正規表達式 <code>/\d+(?!\.)/.exec("3.141")</code> 比對出 '141' 而非 '3.141'。</td> + </tr> + <tr> + <td>x|y</td> + <td>比對 'x' 或 'y'。舉例來說,<code>/green|red/</code> 在 "green apple" 比對出 'green',並在 "red apple"比對出 'red'。</td> + </tr> + <tr> + <td>{n}</td> + <td>在此 n 是正整數。比對出恰好有 n 個的前面的字元。舉例來說,<code>/a{2}/</code> 不會在 "candy" 裡比對出 'a',但在 "caandy" 裡比對出全部的 a,並在 "caaandy" 裡比對出前兩個 a。</td> + </tr> + <tr> + <td>{n,}</td> + <td>在此 n 是正整數。比對出至少 n 個的前面的字元。舉例來說,<code>/a{2,}/</code> 不會在 "candy" 裡比對出 'a',但在 "caandy" 還有在 "caaaaaaandy" 裡比對出全部的 a。</td> + </tr> + <tr> + <td>{n,m}</td> + <td>在此 n 和 m 是正整數。比對出至少 n 個且至多 m 個的前面的字元。舉例來說,<code>/a{1,3}/</code> 在 "cndy" 裡比對不出來,但在 "candy" 比對出 'a',在 "caandy" 比對出前兩個 a,並在 "caaaaaaandy" 比對出前三個 a,注意,當比對 "caaaaaaandy" 的時候,比對的是 "aaa",即使字串裡有更多的 a。</td> + </tr> + <tr> + <td><code>xyz</code></td> + <td>字元集。比對出包含在括號裡的其中任何一個字元。你可以使用連接符號 (-) 指定字元的範圍。舉例來說,<code>abcd</code> 等於 <code>a-d</code>。這些都能在 "brisket" 裡比對 'b',並在 "city" 裡比對 'c'。</td> + </tr> + <tr> + <td>^xyz</td> + <td>字元否定集、或字元補集。也就是比對出任何不包含在括號裡的一切。你可以使用連接符號 (-) 指定字元的範圍。舉例來說,<code>^abc</code> 等於 <code>^a-c</code>。這些都能在 "brisket" 裡比對出第一個字母 'r',並在 "chop" 比對出 'h'。</td> + </tr> + <tr> + <td>\\b</td> + <td>比對退格。(別和 \b 混淆。)</td> + </tr> + <tr> + <td>\b</td> + <td>比對文字邊界,如空白或換行字元。(別和 <code>\\b</code> 混淆。)舉例來說,<code>/\bn\w/</code> 在 "noonday" 裡比對出 'no',<code>/\wy\b/</code> 在 "possibly yesterday" 比對出 'ly'。</td> + </tr> + <tr> + <td>\B</td> + <td>比對非文字邊界。舉例來說,<code>/\w\Bn/</code> 在 "noonday" 裡比對出 'on',<code>/y\B\w/</code> 在 "possibly yesterday" 裡比對出 'ye'。</td> + </tr> + <tr> + <td>\cX</td> + <td>在此 X 是控制字元。在字串中比對控制字元。舉例來說,<code>/\cM/</code> 在字串裡比對出 control-M。</td> + </tr> + <tr> + <td>\d</td> + <td>比對數字字元。等於 <code>0-9</code>。舉例來說,<code>/\d/</code> 或 <code>/0-9/</code> 都在 "B2 is the suite number" 比對出 '2'。</td> + </tr> + <tr> + <td>\D</td> + <td>比對非數字字元。等於 <code>^0-9</code>。舉例來說,<code>/\D/</code> 或 <code>/^0-9/</code> 都在 "B2 is the suite number" 比對出 'B'。</td> + </tr> + <tr> + <td>\f</td> + <td>比對換頁(form-feed)。</td> + </tr> + <tr> + <td>\n</td> + <td>比對換行。</td> + </tr> + <tr> + <td>\r</td> + <td>比對歸位。</td> + </tr> + <tr> + <td>\s</td> + <td>比對單一空白字元,包括空白、TAB、換頁、換行。等於 + <p><code>\\f\\n\\r\\t\\v\\u00A0\\u2028\\u2029</code>。</p> + 舉例來說,<code>/\s\w*/</code> 在 "foo bar" 裡比對出 ' bar'。</td> + </tr> + <tr> + <td>\S</td> + <td>比對除了空白字元以外的單一字元。等於 + <p><code>^ \\f\\n\\r\\t\\v\\u00A0\\u2028\\u2029</code>。</p> + 舉例來說,<code>/\S\w*/</code> 在 "foo bar" 裡比對出 'foo'。</td> + </tr> + <tr> + <td>\t</td> + <td>比對 TAB。</td> + </tr> + <tr> + <td>\v</td> + <td>比對垂直 TAB。</td> + </tr> + <tr> + <td>\w</td> + <td>比對任何字母和數字的字元,包括底線。等於 A-Za-z0-9_。舉例來說,<code>/\w/</code> 在 "apple" 裡比對出 'a',在 "$5.28" 裡比對出 '5',並在 "3D" 比對出 '3'。</td> + </tr> + <tr> + <td>\W</td> + <td>比對任何非字母和數字的字元。等於 {{ mediawiki.external('^A-Za-z0-9_') }}。舉例來說,<code>/\W/</code> 或 <code>/{{ mediawiki.external('^A-Za-z0-9_') }}/</code> 在 "50%" 裡比對出 '%'。</td> + </tr> + <tr> + <td>\n</td> + <td>在此 n 是正整數。回向參考在正規表達式中的第 n 個括弧中比對的最後的子字串(對左括弧計數)。舉例來說,<code>/apple(,)\sorange\1/</code> 在 "apple, orange, cherry, peach" 裡比對出 'apple, orange,'。</td> + </tr> + <tr> + <td>\0</td> + <td>比對 NUL 字元。後面不可以接續其他數字。</td> + </tr> + <tr> + <td>\xhh</td> + <td>比對內碼為 hh 的字元(兩個十六進位數)</td> + </tr> + <tr> + <td>\uhhhh</td> + <td>比對內碼為 hhhh 的字元(四個十六進位數)</td> + </tr> + </tbody> +</table> +<p><small><strong>表 4.1: 正規表達式裡的特殊字元。</strong></small></p> +<h2 id="括弧的使用" name="括弧的使用">括弧的使用</h2> +<p>使用括弧把正規表達式的模式的某一部分括起來,就會記憶那部分被比對出來的子字串。一經記憶,就可以在其他地方取回並使用。可在 <a class="new internal" href="/../../../../zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%AD%A3%E5%89%87%E8%A1%A8%E9%81%94%E5%BC%8F%E7%9A%84%E9%81%8B%E7%94%A8/%E6%8B%AC%E5%BC%A7%E5%AD%90%E5%AD%97%E4%B8%B2%E7%9A%84%E6%AF%94%E5%B0%8D%E7%B5%90%E6%9E%9C%E7%9A%84%E9%81%8B%E7%94%A8" rel="internal" title="../../../../zh tw/Core JavaScript 1.5 教學/正則表達式的運用/括弧子字串的比對結果的運用">括弧子字串的比對結果的運用</a> 一文中找到說明。</p> +<p>舉例來說,以 <code>/Chapter (\d+)\.\d*/</code> 的模式來解說額外的跳脫和特殊字元,那些用來指示某一部分模式需要記憶的部分。他會比對恰好是 'Chapter ' 的字元,隨後是 1 個以上的數字(\d 的意思是任意數字字元,+ 的意思是 1 次以上),隨後是一個小數點(點本身是特殊字元,前面附上 \ 的點的意思是這個模式必須尋找字面為 '.' 的字元),隨後是任何 0 個以上的數字(\d 的意思是任意數字字元,* 的意思是 0 次以上)。此外,括弧被用來記憶第一次比對出來的數字字元。</p> +<p>在 "Open Chapter 4.3, paragraph 6" 裡可以找出這個模式,且 '4' 會被記憶。在 "Chapter 3 and 4" 裡則找不出這個模式,因為字串裡的 '3' 後面沒有點。</p> +<p>若要比對子字串,且不要記憶比對出來的那一部分,可在括弧裡面的最前面加上 <code>?:</code>。舉例來說,<code>(?:\d+)</code> 比對 1 個以上的數字字元,但不會記憶那些比對出來的字元。</p> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:正規表達式的建立", "Core_JavaScript_1.5_教學:正規表達式的運用") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式的建立/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式的建立/index.html new file mode 100644 index 0000000000..ffeee0f5c7 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式的建立/index.html @@ -0,0 +1,34 @@ +--- +title: 正規表達式的建立 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/正規表達式的建立 +--- +<h3 id="正則表達式的建立" name="正則表達式的建立">正規表達式的建立</h3> +<p>正規表達式有兩種建構方式︰</p> +<ul> + <li>使用正規表達式的字面表達,如下︰</li> +</ul> +<pre> re = /ab+c/; </pre> +<dl> + <dd> + <dl> + <dd> + 正規表達式的字面表達會在對 Script 求值時提供正規表達式的編譯產物。這時正規表達式將成為常數而遺留下來,採用這個方式可以得到較好的效能。</dd> + </dl> + </dd> +</dl> +<ul> + <li>呼叫 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/RegExp" title="zh tw/Core JavaScript 1.5 參考/全域物件/RegExp">RegExp</a> 物件的建構子函數,如下︰</li> +</ul> +<pre> re = new RegExp("ab+c"); </pre> +<dl> + <dd> + <dl> + <dd> + 使用建構子函數可在執行時期提供正規表達式的編譯產物。當你知道正規表達式的模式將會變更時,或者當你無法預知取自其他來源的模式(如使用者的輸入)時,就使用建構子函數。</dd> + </dl> + </dd> +</dl> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:運算子:特殊運算子", "Core_JavaScript_1.5_教學:正規表達式模式的編寫") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式的運用/正規表達式的範例/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式的運用/正規表達式的範例/index.html new file mode 100644 index 0000000000..0bd61d90e5 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/正規表達式的運用/正規表達式的範例/index.html @@ -0,0 +1,114 @@ +--- +title: 正規表達式的範例 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/正規表達式的運用/正規表達式的範例 +--- +<h3 id="範例" name="範例">範例</h3> +<p>以下範例示範正規表達式的一些用法。</p> +<h4 id="改變輸入字串的順序" name="改變輸入字串的順序">改變輸入字串的順序</h4> +<p>以下範例解說了正規表達式的構造,以及 <code>string.split()</code> 和 <code>string.replace()</code> 的用法。他會整理凌亂的格式化輸入字串,字串中內含以空白、TAB、和唯一的分號所分割的姓名(名字在前)。最後,他會調換姓名的順序(姓氏在前)並重新排序列表。</p> +<pre><script type="text/javascript"> + +// 內含很多空白和 TAB 的 names 字串, +// 在名字和姓氏之間也會有很多空白。 +var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand "; + +var output = new Array( + "---------- Original String<br><br>", + names + "<br><br>"); + +// 預備兩個正規表達式的模式和儲存用的陣列。 +// 把字串分割存入陣列元素裡。 + +// 模式︰可能的空白,然後是分號,然後是可能的空白 +var pattern = /\s*;\s*/; + +// 使用上面的模式把字串分割成多個斷片, +// 並且把斷片儲存至稱為 nameList 的陣列。 +var nameList = names.split(pattern); + +// 新的模式︰1 個以上的字元,然後是空白字元,然後是 1 個以上的字元。 +// 使用括弧來記憶模式的某一部分。 +// 已記憶的部分稍後會被參考。 +var pattern = /(\w+)\s+(\w+)/; + +// 用來保存已處理的姓名的新陣列。 +var bySurnameList = new Array(); + +// 顯示 names 陣列,並移動以逗號分隔且姓氏在前的姓名到新的陣列。 +// +// replace 方法除去符合模式的所有內容,並以已記憶的字串取代。 +// 字串是以第二個已記憶的部分、後接逗號和空格、後接第一個已記憶的部分所組成。 +// +// 變數 $1 和 $2 參考了符合模式的已記憶的部分。 + +output.push("---------- After Split by Regular Expression<br>"); + +var i, len; +for (i = 0, len = nameList.length; i < len; i++) +{ + output.push(nameList[i] + "<br>"); + bySurnameList[i] = nameList[i].replace(pattern, "$2, $1") +} + +// 顯示新的陣列。 +output.push("---------- Names Reversed<br>"); +for (i = 0, len = bySurnameList.length; i < len; i++) +{ + output.push(bySurnameList[i] + "<br>") +} + +// 以姓氏來排序,然後顯示已排序的陣列。 +bySurnameList.sort(); +output.push("---------- Sorted<br>"); +for (i = 0, len = bySurnameList.length; i < len; i++) +{ + output.push(bySurnameList[i] + "<br>") +} + +output.push("---------- End<br>"); + +document.write(output.join("\n")); + +</script> +</pre> +<h4 id="使用特殊字元來對輸入進行驗證" name="使用特殊字元來對輸入進行驗證">使用特殊字元來對輸入進行驗證</h4> +<p>在以下的範例中,有位使用者輸入電話號碼。當使用者按下 Enter 時,Script 就會檢查電話號碼的有效性。如果電話號碼有效(符合由正規表達式所指定的字元序列),Script 在視窗上表示感謝使用者,並確認了電話號碼。如果電話號碼無效,Script 在視窗上表示使用者的電話號碼有誤的資訊。</p> +<p>正規表達式尋找 0 或 1 個左括弧 <code>\(?</code>,後接三個數字 <code>\d{3}</code>,後接 0 或 1 個右括弧 <code>\)?</code>,如果有的話,就後接橫線 (-) 或斜線 (\) 或小數點 (.),並記憶字元 <code>(-\\/\\.)</code>,後接三個數字 <code>\d{3}</code>,後接已記憶的橫線、斜線、小數點的比對結果 <code>\1</code>,後接四個數字 <code>\d{4}</code>。</p> +<p>當使用者按下 Enter 設定 <code>RegExp.input</code> 的值時,就會發動 <code>Change</code> 事件。</p> +<pre><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> + <meta http-equiv="Content-Script-Type" content="text/javascript"> + <script type="text/javascript"> + var re = /\(?\d{3}\)?([-\/\.])\d{3}\1\d{4}/; + + function testInfo(phoneInput) + { + var OK = re.exec(phoneInput.value); + + if (!OK) + { + window.alert(RegExp.input + " isn't a phone number with area code!"); + } + else + { + window.alert("Thanks, your phone number is " + OK[0]); + } + } + </script> + </head> + + <body> + <p>Enter your phone number (with area code) and then press Enter.</p> + <form action=""> + <input name="phone" onchange="testInfo(this);"> + </form> + </body> +</html> +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:正規表達式的運用:使用標誌的進階搜尋", "Core_JavaScript_1.5_教學:區塊語法") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/物件的操作語法/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/物件的操作語法/index.html new file mode 100644 index 0000000000..f1e46206fe --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/物件的操作語法/index.html @@ -0,0 +1,53 @@ +--- +title: 物件的操作語法 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/物件的操作語法 +--- +<h3 id="物件的操作語法" name="物件的操作語法">物件的操作語法</h3> +<p>JavaScript 使用 <code>for...in</code>、<code>for each...in</code>、<code>with</code> 語法來操作物件。</p> +<h4 id="for...in_語法" name="for...in_語法">for...in 語法</h4> +<p><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for...in" title="zh tw/Core JavaScript 1.5 參考/語法/for...in"><code>for...in</code></a> 語法可處理對應物件的所有屬性的指定變數。JavaScript 會對每一個對應的屬性來執行指定的語句。<code>for...in</code> 語句如下︰</p> +<pre>for (variable in object) { + statements +} +</pre> +<p><strong>範例</strong><br> + 以下函數接受物件和物件的名稱作為自己的參數。然後函數反覆遍歷物件的屬性,並返回列出屬性名稱和值的字串。</p> +<pre>function dump_props(obj, obj_name) { + var result = ""; + for (var i in obj) { + result += obj_name + "." + i + " = " + obj[i] + "<br>"; + } + result += "<hr>"; + return result; +} +</pre> +<p>以帶有屬性 <code>make</code> 和 <code>model</code> 的物件 <code>car</code> 為例,輸出結果如下︰</p> +<pre class="eval">car.make = Ford +car.model = Mustang +</pre> +<p><strong>陣列</strong><br> + 雖然使用這個方法來處理所有的 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/Array" title="zh tw/Core JavaScript 1.5 參考/全域物件/Array">Array</a> 元素很是誘人,但如果你修改了 Array 物件,例如加入自訂的屬性或方法,<strong>for...in</strong> 語法就只會處理除了陣列元素以外的所有使用者定義的屬性,<strong>for...in</strong> 語法將會返回你的使用者定義的屬性的名稱,除了數字索引以外。因此在處理陣列時,最好還是使用傳統的 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for" title="zh tw/Core JavaScript 1.5 參考/語法/for">for</a> 循環,並配合數字索引。</p> +<h4 id="for_each...in_語法" name="for_each...in_語法">for each...in 語法</h4> +<p><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for_each...in" title="zh tw/Core JavaScript 1.5 參考/語法/for each...in"><code>for each...in</code></a> 是在 <a class="internal" href="/zh_tw/JavaScript_1.6_%E6%96%B0%E9%AE%AE%E4%BA%8B" title="zh tw/JavaScript 1.6 新鮮事">JavaScript 1.6</a> 中引入的循環語法,他很類似 <code>for...in</code>,但不是針對物件的屬性的名稱,而是物件的屬性的值。</p> +<h4 id="with_語法" name="with_語法">with 語法</h4> +<p><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/with" title="zh tw/Core JavaScript 1.5 參考/語法/with"><code>with</code></a> 語法為一整組的語句確立了預設的物件。JavaScript 會在一整組語法之內找出所有不合格的名稱,只要這個名稱是預設物件的屬性,就會將其確定。如果有一個不合格的名稱符合其中一個屬性,然後就會在語句中使用這個屬性。否則,就會被當成局域或全域的變數。</p> +<p><code>with</code> 語法如下︰</p> +<pre>with (object) { + statements +} +</pre> +<p><strong>範例</strong><br> + 以下 <code>with</code> 語法指定 <code>Math</code> 物件為預設的物件。<code>with</code> 語法裡面使用了 <code>PI</code> 屬性和 <code>cos</code>、<code>sin</code> 方法的語句,而無需指定物件。JavaScript 會假定他們參照的是 <code>Math</code> 物件。</p> +<pre>var a, x, y; +var r = 10; +with (Math) { + a = PI * r * r; + x = r * cos(PI); + y = r * sin(PI/2); +} +</pre> +<p>附註︰雖然使用 <code>with</code> 語句可以使你的程式更加簡潔,但不當使用 <code>with</code> 也會在一定程度上使你的程式速度變慢。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/with" title="zh tw/Core JavaScript 1.5 參考/語法/with">Core JavaScript 1.5 參考:語法:with</a>。</p> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:循環語法:continue_語法", "Core_JavaScript_1.5_教學:註解") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/繼承/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/繼承/index.html new file mode 100644 index 0000000000..4b1e65afce --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/繼承/index.html @@ -0,0 +1,146 @@ +--- +title: 繼承 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/繼承 +--- +<p> </p> + +<h3 id="繼承" name="繼承">繼承</h3> + +<p>這裡有很多有關如何在 JavaScript 中定義類型(類別)的困惑之處,包括繼承。這裡有很多方式和一些 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E7%B9%BC%E6%89%BF#%E9%98%BB%E7%A4%99" title="zh tw/Core JavaScript 1.5 教學/繼承#阻礙">次優的選擇</a>。這裡所展示的運作的最好,而且簡單。</p> + +<h2 id="範例" name="範例">範例</h2> + +<p>B 繼承 A︰</p> + +<pre class="brush: js">function A(a) +{ + this.varA = a; +} + +A.prototype = +{ + varA : null, + doSomething : function() + { + ... + } +} + +function B(a, b) +{ + A.call(this, a); + this.varB = b; +} + +B.prototype = +{ + varB : null, + doSomething : function() // 覆寫 + { + A.prototype.doSomething.apply(this, arguments); // 呼叫親類型 + ... + } +} + +extend(B, A); + +var b = new B(); +b.doSomething(); +</pre> + +<p>重點部分是︰</p> + +<ul> + <li>類型是在 .prototype 裡定義的</li> + <li>使用 extend() 來繼承</li> +</ul> + +<p>此處的 extend() 並不是內建的函數,其定義如下︰</p> + +<pre class="eval">function extend(child, supertype) +{ + child.prototype.__proto__ = supertype.prototype; +} +</pre> + +<h2 id="prototype_和___proto__" name="prototype_和___proto__">prototype 和 __proto__</h2> + +<p>JavaScript 對於來自 Java 或 C++ 的開發者而言會感到一些困惑,因為他完全動態,完全執行時期,而且完全沒有類別。他完全只有實體(物件)。甚至〝類別〞也只是函數物件模擬出來的。</p> + +<p>你或許已經注意到前面我們的 <code>function A</code> 很特別,這並不是普通的函數,但可以和關鍵字 <code>new</code> 結合使用來實體化新的物件。他也可以有稱作 <code>prototype</code> 的特別的屬性(由 JS 標準所定義)。這個函數所做的不過是,當你呼叫 <code>new</code> 的時候,參考的 prototype 物件被複製到新的實體的屬性 <code>__proto__</code>。也就是當你這樣做 <code>var a1 = new A()</code> 的時候,JS(在記憶體中建立物件之後,並在使用 <code>this</code> 執行函數 A() 來定義他之前)只是簡單的這樣做 <code>a1.__proto__ = A.prototype</code>。然後當你存取實體的屬性的時候,JS 首先會檢查那些是否直接存在於物件上,如果不是的話,就從 <code>__proto__</code> 搜尋。這意思是所有你定義在 <code>prototype</code> 裡的東西,實際上會被所有的實體所共用,而且你甚至可以在稍後修改 <code>prototype</code> 的部分,並且在所有既存的實體上表現出這個改變,只要你想要的話。</p> + +<p><strong>舉例來說</strong>,當你在上面的範例中這樣做 <code>var a1 = new A(); var a2 = new A();</code>,然後 <code>a1.doSomething</code> 實際上會參考 <code>a1.__proto__.doSomething</code>,這些和你定義的 <code>A.prototype.doSomething</code> 相同,也就是 <code>a1.__proto__.doSomething == a2.__proto__.doSomething == A.prototype.doSomething</code>。</p> + +<p><strong>簡而言之</strong>,<code>prototype</code> 是對類型而言,而 <code>__proto__</code> 對實體而言都相同。</p> + +<p><code>__proto__</code> 是以<em>遞歸</em>的方式來看待的,也就是 <code>a1.doSomething</code>、<code>a1.__proto__.doSomething</code>、<code>a1.__proto__.__proto__.doSomething</code> 等等,直到找到或不存在 <code>__proto__ <span style="font-family: Verdana,Tahoma,sans-serif;">為止。</span></code></p> + +<p>所以,發生了什麼︰當你呼叫<br> + <code> var o = new Foo()</code><br> + JS 實際上只是這樣做<br> + <code> var o = new Object();<br> + o.__proto__ = Foo.prototype;<br> + o.Foo();</code> (諸如此類)<br> + <br> + 以及當你隨後這樣做<br> + <code> o.someProp</code><br> + 他會檢查 <code>o</code> 是否有屬性 <code>someProp</code>,如果沒有就檢查 <code>o.__proto__.someProp</code>,如果沒有就檢查 <code>o.__proto__.__proto__.someProp</code> 依此類推。這個最後的步驟就是 extend() 函數運作的原因。</p> + +<p> </p> + +<p>注意,<code>__proto__</code> 只能在 Mozilla 的 JS 引撉中存取。其他引撉的也有相同的運作,但不能存取 <code>__proto__</code>。參閱以下內容來補救。</p> + +<h2 id="extend()_的另一個選擇" name="extend()_的另一個選擇">extend() 的另一個選擇</h2> + +<p>還有另一個選擇,你也可以定義 extend() 如下︰</p> + +<pre class="eval">function extend(child, supertype) +{ + child.prototype.__proto__ = supertype.prototype; + child.prototype.__super = supertype; +} +</pre> + +<p>因此,當你想要在 <code>B</code> 中呼叫親函數的時候,你可以使用 <code>this.__super</code> 取代 <code>A</code>,例如 <code>this.__super.call(this, a)</code> 用於建構子,以及 <code>this.__super.prototype.doSomething.apply(this, arguments)</code> 用於覆載函數。</p> + +<p>注意,<code>__proto__</code> 在 Mozilla 以外的 JavaScript 版本中可能無法使用。還有另一個選擇,但不是 extend() 的最佳版本,這次應該到處都可以用︰</p> + +<pre class="eval">function extend(child, super) +{ + for (var property in super.prototype) { + if (typeof child.prototype[property] == "undefined") + child.prototype[property] = super.prototype[property]; + } + return child; +} +</pre> + +<p>這次簡單的<em>直接</em>把親類型的 prototype 裡所有的屬性和函數,放入到子類型的 prototype 裡。這對多重繼承而言非常有用,但要小心使用,沒有親類別會把屬性或函數定義成同樣的,或者你需要明確的把那些覆載並定義那些該怎麼做。</p> + +<h2 id="阻礙" name="阻礙">阻礙</h2> + +<p>這裡有另一個方法用來定義類型,例如︰</p> + +<pre class="eval">function A() +{ + this.varA = "bla"; + this.isNotSoGood = function() + { + ... + }; +} +</pre> + +<p>這樣也可以運作,但只是次優的選擇,因為每次你建立這個類型的物件的時候,<code>isNotSoGood</code> 會在<strong>每一個實體</strong>中定義一次。如果是在 .prototype 定義這些的話,就只會定義一次。</p> + +<p><br> + 你可以使用下面的方式來繼承︰</p> + +<pre class="eval">B.prototype = new A(); +</pre> + +<p>不在載入 JS 檔案的時候建立 A() 的實體。這是<strong>非常</strong>壞的點子,因為你可能需要在 A 的建構子裡做一些處理,這可能會耗費時間並因此大幅延遲載入,或嘗試存取尚未載入的東西(例如,在 utils.js 裡的函數)。</p> + +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的物件:String_物件", "Core_JavaScript_1.5_教學:以類別為基礎的語言_vs._以原型為基礎的語言") }}</p> + +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/Inheritance" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/index.html new file mode 100644 index 0000000000..a9a7200773 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/index.html @@ -0,0 +1,31 @@ +--- +title: 職員的例子 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/職員的例子 +--- +<h3 id="職員的例子" name="職員的例子">職員的例子</h3> +<p>本章的剩餘部分會使用如下所示的職員的階層圖。</p> +<p><img alt="Image:hier01.gif" class="internal" src="/@api/deki/files/708/=Hier01.gif"></p> +<p><small><strong>圖 8.1: 簡單的物件的階層</strong></small></p> +<p>本範例使用了下面的物件︰</p> +<ul> + <li>Employee 具有 name(其值預設為空字串)以及 dept(其值預設為 "general")屬性。</li> + <li>Manager 以 Employee 為基礎。他加入了 reports 屬性(其值預設為空的陣列,打算使用內含 Employee 物件的陣列作為他的值)。</li> + <li>WorkerBee 也是 Employee 為基礎。他加入了 projects 屬性(其值預設為空的陣列,打算使用字串的陣列作為他的值)。</li> + <li>SalesPerson 以 WorkerBee 為基礎。他加入了 quota 屬性(其值預設為 100)。他也使用 "sales" 值覆寫了 dept 屬性,指明所有的銷售員都從屬於同一部門。</li> + <li>Engineer 以 WorkerBee 為基礎。他加入了 machine 屬性(其值預設為空字串),而且也使用 "engineering" 值覆寫了 dept 屬性。</li> +</ul> +<p>其餘的範例︰</p> +<ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E9%9A%8E%E5%B1%A4%E7%9A%84%E5%BB%BA%E7%AB%8B" title="zh tw/Core JavaScript 1.5 教學/職員的例子/階層的建立">階層的建立</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E7%89%A9%E4%BB%B6%E7%9A%84%E5%B1%AC%E6%80%A7" title="zh tw/Core JavaScript 1.5 教學/職員的例子/物件的屬性">物件的屬性</a> + <ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E7%89%A9%E4%BB%B6%E7%9A%84%E5%B1%AC%E6%80%A7/%E5%B1%AC%E6%80%A7%E7%9A%84%E7%B9%BC%E6%89%BF" title="zh tw/Core JavaScript 1.5 教學/職員的例子/物件的屬性/屬性的繼承">屬性的繼承</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E7%89%A9%E4%BB%B6%E7%9A%84%E5%B1%AC%E6%80%A7/%E5%B1%AC%E6%80%A7%E7%9A%84%E5%8A%A0%E5%85%A5" title="zh tw/Core JavaScript 1.5 教學/職員的例子/物件的屬性/屬性的加入">屬性的加入</a></li> + </ul> + </li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E6%9B%B4%E9%9D%88%E6%B4%BB%E7%9A%84%E5%BB%BA%E6%A7%8B%E5%AD%90" title="zh tw/Core JavaScript 1.5 教學/職員的例子/更靈活的建構子">更靈活的建構子</a></li> +</ul> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:以類別為基礎的語言_vs._以原型為基礎的語言", "Core_JavaScript_1.5_教學:職員的例子:階層的建立") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/index.html new file mode 100644 index 0000000000..01d23df274 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/index.html @@ -0,0 +1,14 @@ +--- +title: 物件的屬性 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/職員的例子/物件的屬性 +--- +<h3 id="物件的屬性" name="物件的屬性">物件的屬性</h3> +<p>本節討論物件如何從原型鏈上的其他物件來繼承屬性,以及當你在執行時期加入屬性的時候,發生了什麼事。</p> +<ul> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E7%89%A9%E4%BB%B6%E7%9A%84%E5%B1%AC%E6%80%A7/%E5%B1%AC%E6%80%A7%E7%9A%84%E7%B9%BC%E6%89%BF" title="zh tw/Core JavaScript 1.5 教學/職員的例子/物件的屬性/屬性的繼承">屬性的繼承</a></li> + <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E7%89%A9%E4%BB%B6%E7%9A%84%E5%B1%AC%E6%80%A7/%E5%B1%AC%E6%80%A7%E7%9A%84%E5%8A%A0%E5%85%A5" title="zh tw/Core JavaScript 1.5 教學/職員的例子/物件的屬性/屬性的加入">屬性的加入</a></li> +</ul> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:職員的例子:階層的建立", "Core_JavaScript_1.5_教學:職員的例子:物件的屬性:屬性的繼承") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/屬性的加入/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/屬性的加入/index.html new file mode 100644 index 0000000000..4d5a456ad4 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/屬性的加入/index.html @@ -0,0 +1,19 @@ +--- +title: 屬性的加入 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/職員的例子/物件的屬性/屬性的加入 +--- +<h3 id="屬性的加入" name="屬性的加入">屬性的加入</h3> +<p>在 JavaScript 中,你可以在執行時期把屬性加入到任何的物件。你不會受到只能使用由建構子函數提供屬性的限制。若要為特定的單一物件加入屬性,你可以把值代入給物件,如下︰</p> +<pre>mark.bonus = 3000; +</pre> +<p>現在,<code>mark</code> 物件有了額外的屬性,而其他的 <code>WorkerBee</code> 不會有這個屬性。</p> +<p>如果你把新的屬性加入到已經被用作建構子函數的原型物件裡的話,就會把新的屬性加入到從原型繼承屬性的所有物件裡。例如,你可以使用如下語句把 <code>specialty</code> 屬性加入到所有的職員︰</p> +<pre>Employee.prototype.specialty = "none"; +</pre> +<p>JavaScript 一執行這個語句,<code>mark</code> 物件也就會有這個值為 "<code>none</code>" 的 specialty 屬性。下面的圖解顯示出加入這個屬性給 Employee 原型的效果,以及從 <code>Engineer</code> 原型覆蓋這個屬性。</p> +<p><img alt="Image:hier04.gif" class="internal" src="/@api/deki/files/711/=Hier04.gif"><br> + <small><strong>圖 8.4: 加入屬性</strong></small></p> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:職員的例子:物件的屬性:屬性的繼承", "Core_JavaScript_1.5_教學:職員的例子:更靈活的建構子") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/屬性的繼承/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/屬性的繼承/index.html new file mode 100644 index 0000000000..fa38245533 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/物件的屬性/屬性的繼承/index.html @@ -0,0 +1,24 @@ +--- +title: 屬性的繼承 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/職員的例子/物件的屬性/屬性的繼承 +--- +<h3 id="屬性的繼承" name="屬性的繼承">屬性的繼承</h3> +<p>假定你以如下語句建立了作為 <code>WorkerBee</code> 的 <code>mark</code> 物件(如同 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E9%9A%8E%E5%B1%A4%E7%9A%84%E5%BB%BA%E7%AB%8B" title="zh tw/Core JavaScript 1.5 教學/職員的例子/階層的建立">圖 8.3</a> 所示)︰</p> +<pre class="eval">mark = new WorkerBee; +</pre> +<p>當 JavaScript 看見 new 運算子的時候,他就會建立新的通用物件,並且把這個新物件當作 <code>this</code> 關鍵字的值傳給 WorkerBee 的建構子函數。建構子函數會明確的設定 <code>projects</code> 屬性的值,並且隱含的把 <code>__proto__</code> 屬性內部的值設定成 <code>WorkerBee.prototype</code> 的值。(這個屬性的名稱前後各有兩個底線字元。)<code>__proto__</code> 屬性決定了用來返回屬性值的原型鏈。這些屬性一經設定,JavaScript 返回新的物件,且代入語句會把變數 <code>mark</code> 設定給這個物件。</p> +<p>這個過程並不會把 <code>mark</code> 從原型鏈上繼承下來的屬性明確的放置在 <code>mark</code> 物件裡的值(<em>局域</em>值)。當你需要某個屬性值的時候,JavaScript 首先檢查這個值是否存在於物件裡。如果存在,就直接返回這個值。如果這些變數不在局域區塊裡,JavaScript 就會檢查原型鏈(使用 <code>__proto__</code> 屬性)。如果在原型鏈上的物件有這個屬性的值,就會返回這個值。如果找不到這些屬性,JavaScript 會說這個物件並沒有這個屬性。以這種方式,<code>mark</code> 物件就有了如下屬性和值︰</p> +<pre class="eval">mark.name = ""; +mark.dept = "general"; +mark.projects = []; +</pre> +<p><code>mark</code> 物件從 <code>mark.__proto__</code> 裡的原型物件繼承了 name 和 dept 屬性的值。他還藉由 WorkerBee 的建構子給 projects 屬性代入局域值。JavaScript 就這樣達成了屬性和值的繼承。這個過程的部分細節會在 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E5%86%8D%E8%AB%87%E5%B1%AC%E6%80%A7%E7%9A%84%E7%B9%BC%E6%89%BF" title="zh tw/Core JavaScript 1.5 教學/再談屬性的繼承">再談屬性的繼承</a> 裡討論。</p> +<p>因為這些建構子並不能讓你傳入特定實體的值,這些資訊是通用的。這些屬性值預設會被所有從 WorkerBee 建立的新物件所共享。當然你也可以修改任何屬性的值。因此,你可以給 <code>mark</code> 特定的資訊如下︰</p> +<pre class="eval">mark.name = "Doe, Mark"; +mark.dept = "admin"; +mark.projects = ["navigator"]; +</pre> +<div class="noinclude"> + <p>{{ PreviousNext("Core JavaScript 1.5 教學:職員的例子:物件的屬性", "Core JavaScript 1.5 教學:職員的例子:物件的屬性:屬性的加入") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/階層的建立/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/階層的建立/index.html new file mode 100644 index 0000000000..3e7a144656 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/職員的例子/階層的建立/index.html @@ -0,0 +1,135 @@ +--- +title: 階層的建立 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/職員的例子/階層的建立 +--- +<h3 id="階層的建立" name="階層的建立">階層的建立</h3> +<p>這裡有一些方式可以定義適當的建構子函數,以實現 Employee 的階層結構。該如何選擇定義這些的方式,主要取決於你希望你的應用程式能做什麼。</p> +<p>本節展示如何使用非常簡單的(相對來說也比較沒有彈性)定義,以示範繼承是如何運作的。在這些定義中,當你建立物件的時候,你不能指定任何的屬性值。這些新建立的物件會簡單的取得預設值,稍後你就可以修改這些值。圖 8.2 以這些簡單的定義解說了階層結構。</p> +<p>在實際的應用程式中,你可能會定義允許你在建立物件的時候提供屬性值的建構子(參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E8%81%B7%E5%93%A1%E7%9A%84%E4%BE%8B%E5%AD%90/%E6%9B%B4%E9%9D%88%E6%B4%BB%E7%9A%84%E5%BB%BA%E6%A7%8B%E5%AD%90" title="zh tw/Core JavaScript 1.5 教學/職員的例子/更靈活的建構子">更靈活的建構子</a> 以取得資訊)。現在,這些簡單的定義示範繼承是如何發生的。</p> +<p><img alt="Image:hier02.gif" class="internal" src="/@api/deki/files/709/=Hier02.gif"><br> + <small><strong>圖 8.2: Employee 物件的定義</strong></small></p> +<p>下面 Java 和 JavaScript 的 <code>Employee</code> 定義很類似。唯一的不同點是,在 Java 中,你需要為每一個屬性指定類型,但 JavaScript 不需要。而且你需要為 Java 類別建立明確的建構子方法。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>JavaScript</th> + <th>Java</th> + </tr> + <tr> + <td> + <pre> +function Employee () { +this.name = ""; +this.dept = "general"; +} +</pre> + </td> + <td> + <pre> +public class Employee { + public String name; + public String dept; + public Employee () { + this.name = ""; + this.dept = "general"; + } +} +</pre> + </td> + </tr> + </tbody> +</table> +<p><code>Manager</code> 和 <code>WorkerBee</code> 的定義顯現出在如何指定高於繼承鏈的下一個物件時的不同點。在 JavaScript 中,你把原型實體作為建構子函數的 <code>prototype</code> 屬性的值加了上去。在你定義了建構子以後的任何時間點上,你都可以這麼做。在 Java 中,你只能在類別定義的內部指定親類別。你不能在類別定義的外部改變親類別。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>JavaScript</th> + <th>Java</th> + </tr> + <tr> + <td> + <pre> +function Manager () { +this.reports = []; +} +Manager.prototype = new Employee; + +function WorkerBee () { +this.projects = []; +} +WorkerBee.prototype = new Employee; +</pre> + </td> + <td> + <pre> +public class Manager extends Employee { + public Employee[] reports; + public Manager () { + this.reports = new Employee[0]; + } +} + +public class WorkerBee extends Employee { + public String[] projects; + public WorkerBee () { + this.projects = new String[0]; + } +} +</pre> + </td> + </tr> + </tbody> +</table> +<p><code>Engineer</code> 和 <code>SalesPerson</code> 的定義所建立的物件是傳承自 <code>WorkerBee</code> 以及 <code>Employee</code>。這些類型的物件具有在鏈上比他高層的所有物件的屬性。此外,定義中還使用指定給這些物件的新值來覆蓋被繼承的 <code>dept</code> 屬性的值。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>JavaScript</th> + <th>Java</th> + </tr> + <tr> + <td> + <pre> +function SalesPerson () { + this.dept = "sales"; + this.quota = 100; +} +SalesPerson.prototype = new WorkerBee; + +function Engineer () { + this.dept = "engineering"; + this.machine = ""; +} +Engineer.prototype = new WorkerBee; +</pre> + </td> + <td> + <pre> +public class SalesPerson extends WorkerBee { + public double quota; + public SalesPerson () { + this.dept = "sales"; + this.quota = 100.0; + } +} + +public class Engineer extends WorkerBee { + public String machine; + public Engineer () { + this.dept = "engineering"; + this.machine = ""; + } +} +</pre> + </td> + </tr> + </tbody> +</table> +<p>使用這些定義,你可以建立這些物件的實體,同時實體也為他們的屬性取得預設值。圖 8.3 解說使用這些 JavaScript 定義來建立新的物件,並顯示新物件的屬性值。</p> +<p><strong>附註:</strong> 術語<em>實體(instance)</em>在以類別為基礎的語言中有特定的技術含義。在這些語言中,實體就是類別的獨立成員,而且在根本上就有別於類別。在 JavaScript 中,〝實體〞並沒有這些技術含義,因為 JavaScript 並沒有類別和實體的分別。然而,在談到 JavaScript 的時候,〝實體〞也可以在通俗上用來指,使用實際的建構子函數建立的物件。因此,在這些範例中,你也可以通俗的說 <code>jane</code> 是 <code>Engineer</code> 的實體。類似的,儘管術語 <em>親(parent)、子(child)、祖先(ancestor)</em>、<em>子孫(descendant)</em>在 JavaScript 中並沒有正式的含義;你也可以隨俗的使用這些術語,來談論在原型鏈中較高或較低的某個物件。</p> +<p><img alt="Image:hier03.gif" class="internal" src="/@api/deki/files/710/=Hier03.gif"><br> + <span style="font-weight: bold;">圖</span><small><strong> 8.3: 使用簡單的定義來建立物件</strong></small></p> +<div class="noinclude"> + <p>{{ PreviousNext("Core_JavaScript_1.5_教學:職員的例子", "Core_JavaScript_1.5_教學:職員的例子:物件的屬性") }}</p> +</div> +<p> </p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/迭代器和產生器/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/迭代器和產生器/index.html new file mode 100644 index 0000000000..21029266db --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/迭代器和產生器/index.html @@ -0,0 +1,293 @@ +--- +title: 迭代器和產生器 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/迭代器和產生器 +--- +<h3 id="迭代器和產生器" name="迭代器和產生器">迭代器和產生器</h3> + +<p>處理集合中的每一項是很常見的操作。JavaScript 提供了許多迭代整個集合的方式,從簡單的 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for" title="zh tw/Core JavaScript 1.5 參考/語法/for">for</a></code> 和 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for_each...in" title="zh tw/Core JavaScript 1.5 參考/語法/for each...in">for each</a></code> 循環到 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/Array/map" title="zh tw/Core JavaScript 1.5 參考/全域物件/Array/map">map</a>()</code>、<code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E5%85%A8%E5%9F%9F%E7%89%A9%E4%BB%B6/Array/filter" title="zh tw/Core JavaScript 1.5 參考/全域物件/Array/filter">filter</a>()</code> 以及 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E9%99%A3%E5%88%97%E7%9A%84%E9%81%8B%E7%94%A8#%E9%99%A3%E5%88%97%E7%9A%84%E7%B0%A1%E7%B4%84%E5%BC%8F" title="zh tw/Core JavaScript 1.5 教學/陣列的運用#陣列的簡約式">陣列的簡約式</a>。迭代器和產生器是在 JavaScript 1.7 引入的,帶來在核心語言中直接迭代的觀念,並提供自訂 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for...in" title="zh tw/Core JavaScript 1.5 參考/語法/for...in">for...in</a></code> 和 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for_each...in" title="zh tw/Core JavaScript 1.5 參考/語法/for each...in">for each</a></code> 循環的行為的機制。</p> + +<div class="note"><strong>附注:</strong> <code>yield</code> 關鍵字只能在 HTML 裡包有 <code><script type="application/javascript;version=1.7"></code> 區塊(或更高的版本)的代碼區塊中使用。 <a class="internal" href="/zh_tw/XUL" title="zh tw/XUL">XUL</a> Script 標記可以存取這些功能,無須這個特別的區塊。</div> + +<h4 id="迭代器" name="迭代器">迭代器</h4> + +<p>迭代器(Iterator)是一種知道如何從集合裡每次以同樣的方式存取項目的物件。並保持對自己序列內部的目前位置的追蹤。在 JavaScript 中,迭代器是一種提供有能夠返回序列中的下一項的 <code>next()</code> 方法的物件。這個方法可以在序列用盡時,選擇性的出現 <code>StopIteration</code> 例外。</p> + +<p>迭代器物件一經建立以後,可以明確的反覆呼叫 <code>next()</code> 來使用,或隱含的使用 JavaScript 的 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for...in" title="zh tw/Core JavaScript 1.5 參考/語法/for...in">for...in</a></code> 和 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for_each...in" title="zh tw/Core JavaScript 1.5 參考/語法/for each...in">for each</a></code> 結構。</p> + +<p>可以使用 <code>Iterator()</code> 函數來為物件和陣列建立簡單的迭代器︰</p> + +<pre class="eval">var lang = { name: 'JavaScript', birthYear: 1995 }; +var it = Iterator(lang); +</pre> + +<p>一經初始化以後,就可以呼叫 <code>next()</code> 方法依序從物件中存取鍵值對(key-value pair)︰</p> + +<pre class="eval">var pair = it.next(); // 鍵值對是 ["name", "JavaScript"] +pair = it.next(); // 鍵值對是 ["birthYear", 1995] +pair = it.next(); // 拋出 StopIteration 例外 +</pre> + +<p>可以使用 <code><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83/%E8%AA%9E%E6%B3%95/for...in" title="zh tw/Core JavaScript 1.5 參考/語法/for...in">for...in</a></code> 循環來取代直接呼叫 <code>next()</code> 方法。循環會在 <code>StopIteration</code> 例外出現的時候自動終止。</p> + +<pre class="eval">var it = Iterator(lang); +for (var pair in it) + print(pair); // 依序輸出每一個 [key, value] 對 +</pre> + +<p>如果我們只想要迭代物件的鍵(key),我們可以把第二個參數 <code>true</code> 傳給 <code>Iterator()</code> 函數︰</p> + +<pre class="eval">var it = Iterator(lang, true); +for (var key in it) + print(key); // 依序輸出每一個鍵 +</pre> + +<p>使用 <code>Iterator()</code> 存取物件內容的其中一個好處是已經加入到 <code>Object.prototype</code> 的自訂屬性不會被包含在序列裡。</p> + +<p><code>Iterator()</code> 也可以和陣列一起使用︰</p> + +<pre class="eval">var langs = ['JavaScript', 'Python', 'C++']; +var it = Iterator(langs); +for (var pair in it) + print(pair); // 依序輸出每一個 [index, language] 對 +</pre> + +<p>如同物件一般,傳入 <code>true</code> 作為第二個參數,將導致迭代出存在於陣列裡的索引︰</p> + +<pre class="eval">var langs = ['JavaScript', 'Python', 'C++']; +var it = Iterator(langs, true); +for (var i in it) + print(i); // 輸出 0,然後是 1,然後是 2 +</pre> + +<p>他也可以把 for 循環內部使用的 <code>let</code> 關鍵字的索引和值兩者,代入給區塊作用域的變數,並分割代入︰</p> + +<pre class="eval">var langs = ['JavaScript', 'Python', 'C++']; +var it = Iterator(langs); +for (let [i, lang] in it) + print(i + ': ' + lang); // 輸出 "0: JavaScript" 等等。 +</pre> + +<h4 id="自訂的迭代器的定義" name="自訂的迭代器的定義">自訂的迭代器的定義</h4> + +<p>有一些物件所表示的集合項,應該以特定的方式來迭代。</p> + +<ul> + <li>迭代物件的某一範圍,應該一個接著一個返回範圍內的數字。</li> + <li>可以使用深度優先或廣度優先的遍歷法來遊覽樹裡的葉項。</li> + <li>表示來自資料庫的查詢結果的物件的迭代,應該一行接著一行返回,即使整份結果尚未完全載入到單一的陣列。</li> + <li>無限長的數學序列(如費伯納契數列)的迭代,應該要能夠一個接著一個返回,而無須建立無限長的資料結構。</li> +</ul> + +<p>JavaScript 可讓你編寫表示自訂迭代器邏輯的代碼,並把他連結到物件上。</p> + +<p>我們將會建立簡單的 <code>Range</code> 物件,這個物件存放了 low 和 high 值。</p> + +<pre class="eval">function Range(low, high) +{ + this.low = low; + this.high = high; +} +</pre> + +<p>現在我們將會建立自訂的迭代器,使其返回包含在某一範圍內的整數序列。迭代器的界面必須要有由我們提供的 <code>next()</code> 方法,這個方法會返回來自序列的某一項,或拋出 <code>StopIteration</code> 例外。</p> + +<pre class="eval">function RangeIterator(range) +{ + this.range = range; + this.current = this.range.low; +} +RangeIterator.prototype.next = function() +{ + if (this.current > this.range.high) + throw StopIteration; + var current = this.current; + this.current += 1; + return current; +}; +</pre> + +<p>我們的 <code>RangeIterator</code> 就是有範圍限制的實體的實際例子,並維護他自己的 <code>current</code> 屬性用以追蹤他沿著序列已走了多遠。</p> + +<p>最後,把我們的 <code>RangeIterator</code> 和 <code>Range</code> 物件連繫在一起,我們需要加入特別的 <code>__iterator__</code> 方法給 <code>Range</code>。這個方法會在當我們試圖迭代 <code>Range</code> 實體的時候呼叫,而且應該會返回 <code>RangeIterator</code> 的實體,這個實體實裝了迭代器的邏輯。</p> + +<pre class="eval">Range.prototype.__iterator__ = function() +{ + return new RangeIterator(this); +}; +</pre> + +<p>掛在我們自訂的迭代器以後,我們可以迭代實體的某一範圍內,如下︰</p> + +<pre class="eval">var range = new Range(3, 5); +for (var i in range) + print(i); // 輸出序列中的 3,然後是 4,然後是 5 +</pre> + +<h4 id="產生器︰建構迭代器的較佳方式" name="產生器︰建構迭代器的較佳方式">產生器︰建構迭代器的較佳方式</h4> + +<p>儘管自訂的迭代器是很好用的工具,但在建立時的程式設計必須要很謹慎,因為需要明確的維護他們的內部狀態。產生器(Generator)提供另一種更強大的選擇︰可讓你編寫能夠維護自身狀態的單一函數來定義迭代器的演算法。</p> + +<p>產生器是一種特殊類型的函數,他的運作方式類似迭代器的生產廠房。只要函數內含有一個以上的 <code>yield</code> 語句,就會變成產生器。</p> + +<p>當產生器函數被呼叫的時候,並不會立即執行函數的本體;取而代之的是,他會返回產生器迭代器(generator-iterator)物件。每次呼叫產生器迭代器的 <code>next()</code> 方法,就會執行函數本體直到下一個 <code>yield</code> 語句,並返回他的結果。如果執行到函數的末端或到達 <code>return</code> 語句,就會拋出 <code>StopIteration</code> 例外。</p> + +<p>配合例子是最佳的說明︰</p> + +<pre class="eval">function simpleGenerator() +{ + yield "first"; + yield "second"; + yield "third"; + for (var i = 0; i < 3; i++) + yield i; +} + +var g = simpleGenerator(); +print(g.next()); // 輸出 "first" +print(g.next()); // 輸出 "second" +print(g.next()); // 輸出 "third" +print(g.next()); // 輸出 0 +print(g.next()); // 輸出 1 +print(g.next()); // 輸出 2 +print(g.next()); // 拋出 StopIteration +</pre> + +<p>產生器函數可以像類別的 <code>__iterator__</code> 方法一般直接的使用,大幅減少建立自訂的迭代器的代碼量。這裡是我們的 <code>Range</code>,使用產生器重新編寫︰</p> + +<pre class="eval">function Range(low, high) +{ + this.low = low; + this.high = high; +} +Range.prototype.__iterator__ = function() +{ + for (var i = this.low; i <= this.high; i++) + yield i; +}; +var range = new Range(3, 5); +for (var i in range) + print(i); // 輸出序列中的 3,然後是 4,然後是 5 +</pre> + +<p>並不是所有的產生器都會終止;有可能建立出表示無限序列的產生器。下面的產生器實裝了費伯納契數列,每一個元素都是前面兩個元素的合︰</p> + +<pre class="eval">function fibonacci() +{ + var fn1 = 1; + var fn2 = 1; + while (1) + { + var current = fn2; + fn2 = fn1; + fn1 = fn1 + current; + yield current; + } +} + +var sequence = fibonacci(); +print(sequence.next()); // 1 +print(sequence.next()); // 1 +print(sequence.next()); // 2 +print(sequence.next()); // 3 +print(sequence.next()); // 5 +print(sequence.next()); // 8 +print(sequence.next()); // 13 +</pre> + +<p>產生器函數可以接受參數,這個參數是用來約束第一次被呼叫的函數。產生器可以使用 <code>return</code> 語句來終止(並導致 <code>StopIteration</code> 例外的出現)。下面的 <code>fibonacci()</code> 變體接受選用性的 limit 參數,一旦通過限制就會終止。</p> + +<pre class="eval">function fibonacci(limit) +{ + var fn1 = 1; + var fn2 = 1; + while (1) + { + var current = fn2; + fn2 = fn1; + fn1 = fn1 + current; + <strong>if (limit && current > limit)</strong> + <strong>return;</strong> + yield current; + } +} +</pre> + +<h4 id="高階的產生器" name="高階的產生器">高階的產生器</h4> + +<p>產生器會計算出要求他們產生的值,這可讓產生器更有效率的表示需要耗費大量計算的序列,甚至是上面示範的無窮數列。</p> + +<p>除了 <code>next()</code> 方法以外,產生器迭代器物件還有 <code>send()</code> 方法,可以用來修改產生器的內部狀態。傳遞給 <code>send()</code> 的值將會被視為中止產生器的最後一個 <code>yield</code> 語句的結果。在你可以使用 <code>send()</code> 來傳送指定的值之前,你必須至少呼叫一次 <code>next()</code> 來啟動產生器。</p> + +<p>這裡是使用 <code>send()</code> 來重新開始數列的費伯納契數產生器︰</p> + +<pre>function fibonacci() +{ + var fn1 = 1; + var fn2 = 1; + while (1) + { + var current = fn2; + fn2 = fn1; + fn1 = fn1 + current; + <strong>var reset = yield current; + if (reset){ + fn1 = 1; + fn2 = 1; + }</strong> + } +} + +var sequence = fibonacci(); +print(sequence.next()); // 1 +print(sequence.next()); // 1 +print(sequence.next()); // 2 +print(sequence.next()); // 3 +print(sequence.next()); // 5 +print(sequence.next()); // 8 +print(sequence.next()); // 13 +<strong>print(sequence.send(true)); // 1</strong> +print(sequence.next()); // 1 +print(sequence.next()); // 2 +print(sequence.next()); // 3</pre> + +<div class="note"><strong>附注:</strong> 作為有趣的一點,呼叫 <code>send(undefined)</code> 就相當於呼叫 <code>next()</code>。然而,使用除了 undefined 以外的任意值啟動新生的產生器,在呼叫 <code>send()</code> 的時候,將會引起 <code>TypeError</code> 例外。</div> + +<p>你可以藉由呼叫產生器的 <code>throw()</code> 方法,並傳入他應該拋出的例外值,強迫產生器拋出例外。例外將會從目前被中止的產生器的位置拋出例外,就如同目前被中止的 <code>yield</code> 被替換成 <code>throw <em>value</em></code> 語句一樣。</p> + +<p>如果在拋出例外的處理期間沒有遇到 yield,然後例外將會不斷傳播直到呼叫 <code>throw()</code>,且隨後呼叫 <code>next()</code> 將導致 <code>StopIteration</code> 被拋出。</p> + +<p>產生器有可以強迫關閉他自己的 <code>close()</code> 方法。關閉產生器的效果是︰</p> + +<ol> + <li>執行所有在產生器函數裡的 <code>finally</code> 子句。</li> + <li>如果 <code>finally</code> 子句拋出除了 <code>StopIteration</code> 以外的任何例外,例外會被傳播到 <code>close()</code> 方法的呼叫者。</li> + <li>產生器終止。</li> +</ol> + +<h4 id="產生器的表達式" name="產生器的表達式">產生器的表達式</h4> + +<p>陣列簡約式主要的缺點是他們會造成在記憶體中建構出完整的新陣列。如果輸入的簡約式本身是小型的陣列其開銷還不明顯 - 但如果輸入的是大型的陣列或耗費資源(甚至是無限大)的產生器,新陣列的建立就會產生問題。</p> + +<p>產生器能夠延後計算他們要求的所需計算的項的序列。<em>產生器表達式</em>在語法上幾乎等同於 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E9%99%A3%E5%88%97%E7%9A%84%E9%81%8B%E7%94%A8#%E9%99%A3%E5%88%97%E7%9A%84%E7%B0%A1%E7%B4%84%E5%BC%8F" title="zh tw/Core JavaScript 1.5 教學/陣列的運用#陣列的簡約式">陣列的簡約式</a> - 他們使用圓括弧取代方括號 - 但不是建構陣列,他們建立可以延後執行的產生器。你可以把他們想成建立產生器的簡寫語法。</p> + +<p>假設我們有一個迭代器 <code>it</code> 可以迭代出大型的整數序列。我們想要建立可以迭代出雙倍的新迭代器。陣列簡約式會在記憶體中建立含有雙倍值的完整的陣列︰</p> + +<pre class="eval">var doubles = [i * 2 for (i in it)]; +</pre> + +<p>產生器表達式一方面會建立新的迭代器,能夠建立他們所需的雙倍值︰</p> + +<pre class="eval">var it2 = (i * 2 for (i in it)); +print(it2.next()); // 來自 it 的第一個值,雙倍 +print(it2.next()); // 來自 it 的第二個值,雙倍</pre> + +<p>如果把產生器表達式當作參數傳給函數,函數呼叫所使用的圓括弧意味著可以省略外部的圓括弧︰</p> + +<pre class="eval">var result = doSomething(i * 2 for (i in it)); +</pre> + +<p> </p> + +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:陣列的運用", "Core_JavaScript_1.5_教學:物件模型的細節") }}</p> + +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/Iterators_and_Generators" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/運算子/比較運算子/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/運算子/比較運算子/index.html new file mode 100644 index 0000000000..2ce01c1501 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/運算子/比較運算子/index.html @@ -0,0 +1,14 @@ +--- +title: 比較運算子 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/運算子/比較運算子 +--- +<p> </p> +<h3 id="比較運算子" name="比較運算子">比較運算子</h3> +<p><span class="comment">This seems to me kind of poorly explained, mostly the diference betwen "==" and "==="...</span>比較運算子比較他的運算元,並根據比較是否為真的結果返回邏輯值。運算元可以是數值、字串、邏輯或物件的值。字串是以 Unicode 的值作為標準的字典順序來比較。在大多數情況下,如果兩個運算元不是同樣的類型,JavaScript 會為了比較而嘗試把運算元轉換為適當的類型。(本規則的唯一例外是 <code>===</code> 和 <code>!==</code>,他會進行“嚴格的”相等性和不相等性的檢查,且在檢查等相性之前,並不會把運算元轉換為相容的類型。)通常以數值進行比較。下表以範例代碼解明比較運算子︰</p> +<pre class="eval">var var1 = 3, var2 = 4; +</pre> +<table class="fullwidth-table"> <tbody> <tr> <th>運算子</th> <th>說明</th> <th>返回 true 的範例</th> </tr> <tr> <td>等於 (==)</td> <td>運算元相等時,返回 true。</td> <td><code>3 == var1</code><br> <p><code>"3" == var1</code></p> <code>3 == '3'</code></td> </tr> <tr> <td>不等於 (!=)</td> <td>運算元不相等時,返回 true。</td> <td><code>var1 != 4<br> var2 != "3"</code></td> </tr> <tr> <td>嚴格的等於 (===)</td> <td>運算元相等且類型相同時,返回 true。</td> <td><code>3 === var1</code></td> </tr> <tr> <td>嚴格的不等於 (!==)</td> <td>運算元不相等或類型不相同時,返回 true。</td> <td><code>var1 !== "3"<br> 3 !== '3'</code></td> </tr> <tr> <td>大於 (>)</td> <td>左邊的運算元大於右邊的運算元時,返回 true。</td> <td><code>var2 > var1<br> "12" > 2</code></td> </tr> <tr> <td>大於或等於 (>=)</td> <td>左邊的運算元大於或等於右邊的運算元時,返回 true。</td> <td><code>var2 >= var1<br> var1 >= 3</code></td> </tr> <tr> <td>小於 (<)</td> <td>左邊的運算元小於右邊的運算元時,返回 true。</td> <td><code>var1 < var2<br> "12" < "2"</code></td> </tr> <tr> <td>小於或等於 (<=)</td> <td>左邊的運算元小於或等於右邊的運算元時,返回 true。</td> <td><code>var1 <= var2<br> var2 <= 5</code></td> </tr> </tbody> +</table> +<p><small><strong>表 3.3: 比較運算子</strong></small></p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:Operators:代入運算子", "Core_JavaScript_1.5_教學:運算子:算術運算子") }}</p> +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/Operators/Comparison_Operators", "es": "es/Gu\u00eda_JavaScript_1.5/Operadores/Operadores_de_comparaci\u00f3n", "fr": "fr/Guide_JavaScript_1.5/Op\u00e9rateurs/Op\u00e9rateurs_de_comparaison", "ja": "ja/Core_JavaScript_1.5_Guide/Operators/Comparison_Operators", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Operatory/Operatory_por\u00f3wnania" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/閉包的運用/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/閉包的運用/index.html new file mode 100644 index 0000000000..0e0905730f --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/閉包的運用/index.html @@ -0,0 +1,227 @@ +--- +title: 閉包的運用 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/閉包的運用 +--- +<h3 id="閉包的運用" name="閉包的運用">閉包的運用</h3> +<p>閉包(Closure)經常會被認為是 JavaScript 的高級機能,但了解閉包是精通語言的必要之事。</p> +<p>思考以下的函數︰</p> +<pre class="brush: js">function init() { + var name = "Mozilla"; + function displayName() { + alert(name); + } + displayName(); +} +</pre> +<p><code>init()</code> 函數建立了稱為 <code>name</code> 的局域變數,然後定義了稱為 <code>displayName()</code> 的函數。<code>displayName()</code> 是內部的函數 - 他是在 <code>init()</code> 內部定義的,而且只在函數本體內部才可使用。<code>displayName()</code> 沒有他自己的局域變數,但會重複使用在外部函數裡所宣告的 name 變數。</p> +<p>本例只會做一點事 - 試試執行代碼看會發生什麼。這是<em>詞彙作用域</em>的範例︰在 JavaScript 中,變數的作用域是由他自己在原始碼中的位置所定義的,且內部的函數能夠存取宣告於外部作用域的變數。</p> +<p>現在思考下例︰</p> +<pre class="brush: js">function makeFunc() { + var name = "Mozilla"; + function displayName() { + alert(name); + } + return displayName; +} + +var myFunc = makeFunc(); +myFunc(); +</pre> +<p>如果你執行這個代碼,將會發生和前一個 <code>init()</code> 例子完全相同的效果︰字串 "Mozilla" 將會被顯示在 JavaScript 的警告方框中。其中的不同點 - 以及有趣的一點 - 是內部的 <code>displayName()</code> 函數會在執行之前從外部的函數所返回。</p> +<p>代碼的運作看起來也許很不直覺。通常說,在函數內部的局域變數只存在於函數執行的期間。一旦 <code>makeFunc()</code> 執行完畢,預期不再需要 name 變數是很合理的。由於代碼仍舊以預期般的運作,很明顯情況並不如此。</p> +<p>對於這個難題的解答是 <code>myFunc</code> 已經變成<em>閉包</em>了。閉包是一種特殊的物件,其中結合了兩樣東西︰函數,和函數所建立的環境。環境由任意的局域變數所組成,這些變數是由在閉包建立的時間點上存在於作用域裡的所有變數。既然如此,<code>myFunc</code> 就是結合了 <code>displayName</code> 函數和閉包建立之後就存在的 "Mozilla" 字串這兩者的閉包。</p> +<p>這裡還有更為有趣的範例 - <code>makeAdder</code> 函數︰</p> +<pre class="brush: js">function makeAdder(x) { + return function(y) { + return x + y; + }; +} + +var add5 = makeAdder(5); +var add10 = makeAdder(10); + +print(add5(2)); // 7 +print(add10(2)); // 12 +</pre> +<p>在這個範例中,我們已經定義了函數 <code>makeAdder(x)</code>,可接受單一參數 <code>x</code>,並返回新的函數。返回的函數會接受單一參數 <code>y</code>,並返回 <code>x</code> 和 <code>y</code> 的合。</p> +<p>就本質而言,<code>makeAdder</code> 是函數的製造機 - 他會建立可以把指定的值和他們的參數相加的函數。在上例中,我們使用了我們的函數製造機來建立兩個新的函數 - 一個給他自己的參數加上 5,另一個則加上 10。</p> +<p><code>add5</code> 和 <code>add10</code> 兩個都是閉包。他們共享相同的函數本體的定義,但保存了不同的環境變數。在 <code>add5</code> 的環境中,<code>x</code> 是 5。至於互有關連的 <code>add10</code>,<code>x</code> 是 10。</p> +<h4 id="Practical_closures" name="Practical_closures">實用的閉包</h4> +<p>該是拋開理論的時候了 - 但是閉包真的有用嗎?讓我們思考閉包潛在的用處。閉包讓你把一些資料(環境)和可操作資料的函數聯繫在一起。這一點明顯和物件導向程式設式並行不悖,物件可讓我們把一些資料(物件的屬性)和一個以上的方法聯繫在一起。</p> +<p>因此,如果通常你會在某個地方使用附有單一方法的物件,你可以在這些地方使用閉包。</p> +<p>視情況你可能會想這樣做,這在 Web 上尤其常見。我們寫在 Web 上的 JavaScript 代碼多半是以事件為基礎 - 我們定義了一些行為,然後把這些行為和由使用者所觸發的事件(如 click 或 keypress)連繫在一起。我們的代碼通常被連繫為 Callback︰在回應事件時,所執行的單一函數。</p> +<p>這裡有個實際的例子︰假如我們希望在頁面上加入可以調整頁面文字的按鈕。以像素為單位,指定 body 元素的 font-size 是一個方法,然後以 em 為單位,設定在頁面上(如頁眉)的其他元素的大小︰</p> +<pre class="brush: css">body { + font-family: Helvetica, Aria, sans-serif; + font-size: 12px; +} + +h1 { + font-size: 1.5em; +} +h2 { + font-size: 1.2em; +} +</pre> +<p>我們的互動式文字大小按鈕可以改變 body 元素的 font-size 屬性,拜相對單位之賜,接著對其他的元素做調整。</p> +<p>JavaScript 代碼︰</p> +<pre class="brush: js">function makeSizer(size) { + return function() { + document.body.style.fontSize = size + 'px'; + }; +} + +var size12 = makeSizer(12); +var size14 = makeSizer(14); +var size16 = makeSizer(16); +</pre> +<p>現在 <code>size12</code>、<code>size14</code> 和 <code>size16</code> 這些函數可分別調整 body 文字的大小為 12、14 和 16 像素。我們可以把代碼和按鈕(本例中使用的是連結)連繫在一起,如下︰</p> +<pre class="brush: js">function setupButtons() { + document.getElementById('size-12').onclick = size12; + document.getElementById('size-14').onclick = size14; + document.getElementById('size-16').onclick = size16; +}</pre> +<pre class="brush: html"><a href="#" id="size-12">12</a> +<a href="#" id="size-14">14</a> +<a href="#" id="size-16">16</a> +</pre> +<p> </p> +<h4 id="Emulating_private_methods_with_closures" name="Emulating_private_methods_with_closures">使用閉包模擬私有的方法</h4> +<p>像 Java 這類語言可以把方法宣告為私有的,意思是這些方法只能被同一類別的其他方法所呼叫。</p> +<p>JavaScript 並不提供做這些事的原生方式,但可以使用閉包來模擬私有方法。私有方法不只是對限制代碼的存取這方面有用︰同時也是管理你的全域命名空間的強大方式,把非必要的方法堆在公開的界面裡。</p> +<p>這裡是如何使用閉包來定義可以存取私有函數和變數的公開函數︰</p> +<pre class="brush: js">var Counter = (function() { + var privateCounter = 0; + function changeBy(val) { + privateCounter += val; + } + return { + increment: function() { + changeBy(1); + }, + decrement: function() { + changeBy(-1); + }, + value: function() { + return privateCounter; + } + } +})(); + +alert(Counter.value()); /* 顯示 0 */ +Counter.increment(); +Counter.increment(); +alert(Counter.value()); /* 顯示 2 */ +Counter.decrement(); +alert(Counter.value()); /* 顯示 1 */ +</pre> +<p>在此完成了很多事。在上一個範例中,每一個閉包都有他自己的環境;此處我們建立了由三個函數所共享的單一環境<span style="font-family: monospace;">︰</span><code>Counter.increment</code>、<code>Counter.decrement</code>、<code>Counter.value</code>。</p> +<p>共享的環境是建立在無名函數的本體內,無名函數一經定義就會開始執行。環境內含兩個私有項︰稱作 <code>privateCounter</code> 的變數,以及稱作 <code>changeBy</code> 的函數。這兩個私有項都不能在無名函數外部被直接存取。相對的,必須由三個公開的函數來存取這些私有項,這三個函數是從無名函數的封裝器所返回的。</p> +<p>這三個公開的函數共享閉包的同一個環境。感謝 JavaScript 的辭彙作用域,這三個函數都能存取 <code>privateCounter</code> 變數和 <code>changeBy</code> 函數。</p> +<p>按照這個方式來運用閉包,可以得到通常是附加在物件導向程式設計裡的資料隱藏和封裝的好處。</p><h4 id="Creating_closures_in_loops:_A_common_mistake" name="Creating_closures_in_loops:_A_common_mistake">在循環中建立閉包︰常見的錯誤</h4> +<p>在 JavaScript 1.7 引入 <code>let</code> 關鍵字以前,閉包常見的問題出現在當閉包是在循環內部建立的時候。思考以下的例子︰</p> +<pre class="brush: html"><p id="help">這裡會顯示有用的提示</p> +<p>E-mail: <input type="text" id="email" name="email"></p> +<p>姓名: <input type="text" id="name" name="name"></p> +<p>年齡: <input type="text" id="age" name="age"></p> +</pre> +<pre class="brush: js">function showHelp(help) { + document.getElementById('help').innerHTML = help; +} + +function setupHelp() { + var helpText = [ + {'id': 'email', 'help': '你的 e-mail 位址'}, + {'id': 'name', 'help': '你的完整姓名'}, + {'id': 'age', 'help': '你的年齡(你必須大於 16 歲)'} + ]; + + for (var i = 0; i < helpText.length; i++) { + var item = helpText[i]; + document.getElementById(item.id).onfocus = function() { + showHelp(item.help); + } + } +} +</pre> +<p><code>helpText</code> 陣列定義了三個有用的提示,每一個都和文件中的輸入欄位的 ID 連繫在一起。循環會在這些定義裡巡回一圈,給每一個顯示相關連的說明的方法使用 onfocus 事件。</p> +<p>如果你試著執行這個代碼,你會發現他並不如預期般的運作。不管你把焦點放在哪一個欄位上,都會顯示關於你的年齡的訊息。</p> +<p>這其中的原因是代入給 onfocus 的函數是閉包;這些閉包是由函數的定義和從 <code>setupHelp</code> 函數的作用域所捕捉到的環境所組成的。這三個閉包已經建立了,但每一個都共享同一個環境。每次執行 onfocus 的 Callback 的時候,循環執行的是他自己的閉包,以及指向 <code>helpText</code> 列表中的最後一項的變數 item(由三個閉包所共享)。</p> +<p>本例的解決方法是使用更多的閉包︰特別是使用稍早已描述過的函數製造機︰</p> +<pre class="brush: js">function showHelp(help) { + document.getElementById('help').innerHTML = help; +} + +function makeHelpCallback(help) { + return function() { + showHelp(help); + }; +} + +function setupHelp() { + var helpText = [ + {'id': 'email', 'help': '你的 e-mail 位址'}, + {'id': 'name', 'help': '你的完整姓名'}, + {'id': 'age', 'help': '你的年齡(你必須大於 16 歲)'} + ]; + + for (var i = 0; i < helpText.length; i++) { + var item = helpText[i]; + document.getElementById(item.id).onfocus = makeHelpCallback(item.help); + } +} +</pre> +<p>這次就如預期般運作。而不是所有的 Callback 都共享單一的環境,<code>makeHelpCallback</code> 給每一個 <code>help</code> 建立新的環境,此處的 <code>help</code> 參照了相對應的 <code>helpText</code> 陣列的字串。</p> +<p>如果你使用 JavaScript 1.7 以上的版本,你可以使用 <code>let</code> 關鍵字建立具有區塊層級作用域的變數來解決這個問題︰</p> +<pre class="brush: js"> for (var i = 0; i < helpText.length; i++) { + let item = helpText[i]; + document.getElementById(item.id).onfocus = function() { + showHelp(item.help); + } + } +</pre> +<p><code>let</code> 關鍵字使 item 變數改用具有區塊層級的作用域來建立,導致 for 循環每一次反復都能建立新的參考。意思是每一個閉包都會捕捉到個別的變數,解決因為共享同一環境所引起的問題。</p><h4 id="Performance_considerations" name="Performance_considerations">效能的考量</h4> +<p>如果並沒有特定的任務需要用到閉包,且閉包對 Script 的效能會有負面的影響,因此在其他函數的內部裡建立不必要的函數是很不智的。</p> +<p>例如,當建立新的物件或類別時,通常應該要把方法和物件的原型連繫在一起,而不是在物件的建構子中定義。這其中的理由是,每當呼叫建構子的時候,就要把方法代入(也就是每一個物件正在建立的時候)。</p> +<p>思考以下不切實際的例子︰</p> +<pre class="brush: js">function MyObject(name, message) { + this.name = String(name); + this.message = String(message); + this.getName = function() { + return this.name; + }; + + this.getMessage = function() { + return this.message; + }; +} +</pre> +<p>上面的代碼並未從閉包的行為中取得好處,應該改用重整過的形式︰</p> +<pre class="brush: js">function MyObject(name, message) { + this.name = String(name); + this.message = String(message); +} +MyObject.prototype = { + getName: function() { + return this.name; + }, + getMessage: function() { + return this.message; + } +}; +</pre> +<p>或者是︰</p> +<pre class="brush: js">function MyObject(name, message) { + this.name = String(name); + this.message = String(message); +} +MyObject.prototype.getName = function() { + return this.name; +}; +MyObject.prototype.getMessage = function() { + return this.message; +}; +</pre> +<p>在上面這兩個範例中,繼承的原型可以被所有的物件所共享,而且在每一次建立物件時不再需要方法的定義。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8#%E7%89%A9%E4%BB%B6%E6%A8%A1%E5%9E%8B%E7%9A%84%E7%B4%B0%E7%AF%80" title="zh tw/Core JavaScript 1.5 教學#物件模型的細節">Core_JavaScript_1.5_教學#物件模型的細節</a> 以取得更多細節。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的函數:escape_和_unescape_函數", "Core_JavaScript_1.5_教學:物件和屬性") }}</p> +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/Working_with_Closures", "ja": "ja/Core_JavaScript_1.5_Guide/Working_with_Closures", "pl": "pl/Przewodnik_po_języku_JavaScript_1.5/Praca_z_zamknięciami" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/關於/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/關於/index.html new file mode 100644 index 0000000000..de638e2a9f --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/關於/index.html @@ -0,0 +1,47 @@ +--- +title: 關於 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/關於 +--- +<p> </p> +<h3 id="JavaScript_各版本的新機能" name="JavaScript_各版本的新機能">JavaScript 各版本的新機能</h3> +<ul> <li><a class="internal" href="/zh_tw/JavaScript_1.5_%E6%96%B0%E9%AE%AE%E4%BA%8B" title="zh tw/JavaScript 1.5 新鮮事">JavaScript 1.5 新鮮事</a></li> <li><a class="internal" href="/zh_tw/JavaScript_1.6_%E6%96%B0%E9%AE%AE%E4%BA%8B" title="zh tw/JavaScript 1.6 新鮮事">JavaScript 1.6 新鮮事</a></li> <li><a class="internal" href="/zh_tw/JavaScript_1.7_%E6%96%B0%E9%AE%AE%E4%BA%8B" title="zh tw/JavaScript 1.7 新鮮事">JavaScript 1.7 新鮮事</a></li> <li><a class="internal" href="/zh_tw/JavaScript_1.8_%E6%96%B0%E9%AE%AE%E4%BA%8B" title="zh tw/JavaScript 1.8 新鮮事">JavaScript 1.8 新鮮事</a></li> +</ul> +<h3 id="你應該知道什麼" name="你應該知道什麼">你應該知道什麼</h3> +<p>本教學假定你已具備如下背景知識︰</p> +<ul> <li>對網際網路和 World Wide Web (WWW) 有全面性的認識。</li> <li>有良好的 HyperText Markup Language (<a class="internal" href="/zh_tw/HTML" title="zh tw/HTML">HTML</a>) 基礎知識。</li> +</ul> +<p>具有某些語言(如 C 或 Visual Basic)的程式設計經驗會很有幫助,但不是必要的。</p> +<h3 id="JavaScript_的版本" name="JavaScript_的版本">JavaScript 的版本</h3> +<table class="fullwidth-table"> <tbody> <tr> <th>JavaScript 的版本</th> <th>Navigator 的版本</th> </tr> <tr> <td>JavaScript 1.0</td> <td>Navigator 2.0</td> </tr> <tr> <td>JavaScript 1.1</td> <td>Navigator 3.0</td> </tr> <tr> <td>JavaScript 1.2</td> <td>Navigator 4.0-4.05</td> </tr> <tr> <td>JavaScript 1.3</td> <td>Navigator 4.06-4.7x</td> </tr> <tr> <td>JavaScript 1.4</td> <td> </td> </tr> <tr> <td>JavaScript 1.5</td> <td>Navigator 6.0<br> Mozilla(開放源始碼的瀏覽器)</td> </tr> <tr> <td>JavaScript 1.6</td> <td><a class="internal" href="/zh_tw/Firefox_1.5_for_developers" title="zh tw/Firefox 1.5 for developers">Firefox 1.5</a>,其他以 Mozilla 1.8 為基礎的產品</td> </tr> <tr> <td>JavaScript 1.7</td> <td><a class="internal" href="/zh_tw/Firefox_2_%E6%8A%80%E8%A1%93%E6%96%87%E4%BB%B6" title="zh tw/Firefox 2 技術文件">Firefox 2</a>,其他以 Mozilla 1.8.1 為基礎的產品</td> </tr> <tr> <td>JavaScript 1.8</td> <td><a class="internal" href="/zh_tw/Firefox_3_for_developers" title="zh tw/Firefox 3 for developers">Firefox 3</a>,其他以 Gecko 1.9 為基礎的產品</td> </tr> </tbody> +</table> +<p><small><strong>表 1: JavaScript 和 Navigator 版本</strong></small><br> +<br> +Netscape Enterprise Server 的各版本亦分別支援不同的 JavaScript 版本。為幫助你編寫相容於 Enterprise Server 各版本的 Script,本教學使用略稱來表示 Server 的版本。</p> +<table class="fullwidth-table"> <tbody> <tr> <th>略稱</th> <th>Enterprise Server 的版本</th> </tr> <tr> <td>NES 2.0</td> <td>Netscape Enterprise Server 2.0</td> </tr> <tr> <td>NES 3.0</td> <td>Netscape Enterprise Server 3.0</td> </tr> </tbody> +</table> +<p><small><strong>表 2: Netscape Enterprise Server 各版本的略稱</strong></small></p> +<h3 id="在何處取得_JavaScript_資訊" name="在何處取得_JavaScript_資訊">在何處取得 JavaScript 資訊</h3> +<p>以下書藉內含核心 JavaScript 的文件︰</p> +<ul> <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8" title="zh tw/Core JavaScript 1.5 教學"> Core JavaScript 教學</a>(本教學)提供有關於核心 JavaScript 語言及其物件的資訊。</li> <li><a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83" title="zh tw/Core JavaScript 1.5 參考"> Core JavaScript 參考</a> 提供有關於核心 JavaScript 語言的參考資料。</li> +</ul> +<p>如果你是 JavaScript 的新手,就從 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8" title="zh tw/Core JavaScript 1.5 教學">Core JavaScript 教學</a> 著手。如果你已具備穩固的基礎,你可以從 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83" title="zh tw/Core JavaScript 1.5 參考">Core JavaScript 參考</a> 取得個別物件或語法的進一步細節。</p> +<h3 id="JavaScript_的學習提示" name="JavaScript_的學習提示">JavaScript 的學習提示</h3> +<p>JavaScript 的入門很簡單: 只需要有最新的 Web 瀏覽器。本教學使用了一些目前只能在最新版本的 Firefox(以及其化的 Gecko 瀏覽器)執行的 JavaScript 機能,所以建議使用最新版本的 Firefox。</p> +<h4 id="互動式解譯器" name="互動式解譯器">互動式解譯器</h4> +<p>互動式 JavaScript 的提示對於語言的學習有極大的幫助,使你不必儲存檔案或更新頁面就能以互動方式加以試驗。從 Firefox 的“工具”選單可以找到“錯誤主控台”,可提供嘗試互動式 JavaScript 的簡單途徑: 只需輸入一行代碼,並按下“執行”按鈕。</p> +<p><img alt="Image:ErrorConsole.png" class=" internal" src="/@api/deki/files/192/=ErrorConsole.png"></p> +<h4 id="Firebug" name="Firebug">Firebug</h4> +<p>更高級的互動式提示還可使用第三方擴充套件 <a class="external" href="http://www.getfirebug.com/">Firebug</a>。Firebug 提供了高級的 DOM 檢視器(JavaScript 除錯器)、分析工具和各種實用工具︰</p> +<p><img alt="Image:Firebug.png" class=" internal" src="/@api/deki/files/204/=Firebug.png"></p> +<p>其中 Firebug 提供的最有用的功能是 <code>console.log()</code>,把自己的參數輸出到 Firebug 主控台的函數。有別於其他程式語言,JavaScript 並沒有輸出至標準輸出的概念<span style="font-family: monospace;">。</span><code>console.log()</code> 提供了很有用的替代品,使你更容易觀察程式的執行。</p> +<p>本教學的許多範例中使用 <code>alert()</code> 顯示執行的訊息。如果你已安裝 Firebug,你可以使用 <code>console.log()</code> 取代 <code>alert()</code> 來執行這些範例。</p> +<h3 id="文件慣例" name="文件慣例">文件慣例</h3> +<p>JavaScript 應用程式可執行於許多的作業系統,本文的資訊可套用於所有的版本。檔案和資料夾路徑採用 Windows 格式(使用反斜線 (\) 分割資料夾名稱)。對 Unix 版本而言,資料夾路徑也是相同的,除非你使用斜線 (/) 取代反斜線來分割資料夾名稱。</p> +<p>本教學使用如下形式的 URL︰</p> +<p><code><span class="nowiki">http://server.domain/path/file.html</span></code></p> +<p>在上面的 URL 中,“server”表示執行應用程式的伺服器的名稱(例如︰research1、www),“domain”表示網際網路的域名(例如︰netscape.com、uiuc.edu),“path”表示在伺服器上的資料夾結構,“file.html”表示個別的檔名。一般來說,在 URL 裡以標準的等寬字型顯示的斜體表示是可修改的項目。如果你的伺服器已啟用 Secure Sockets Layer (SSL),URL 的 http 就應該取代為 https。</p> +<p>本教程使用如下的字型慣例︰</p> +<ul> <li><code>等寬字型(monospace font)</code>用於範例代碼和代碼列表、API 和語言元素(方法名和屬性名等等)、檔案名稱、路徑名稱、資料夾名稱、HTML 標記,以及必須輸入在螢幕上的文字。(等寬斜體字型用來表示代碼裡的可修改項。)</li> <li><em>斜體(Italic type)</em>用於標題、強調、變數和可修改項,以及按字面表示的文字。</li> <li><strong>粗體(Boldface)</strong>用於術語。</li> +</ul> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學", "Core_JavaScript_1.5_教學:JavaScript_概要") }}</p> +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/About", "es": "es/Gu\u00eda_JavaScript_1.5/Acerca_de_esta_gu\u00eda", "fr": "fr/Guide_JavaScript_1.5/\u00c0_propos", "ja": "ja/Core_JavaScript_1.5_Guide/About", "ko": "ko/Core_JavaScript_1.5_Guide/About", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/O_tym_przewodniku", "zh-cn": "cn/Core_JavaScript_1.5_Guide/\u5173\u4e8e" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的函數/parseint_和_parsefloat_函數/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的函數/parseint_和_parsefloat_函數/index.html new file mode 100644 index 0000000000..65d1287175 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的函數/parseint_和_parsefloat_函數/index.html @@ -0,0 +1,21 @@ +--- +title: parseInt 和 parseFloat 函數 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的函數/parseInt_和_parseFloat_函數 +--- +<p> </p> +<div class="onlyinclude"> +<h4 id="parseInt_和_parseFloat_函數">parseInt 和 parseFloat 函數</h4> +<p>這兩個〝分析〞<span style="font-family: monospace;">函數,</span><code>parseInt</code> 和 <code>parseFloat</code>,會在給與字串作為參數時返回數值。</p> +<p><code>parseFloat</code> 的語句如下</p> +<pre>parseFloat(str) +</pre> +<p>此處的 <code>parseFloat</code> 會分析他自己的參數,字串 <code>str</code>,並試著返回浮點數。如果遇到正負符號 (+ 或 -)、數字 (0-9)、小數點、指數以外的字元,他就會返回在此之前的數值,並忽略那些字元。如果連第一個字元也不可以轉換為數字,就會返回〝NaN〞(不是數字)。</p> +<p><code>parseInt</code> 的語句如下</p> +<pre>parseInt(str [, radix]) +</pre> +<p><code>parseInt</code> 會分析他自己的參數,字串 <code>str</code>,並試著返回由第二個參數所指定的 <code>radix</code> (基數)的整數。<code>radix</code> 為選用性參數。舉例來說,以 10 為底的基數表示要轉換為十進制數,8 是八進制,16 是十六進制,依此類推。對於 10 以上的基數,就會使用字母來表示大於九的數字。例如,十六進制數(基數 16),就會用到 A 到 F 的字母。</p> +<p>如果 <code>parseInt</code> 遇到不是在指定基數之內的字元,就會直接忽略這個字元及其隨後字元,並返回在此之前已經分析出來的整數值。如果連第一個字元也不可以轉換為指定基數之內的字元,就會返回〝NaN〞。<code>parseInt</code> 函數會切除字串以取得整數值。</p> +</div> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的函數:isNaN_函數", "Core_JavaScript_1.5_教學:預先定義的函數:Number_和_String_函數") }}</p> +<p>{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/Predefined_Functions/parseInt_and_parseFloat_Functions", "es": "es/Gu\u00eda_JavaScript_1.5/Funciones_predefinidas/Funciones_parseInt_y_parseFloat", "fr": "fr/Guide_JavaScript_1.5/Fonctions_pr\u00e9d\u00e9finies/Les_fonctions_parseInt_et_parseFloat", "ja": "ja/Core_JavaScript_1.5_Guide/Predefined_Functions/parseInt_and_parseFloat_Functions", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Funkcje_predefiniowane/Funkcje_parseInt_i_parseFloat" } ) }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/array_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/array_物件/index.html new file mode 100644 index 0000000000..a806c4dfac --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/array_物件/index.html @@ -0,0 +1,151 @@ +--- +title: Array 物件 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/Array_物件 +--- +<p> </p> +<h3 id="Array_物件" name="Array_物件">Array 物件</h3> +<p>JavaScript 並沒有明確的陣列資料類型。不過你可以在你的應用程式中,使用預先定義的 <code>Array</code> 物件和他的方法來運用陣列。<code>Array</code> 物件有各種陣列的操作方法,如合併、反轉、排序。他還有用來確定陣列的長度的屬性,還有和正規表達式一起使用的屬性。</p> +<p><em>陣列</em>是值的有序集合,你可以使用名稱或索引來參考這些值。例如,你有一個稱作 <code>emp</code> 的陣列,其中內含職員的名字,並按照職員的編號來索引。於是 <code>emp{{ mediawiki.external(1) }}</code> 就代表編號 1 的職員,<code>emp{{ mediawiki.external(2) }}</code> 就代表編號 2 的職員,依此類推。</p> +<p> </p> +<h4 id="陣列的建立" name="陣列的建立">陣列的建立</h4> +<p><code>Array</code> 物件的建立如下︰</p> +<pre>1. arrayObjectName = new Array(element0, element1, ..., elementN) +2. arrayObjectName = new Array(arrayLength) +</pre> +<p><code>arrayObjectName</code> 就是新物件的名稱、或者是既存物件的屬性。當使用 <code>Array</code> 的屬性和方法的時候,<code>arrayObjectName</code> 就是既存的 <code>Array</code> 物件的名稱、或者是既存物件的屬性。</p> +<p><code>element0, element1, ..., elementN</code> 就是陣列元素的值的列表。如果指定了這個形式的話,陣列就會以指定的值作為元素來初始化,且陣列的 length 屬性會被設為參數的數目。</p> +<p><code>arrayLength</code> 就是陣列的初期長度。下面的代碼建立帶有五個元素的陣列︰</p> +<pre>billingMethod = new Array(5) +</pre> +<p>陣列的字面表達同時也是 <code>Array</code> 物件;舉例來說,下面的字面表達就是 <code>Array</code> 物件。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E5%AD%97%E9%9D%A2%E8%A1%A8%E9%81%94#%E9%99%A3%E5%88%97%E7%9A%84%E5%AD%97%E9%9D%A2%E8%A1%A8%E9%81%94" title="zh tw/Core JavaScript 1.5 教學/字面表達#陣列的字面表達">陣列的字面表達</a> 以取得陣列的字面表達的細節。</p> +<pre>coffees = ["French Roast", "Columbian", "Kona"] +</pre> +<h4 id="陣列的操作" name="陣列的操作">陣列的存放</h4> +<p>你可以藉由把值代入給陣列自己的元素的方式來存放到陣列裡。例如,</p> +<pre>emp[1] = "Casey Jones" +emp[2] = "Phil Lesh" +emp[3] = "August West" +</pre> +<p>你也可以在建立陣列的同時來作存放︰</p> +<pre>myArray = new Array("Hello", myVar, 3.14159) +</pre> +<h4 id="陣列元素的參考" name="陣列元素的參考">陣列元素的參考</h4> +<p>你可以使用元素的序號來參考陣列的元素。例如,假設你定義了如下的陣列︰</p> +<pre>myArray = new Array("Wind","Rain","Fire") +</pre> +<p>然後你可以使用 <code>myArray{{ mediawiki.external(0) }}</code> 來參考第一個元素,使用 <code>myArray{{ mediawiki.external(1) }}</code> 來參考第二個元素。</p> +<p>元素的索引是從零 (0) 開始的,不過陣列的長度(例如,<code>myArray.length</code>)反映的是陣列中的元素的數目。</p> +<h4 id="Array_的方法" name="Array_的方法">Array 的方法</h4> +<p><code>Array</code> 物件有以下的方法︰</p> +<ul> + <li><code>concat</code> 合併兩個陣列,並把新的陣列返回。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array("1","2","3") + myArray = myArray.concat("a", "b", "c"); // myArray 現在是 ["1", "2", "3", "a", "b", "c"] +</pre> +<p> </p> +<ul> + <li><code>join(deliminator = ",")</code> 把所有的陣列元素合併成字串。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array("Wind","Rain","Fire") + list = myArray.join(" - "); // list 的內容是 "Wind - Rain - Fire" +</pre> +<p> </p> +<ul> + <li><code>pop</code> 把陣列的最後一個元素移除掉,並把元素返回。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array("1", "2", "3"); + last=myArray.pop(); // MyArray 現在是 ["1", "2"], last = "3" +</pre> +<p> </p> +<ul> + <li><code>push</code> 在陣列的末端加入一個以上的元素,並返回陣列的最終長度。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array("1", "2"); + myArray.push("3"); // MyArray 現在是 ["1", "2", "3"] +</pre> +<p> </p> +<ul> + <li><code>reverse</code> 調換陣列的元素︰陣列的第一個元素變成最後一個元素,最後一個則變成第一個。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array ("1", "2", "3"); + myArray.reverse(); // 調換陣列的結果是 myArray = [ "3", "2", "1" ] +</pre> +<p> </p> +<ul> + <li><code>shift</code> 移除陣列的第一個元素,並返回被移除的元素。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array ("1", "2", "3"); + first=myArray.shift(); // MyArray 現在是 ["2", "3"],first 是 "1" +</pre> +<p> </p> +<ul> + <li><code>slice (start_index, upto_index)</code> 抽出陣列的片斷,並返回新的陣列。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array ("a", "b", "c", "d", "e"); + myArray = myArray.slice(1,4); // 從索引 1 為起點抽出所有的元素,直到索引 4 為止,返回 [ "b", "c", "d" ] +</pre> +<p> </p> +<ul> + <li><code>splice(index, count_to_remove, addelement1, addelement2, ...)</code> 加入並/或移除陣列的元素。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array ("1", "2", "3", "4", "5"); + myArray.splice(1,3,"a","b","c", "d"); // MyArray 現在是 ["1", "a", "b", "c", "d", "5"] + // 這個代碼從索引 1(也就是 "2")開始,把那裡的 3 個元素移除掉, + // 然後把所有的連續元素插入到那個位置。 +</pre> +<p> </p> +<ul> + <li><code>sort</code> 把陣列的元素重新排序。</li> +</ul> +<p> </p> +<pre class="eval"> myArray = new Array("Wind","Rain","Fire") + myArray.sort(); // 排序陣列的結果是 myArrray = [ "Fire", "Rain", "Wind" ] +</pre> +<p> </p> +<p><code>sort</code> 也接受 Callback 函數以確定該如何排序陣列的內容。這個函數會對兩個值作比較,並返回三個值的其中一者︰</p> +<ul> + <li>如果 a 在排序系統中小於 b,返回 -1(或任意的負數)</li> + <li>如果 a 在排序系統中大於 b,返回 1(或任意的正數)</li> + <li>如果 a 和 b 被認為是同等的,返回 0。</li> +</ul> +<p>舉例來說,下面的代碼將以陣列最後面的字母來排序︰</p> +<p> </p> +<pre class="eval"> var sortFn = function(a,b){ + if (a[a.length - 1] < b[b.length - 1]) return -1; + if (a[a.length - 1] > b[b.length - 1]) return 1; + if (a[a.length - 1] == b[b.length - 1]) return 0; + } + myArray.sort(sortFn); // 排序陣列的結果是 myArray = ["Wind","Fire","Rain"] +</pre> +<p> </p> +<ul> + <li><code>unshift</code> 在陣列的前頭加入一個以上的元素,並返回陣列的新長度。</li> +</ul> +<h4 id="二維陣列" name="二維陣列">二維陣列</h4> +<p>下面的代碼建立二維陣列。</p> +<pre>a = new Array(4) +for (i=0; i < 4; i++) { + a[i] = new Array(4) + for (j=0; j < 4; j++) { + a[i][j] = "["+i+","+j+"]" + } +} +</pre> +<p>本例以如下的行來建立陣列︰</p> +<pre>行 0:[0,0][0,1][0,2][0,3] +行 1:[1,0][1,1][1,2][1,3] +行 2:[2,0][2,1][2,2][2,3] +行 3:[3,0][3,1][3,2][3,3] +</pre> +<h4 id="陣列和正規表達式" name="陣列和正規表達式">陣列和正規表達式</h4> +<p>如果有一個陣列是正規表達式和字串之間比對的結果,這個陣列會返回有關比對的資訊的屬性和元素。陣列可以是 <code>RegExp.exec</code>、<code>String.match</code>、<code>String.split</code> 的返回值。若需要與正規表達式一同使用陣列的資訊,詳見第四章,<a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E9%81%94%E5%BC%8F" title="zh tw/Core JavaScript 1.5 教學#正規表達式">正規表達式</a>。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:Boolean_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/boolean_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/boolean_物件/index.html new file mode 100644 index 0000000000..02648f7073 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/boolean_物件/index.html @@ -0,0 +1,12 @@ +--- +title: Boolean 物件 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/Boolean_物件 +--- +<p> </p> +<h3 id="Boolean_物件" name="Boolean_物件">Boolean 物件</h3> +<p><code>Boolean</code> 物件是原始的 Boolean 資料類型包裝而成。使用下面的語法來建立 <code>Boolean</code> 物件︰</p> +<pre>booleanObjectName = new Boolean(value) +</pre> +<p>別把原始的布林值的 <code>true</code> 和 <code>false</code> 與 <code>Boolean</code> 物件的 true 和 false 值給混淆了。任何物件的值只要不是 <code>undefined</code>、<code>null</code>、<code>0</code>、<code>NaN</code>、空字串,即使是值為 false 的 <code>Boolean</code> 物件,當傳入到條件語句裡的時候,其求值結果仍為 true。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E6%A2%9D%E4%BB%B6%E8%AA%9E%E6%B3%95#if...else_%E8%AA%9E%E6%B3%95" title="zh tw/Core JavaScript 1.5 教學/條件語法#if...else 語法">if...else 語法</a> 取得更進一步資訊。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:Array_物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:Date_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/date_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/date_物件/index.html new file mode 100644 index 0000000000..ca94741f14 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/date_物件/index.html @@ -0,0 +1,82 @@ +--- +title: Date 物件 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/Date_物件 +--- +<p> </p> +<h3 id="Date_物件" name="Date_物件">Date 物件</h3> +<p>JavaScript 並沒有日期的資料類型。不過你可以在你的應用程式中使用 <code>Date</code> 物件及其方法來使用日期和時間。<code>Date</code> 物件有非常大量的方法可用來設定、取得、操作日期。不過沒有任何的屬性。</p> +<p>JavaScript 處理日期的方式很類似 Java。這兩個語言有很多同樣的日期方法,而且這兩個語言都是以 1970 年 1 月 1 日 00:00:00 開始的毫秒數來儲存日期。</p> +<p>Date 物件的範圍是以 1970 年 1 月 1 日 (UTC) 為基準,從 -100,000,000 日一直到 100,000,000 日。</p> +<p>如下建立 <code>Date</code> 物件︰</p> +<pre>dateObjectName = new Date([parameters]) +</pre> +<p>此處的 <code>dateObjectName</code> 就是將要建立的 <code>Date</code> 物件的名稱;他可以是新的物件或是既存物件的屬性。</p> +<p>前敘語法中的 <code>parameters</code> 可以是下列的任何一種形式︰</p> +<ul> + <li>沒有參數︰建立今天的日期和時間。例如,<code>today = new Date()</code>。</li> + <li>以此格式表示日期的字串︰"月 日, 年 時:分:秒"。例如,<code>Xmas95 = new Date("December 25, 1995 13:30:00")</code>。如果你省略了時、分、秒,這些值會被設為零。</li> + <li>一組年、月、日的整數值。例如,<code>Xmas95 = new Date(1995,11,25)</code>。</li> + <li>一組年、月、日、時、分、秒的整數值。例如,<code>Xmas95 = new Date(1995,11,25,9,30,0)</code>。</li> +</ul> +<p><strong>JavaScript 1.2 及早期版本</strong><br> + <code>Date</code> 物件的行為如下︰</p> +<ul> + <li>不允許使用 1970 年以前的日期。</li> + <li>JavaScript 依靠平台特有的日期之便及其行為;平台與平台之間,<code>Date</code> 物件的行為有所不同。</li> +</ul> +<h4 id="Methods_of_the_Date_Object" name="Methods_of_the_Date_Object">Date 物件的方法</h4> +<p>用於處理日期和時間的 <code>Date</code> 物件的方法主要可分為這幾類︰</p> +<ul> + <li>"set" 方法,用於設定 <code>Date</code> 物件的日期和時間的值。</li> + <li>"get" 方法,用於取得 <code>Date</code> 物件的日期和時間的值。</li> + <li>"to" 方法,用於從 <code>Date</code> 物件返回字串值。</li> + <li>parse 和 UTC 方法,用於分析 <code>Date</code> 字串。</li> +</ul> +<p>使用 "get" 和 "set" 方法,你可以分別取得或設定秒、分、時、日、星期、月、年。還有 <code>getDay</code> 方法可返回星期,但沒有相對應的 <code>setDay</code> 方法,因為星期會自動設定。這些方法使用整數來表示如下的這些值︰</p> +<ul> + <li>秒和分︰0 至 59</li> + <li>時︰0 至 23</li> + <li>星期︰0(星期日)至 6(星期六)</li> + <li>日︰1 至 31(月份裡的某一日)</li> + <li>月︰0(一月)至 11(十二月)</li> + <li>年︰從 1900 年起</li> +</ul> +<p>舉例來說,假設你定義了如下日期︰</p> +<pre>Xmas95 = new Date("December 25, 1995") +</pre> +<p><code>Xmas95.getMonth()</code> 返回 11,而 <code>Xmas95.getFullYear()</code> 返回 1995。</p> +<p><code>getTime</code> 和 <code>setTime</code> 方法對於日期的比較來說很有用。<code>getTime</code> 方法返回自 1970 年 1 月 1 日 00:00:00 以來的毫秒數。</p> +<p>例如,下面的代碼顯示今年的剩餘天數︰</p> +<pre>today = new Date() +endYear = new Date(1995,11,31,23,59,59,999) // 設定日和月 +endYear.setFullYear(today.getFullYear()) // 設定為今年 +msPerDay = 24 * 60 * 60 * 1000 // 一天的毫秒數 +daysLeft = (endYear.getTime() - today.getTime()) / msPerDay +daysLeft = Math.round(daysLeft) // 返回今年的剩餘天數 +</pre> +<p>本範例建立了名為 today 的 <code>Date</code> 物件,其中內含有今天的日期。然後,使用一天的毫秒數,計算今天和 <code>endYear</code> 之間的天數,使用 <code>getTime</code> 並捨入為天數。</p> +<p>The <code>parse</code> 方法對於把值從日期字串代入到既存的 <code>Date</code> 物件來說很有用。例如,下面的代碼使用 <code>parse</code> 和 <code>setTime</code> 把日期的值代入到 <code>IPOdate</code> 物件︰</p> +<pre>IPOdate = new Date() +IPOdate.setTime(Date.parse("Aug 9, 1995")) +</pre> +<h4 id="Using_the_Date_Object:_an_Example" name="Using_the_Date_Object:_an_Example">Date 物件的使用︰範例</h4> +<p>在下面的範例中,函數 <code>JSClock()</code> 返回以數位時鐘為格式的時間。</p> +<pre>function JSClock() { + var time = new Date() + var hour = time.getHours() + var minute = time.getMinutes() + var second = time.getSeconds() + var temp = "" + ((hour > 12) ? hour - 12 : hour) + if (hour == 0) + temp = "12"; + temp += ((minute < 10) ? ":0" : ":") + minute + temp += ((second < 10) ? ":0" : ":") + second + temp += (hour >= 12) ? " P.M." : " A.M." + return temp +} +</pre> +<p><code>JSClock</code> 函數首先建立稱為 <code>time</code> 的新 Date 物件;因為沒有提供參數,time 會以今天的日期和時間來建立。然後呼叫 <code>getHours</code>、<code>getMinutes</code>、<code>getSeconds</code> 方法把時、分、秒的值代入到 <code>hour</code>、<code>minute</code>、<code>second</code>。</p> +<p>以下的四個語句會以 time 為基準建立字串。第一個語句建立變數 <code>temp</code>,使用條件表達式把值代入;如果 <code>hour</code> 大於 12,就會是 (hour - 12),否則會是單純的 hour,除非 hour 為 0,這時就會是 12。</p> +<p>下一個語句把 <code>minute</code> 的值附加到 temp 裡。如果 <code>minute</code> 的值小於 10,條件表達式就會加上前置為零的字串;否則加上分隔用分號的字串。接下來的語句把秒的值以同樣方式附加到 temp。</p> +<p>最後,如果 <code>hour</code> 大於 12,條件表達式就把 "PM" 附加到 temp;否則就把 "AM" 附加到 <code>temp</code>。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:Boolean_物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:Function_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/function_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/function_物件/index.html new file mode 100644 index 0000000000..4acf1e73ca --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/function_物件/index.html @@ -0,0 +1,45 @@ +--- +title: Function 物件 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/Function_物件 +--- +<p> </p> +<h3 id="Function_物件" name="Function_物件">Function 物件</h3> +<p>預先定義的 <code>Function</code> 物件會把指定的 JavaScript 字串的代碼編譯成函數。</p> +<p>建立 <code>Function</code> 物件如下︰</p> +<pre>functionObjectName = new Function ([arg1, arg2, ... argn], functionBody) +</pre> +<p><code>functionObjectName</code> 就是變數的名稱或既存物件的屬性。他也可以是後跟小寫的事件處理器名稱的物件,如 <code>window.onerror</code>。</p> +<p><code>arg1</code>, <code>arg2</code>, ... <code>argn</code> 就是要被函數用作形式參數的名稱的參數。其中每一個都必須是字串,並合於有效的 JavaScript 識別子。例如 "x" 或 "theForm"。</p> +<p><code>functionBody</code> 就是指定的 JavaScript 代碼的字串,將會編譯成函數本體。</p> +<p><code>Function</code> 物件會在每一次被用到時求值。這比宣告函數並在你的代碼中呼叫還要沒效率,因為宣告過的函數已經編譯過了。</p> +<p>除了此處所描述的函數的定義方式以外,你也可以使用 <code>function</code> 語句和函數的表達式。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83" title="zh tw/Core JavaScript 1.5 參考">Core JavaScript 1.5 參考</a> 取得更進一步資訊。</p> +<p>下面的代碼把函數代入到變數 <code>setBGColor</code>。這個函數會設定目前文件的背景色。</p> +<pre>var setBGColor = new Function("document.bgColor='antiquewhite'") +</pre> +<p>若要呼叫這個 <code>Function</code> 物件,你可以把指定的變數名稱如同函數一般來使用。下面的代碼執行了由 <code>setBGColor</code> 變數所指定的函數︰</p> +<pre>var colorChoice="antiquewhite" +if (colorChoice=="antiquewhite") {setBGColor()} +</pre> +<p>你可以使用下列任一方式把函數代入給事件處理器︰</p> +<pre>1. document.form1.colorButton.onclick=setBGColor +2. <INPUT NAME="colorButton" TYPE="button" + VALUE="Change background color" + onClick="setBGColor()"> +</pre> +<p>上面所建立的變數 <code>setBGColor</code> 類似於宣告下面的函數︰</p> +<pre>function setBGColor() { + document.bgColor='antiquewhite' +} +</pre> +<p>把函數代入給變數類似於宣告函數,但有幾點不同︰</p> +<ul> + <li>當你使用 <code>var <code>setBGColor = new Function("...")</code></code> 把函數代入給變數時,<code>setBGColor</code> 只是參照以 <code>new <code>Function()</code></code> 建立的函數的變數。</li> + <li>當你使用 <code>function setBGColor() {...}</code> 建立函數,<code>setBGColor</code> 並不是變數,而是函數的名稱。</li> +</ul> +<p>你可以在函數的內部嵌入函數。內嵌的(內部)函數對於包含這個函數的(外部)函數而言是私有的︰</p> +<ul> + <li>只能由外部函數裡面的語句來存取內部函數。</li> + <li>內部函數可以使用外部函數的參數和變數。外部函數不能使用內部函數的參數和變數。</li> +</ul> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:Date_物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:Math_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/math_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/math_物件/index.html new file mode 100644 index 0000000000..8aa6bb0223 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/math_物件/index.html @@ -0,0 +1,69 @@ +--- +title: Math 物件 +slug: Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/Math_物件 +--- +<p> </p> +<h3 id="Math_物件" name="Math_物件">Math 物件</h3> +<p>預先定義的 <code>Math</code> 物件具有針對數學常數和函數的屬性和方法。例如,<code>Math</code> 物件的 <code>PI</code> 屬性有圓周率的值 (3.141...),你可以在應用程式中如下使用。</p> +<pre>Math.PI +</pre> +<p>同樣的,Math 的方法就是標準的數學函數。其中包括三角函數、對數函數、指數函數、以及其他函數。例如,如果你想要使用三角函數 sine,你可以如下編寫。</p> +<pre>Math.sin(1.56) +</pre> +<p>注意,<code>Math</code> 所有的三角函數的方法只接受以弧度為單位的參數。</p> +<p>下表列出了 <code>Math</code> 物件的方法。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>方法</th> + <th>說明</th> + </tr> + <tr> + <td>abs</td> + <td>絕對值。</td> + </tr> + <tr> + <td>sin, cos, tan</td> + <td>標準三角函數;參數以弧度為單位。</td> + </tr> + <tr> + <td>acos, asin, atan, atan2</td> + <td>反三角函數;返回值以弧度為單位。</td> + </tr> + <tr> + <td>exp, log</td> + <td>指數函數和以 <sub>e</sub> 為底的自然對數。</td> + </tr> + <tr> + <td>ceil</td> + <td>返回大於等於參數的最小整數。</td> + </tr> + <tr> + <td>floor</td> + <td>返回小於等於參數的最大整數。</td> + </tr> + <tr> + <td>min, max</td> + <td>返回兩個參數中最大的或最小的。</td> + </tr> + <tr> + <td>pow</td> + <td>指數函數;第一個參數為底數,第二個為指數。</td> + </tr> + <tr> + <td>random</td> + <td>返回介於 0 和 1 之間的隨機數。</td> + </tr> + <tr> + <td>round</td> + <td>把參數捨入至最接近的整數。</td> + </tr> + <tr> + <td>sqrt</td> + <td>平方根。</td> + </tr> + </tbody> +</table> +<p><small><strong>表 7.1: Math 的方法</strong></small></p> +<p>有別於其他的物件,你永遠不需要自行建立 <code>Math</code> 物件。你永遠可以使用預先定義的 <code>Math</code> 物件。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:Function_物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:Number_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/number_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/number_物件/index.html new file mode 100644 index 0000000000..01ff1ca26f --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/number_物件/index.html @@ -0,0 +1,80 @@ +--- +title: Number 物件 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/Number_物件 +--- +<p> </p> +<h3 id="Number_物件" name="Number_物件">Number 物件</h3> +<p>The <code>Number</code> 物件具有用於數值常數的屬性,如最大值、非數字、無限大。你不能改變這些屬性的值,你可以如下使用這些屬性︰</p> +<pre>biggestNum = Number.MAX_VALUE +smallestNum = Number.MIN_VALUE +infiniteNum = Number.POSITIVE_INFINITY +negInfiniteNum = Number.NEGATIVE_INFINITY +notANum = Number.NaN +</pre> +<p>你永遠可以如上方式參照預先定義的 <code>Number</code> 物件的屬性,而不是參照你自己建立的 <code>Number</code> 物件的屬性。</p> +<p>下表列出 <code>Number</code> 物件的屬性。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>屬性</th> + <th>說明</th> + </tr> + <tr> + <td>MAX_VALUE</td> + <td>所能表示的最大的數字</td> + </tr> + <tr> + <td>MIN_VALUE</td> + <td>所能表示的最小的數字</td> + </tr> + <tr> + <td>NaN</td> + <td>特殊的 "not a number"(非數字)值</td> + </tr> + <tr> + <td>NEGATIVE_INFINITY</td> + <td>特殊的負無限大的值;溢出時返回</td> + </tr> + <tr> + <td>POSITIVE_INFINITY</td> + <td>特殊的正無限大的值;溢出時返回</td> + </tr> + </tbody> +</table> +<p><small><strong>表 7.2: Number 的屬性</strong></small></p> +<p>Number 的原型提供從 Number 物件取得各種格式的資訊的方法。下表列出 <code>Number.prototype</code> 的方法。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>方法</th> + <th>說明</th> + </tr> + <tr> + <td>toExponential</td> + <td>返回以指數符號表示的數字的字串。</td> + </tr> + <tr> + <td>toFixed</td> + <td>返回以固定小數點表示的數字的字串。</td> + </tr> + <tr> + <td>toPrecision</td> + <td>返回以指定精度的固定小數點表示的數字的字串。</td> + </tr> + <tr> + <td>toSource</td> + <td>返回表示指定的 Number 物件的字面表達。你可以使用這個值來建立新的物件。覆蓋 Object.toSource 方法。</td> + </tr> + <tr> + <td>toString</td> + <td>返回表示指定物件的字串。覆蓋 Object.toString 方法。</td> + </tr> + <tr> + <td>valueOf</td> + <td>返回指定物件的原始值。覆蓋 Object.valueOf 方法。</td> + </tr> + </tbody> +</table> +<p><small><strong>表 7.3: Number.prototype 的方法</strong></small></p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:Math_物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:RegExp_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/regexp_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/regexp_物件/index.html new file mode 100644 index 0000000000..6d26e86067 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/regexp_物件/index.html @@ -0,0 +1,9 @@ +--- +title: RegExp 物件 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/RegExp_物件 +--- +<p> </p> +<h3 id="RegExp_物件" name="RegExp_物件">RegExp 物件</h3> +<p><code>RegExp</code> 物件可讓你運用正規表達式。已在第 4 章中解說過,<a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E9%81%94%E5%BC%8F" title="zh tw/Core JavaScript 1.5 教學#正規表達式">正規表達式</a>。</p> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:Number_物件", "Core_JavaScript_1.5_教學:預先定義的核心物件:String_物件") }}</p> diff --git a/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/string_物件/index.html b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/string_物件/index.html new file mode 100644 index 0000000000..9e18d6ca98 --- /dev/null +++ b/files/zh-tw/orphaned/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/預先定義的核心物件/string_物件/index.html @@ -0,0 +1,88 @@ +--- +title: String 物件 +slug: >- + Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/預先定義的核心物件/String_物件 +--- +<p> </p> +<h3 id="String_物件" name="String_物件">String 物件</h3> +<p><code>String</code> 物件只有一個屬性,<code>length</code>,用來指明字串中的字元數目。例如,下面的代碼把 13 的值代入給 <code>x</code>,因為 "Hello, World!" 有 13 個字元︰</p> +<pre>mystring = "Hello, World!" +x = mystring.length +</pre> +<p><code>String</code> 物件有兩種類型的方法︰一種是返回對字串本身的修改,如 <code>substring</code> 和 <code>toUpperCase</code>,另一種是返回字串的 HTML 格式版本,如 <code>bold</code> 和 <code>link</code>。</p> +<p>舉例來說,延用前面的例子,<code>mystring.toUpperCase()</code> 和 <code>"hello, world!".toUpperCase()</code> 都會返回字串 "HELLO, WORLD!"。</p> +<p><code>substring</code> 方法接受兩個參數,並返回介於兩個參數之間的字串的子集。延用前面的例子,<code>mystring.substring(4, 9)</code> 返回字串 "o, Wo"。參閱 <a class="internal" href="/zh_tw/Core_JavaScript_1.5_%E5%8F%83%E8%80%83" title="zh tw/Core JavaScript 1.5 參考">Core JavaScript 參考</a> 中的 String 物件的 <code>substring</code> 方法,以取得更進一步資訊。</p> +<p><code>String</code> 物件也有大量的針對自動的 HTML 格式化的方法,如 bold 建立粗體文字,link 建立超連結。例如,你可以使用 link 方法建立連結到某個 URL 的超連結,如下︰</p> +<pre>mystring.link("http://www.helloworld.com") +</pre> +<p>下表列出 <code>String</code> 物件的方法。</p> +<table class="fullwidth-table"> + <tbody> + <tr> + <th>方法</th> + <th>說明</th> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/anchor" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/anchor">anchor</a></td> + <td>建立已命名的 HTML 錨點。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/big" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/big">big</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/blink" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/blink">blink</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/bold" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/bold">bold</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/fixed" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/fixed">fixed</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/italics" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/italics">italics</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/small" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/small">small</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/strike" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/strike">strike</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/sub" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/sub">sub</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/sup" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/sup">sup</a></td> + <td>建立 HTML 格式的字串。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/charAt" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/charAt">charAt</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/charCodeAt" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/charCodeAt">charCodeAt</a></td> + <td>返回字串中指定位置的字元或者字元內碼。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/indexOf" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/indexOf">indexOf</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/lastIndexOf" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/lastIndexOf">lastIndexOf</a></td> + <td>返回字串中指定子字串的位置,或指定子字串的最後的位置。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/link" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/link">link</a></td> + <td>建立 HTML 超連結。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/concat" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/concat">concat</a></td> + <td>合併兩個字串的文字,並返回新的字串。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/fromCharCode" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/fromCharCode">fromCharCode</a></td> + <td>從指定的 Unicode 值的序列建構字串。這是 String 類別的方法,而不是 String 實體的。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/split" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/split">split</a></td> + <td>藉由把字串分成子字串的方式,把 String 物件分割成字串的陣列。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/slice" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/slice">slice</a></td> + <td>抽出字串的片斷,並返回新的字串。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/substring" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/substring">substring</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/substr" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/substr">substr</a></td> + <td>以指定的起始或終止索引、或起始索引和長度,返回指定字串的子集。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/match" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/match">match</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace">replace</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/search" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/search">search</a></td> + <td>與正則表達式配合使用。</td> + </tr> + <tr> + <td><a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/toLowerCase" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/toLowerCase">toLowerCase</a>, <a href="/en/Core_JavaScript_1.5_Reference/Global_Objects/String/toUpperCase" title="en/Core_JavaScript_1.5_Reference/Global_Objects/String/toUpperCase">toUpperCase</a></td> + <td>返回全是大寫或全是小寫的字串。</td> + </tr> + </tbody> +</table> +<p><small><strong>表 7.4: String 實體的方法</strong></small></p> +<h3 id="String_Literals_are_Not_String_Objects" name="String_Literals_are_Not_String_Objects">字串的字面表達並不是 String 物件</h3> +<p><code>String</code> 物件只是字串的原始資料類型的包裝而已。別把字串的字面表達和 <code>String</code> 物件相混淆了。例如,下面的代碼建立字串的字面表達 <code>s1</code> 和 String 物件 <code>s2</code>︰</p> +<pre>s1 = "foo" // 建立字串的字面表達值 +s2 = new String("foo") // 建立 String 物件 +</pre> +<p>你可以在字串的字面表達值上呼叫所有的 <code>String</code> 物件的方法—JavaScript 會自動把字串的字面表達轉換成臨時的 <code>String</code> 物件,呼叫其方法,然後丟棄臨時的 <code>String</code> 物件。你也可以在字面表達上使用 <code>String.length</code> 屬性。</p> +<p>你應該使用字串的字面表達,除非你確定需要使用 <code>String</code> 物件,因為 <code>String</code> 物件會有反直覺的行為。例如︰</p> +<pre>s1 = "2 + 2" // 建立字串的字面表達值 +s2 = new String("2 + 2") //建立 String 物件 +eval(s1) // 返回數字 4 +eval(s2) // 返回字串 "2 + 2" +</pre> +<p>{{ PreviousNext("Core_JavaScript_1.5_教學:預先定義的核心物件:RegExp_物件", "Core_JavaScript_1.5_教學:繼承") }}</p> diff --git a/files/zh-tw/orphaned/web/svg/教學/index.html b/files/zh-tw/orphaned/web/svg/教學/index.html new file mode 100644 index 0000000000..5521386506 --- /dev/null +++ b/files/zh-tw/orphaned/web/svg/教學/index.html @@ -0,0 +1,13 @@ +--- +title: 教學 +slug: Web/SVG/教學 +--- +<p> </p> +<p><br> +本教學解說 <a href="/zh_tw/SVG" title="zh tw/SVG">SVG</a>(Scalable Vector Graphics)的 1.1 版本,是一種 W3C XML 的衍伸語言,且已部分實裝於 Firefox 1.5、Opera 8.5 還有其他的瀏覽器。</p> +<p>本教學仍處於<strong>非常</strong>早期的階段。如果可能的話,請幫忙彙整並寫成一、兩個段落。為本教學增添內容!</p> +<h5 id="Introduction" name="Introduction">簡介</h5> +<ul> <li><a href="/zh_tw/SVG/教學/簡介" title="zh tw/SVG/教學/簡介">簡介</a></li> <li><a href="/zh_tw/SVG/教學/起步" title="zh_tw/SVG/教學/起步">起步</a></li> <li>在此增加其他內容</li> <li><a href="/zh_tw/SVG/教學/其他教學" title="zh_tw/SVG/教學/其他教學">其他教學</a></li> +</ul> + +<p>{{ languages( { "en": "en/SVG/Tutorial", "fr": "fr/SVG/Tutoriel", "ja": "ja/SVG/Tutorial", "pl": "pl/SVG/Przewodnik" } ) }}</p> diff --git a/files/zh-tw/orphaned/xpcnativewrapper/index.html b/files/zh-tw/orphaned/xpcnativewrapper/index.html new file mode 100644 index 0000000000..dfd2d74d9d --- /dev/null +++ b/files/zh-tw/orphaned/xpcnativewrapper/index.html @@ -0,0 +1,237 @@ +--- +title: XPCNativeWrapper +slug: XPCNativeWrapper +--- +<p><strong><code>XPCNativeWrapper</code></strong>是一種<a href="/en-US/docs/XPConnect_wrappers">包裝</a>物件讓他可以<a href="/en-US/docs/Safely_accessing_content_DOM_from_chrome">安全的存取特權程式</a>的方法。It can be used in all Firefox versions, though the behavior changed somewhat starting with Firefox 1.5 (Gecko 1.8)。請看<a href="http://kb.mozillazine.org/XPCNativeWrapper"><code>XPCNativeWrapper</code> at the Mozilla knowledgeBase</a>有更多在Firefox 1.5之前的版本的<code>XPCNativeWrapper</code>的行為。這個文件是對Firefox 版本1.5以上的。</p> + + + +<h2 id="XPCNativeWrapper做了什麼?"><code>XPCNativeWrapper</code>做了什麼?</h2> +<p>一個<code>XPCNativeWrapper</code>限制他偽裝之屬性的存取以及物件的方法。惟一經由<code>XPCNativeWrapper</code>存取的屬性與方法是那些定義在IDL中,或是由DOM level 0所定義的(雖然有些DOM level 0的屬性跟方法不能在<code>XPCNativeWrapper</code>中作用)。實務上,經由Javascript所增加的屬性不會被<code>XPCNativeWrapper</code>顯露,and nor are getters and setters defined with <code>__defineGetter__</code> and <code>__defineSetter__</code>。這個目的是要允許對物件的IDL定義方法安全的存取。</p> + + +<p>請確定閱讀know bugs章節,特別是當寫的程式是針對1.5.0.x的firefox版本。</p> + + +<h2 id="Types_of_XPCNativeWrapper">Types of <code>XPCNativeWrapper</code></h2> + +<p>這裡有三種不同類型的<code>XPCNativeWrapper</code>在Firefox 1.5。三種類型都包裝一個可能不安全(possibly-unsafe)的物件以及提供對他的屬性及方法的安全存取。</p> + +<p>三種不同類型的<code>XPCNativeWrapper</code>的行為的差異是由兩個XPCNativeWrpper偽裝器所擁有的特色來決定。一個<code>XPCNativeWrapper</code>可以是明示的Explicit(或是相反的,暗示的Implicit),並且可以是徹底的deep(反之,表面的shallow)。偽裝器創造的類型是由他們被創造的方式所決定,如下:</p> + + +<table> + <colgroup> + <col> + <col> + <col> + </colgroup> + <tbody> + <tr> + <td> + <p>創造</p> + </td> + <td> + <p>明示/暗示</p> + </td> + <td> + <p>徹底/表面</p> + </td> + </tr> + <tr> + <td> + <p>被保護的script存取未信任的物件</p> + </td> + <td> + <p>暗示</p> + </td> + <td> + <p>徹底</p> + </td> + </tr> + <tr> + <td> + <p>由字串參數呼叫的建構元</p> + </td> + <td> + <p>明示</p> + </td> + <td> + <p>表面</p> + </td> + </tr> + <tr> + <td> + <p>由非字串參數所呼叫的建構元</p> + </td> + <td> + <p>明示</p> + </td> + <td> + <p>徹底</p> + </td> + </tr> + </tbody> +</table> + + + +<p><strong>Explicit vs. Implicit</strong></p> +<p>介於explicit與Implicit的<code>XPCNativeWrapper</code>行為的不同是,由非保護的script對Implicit <code>XPCNativeWrapper</code>屬性的存取是不安全的。屬性的存取將經由<code>XPCNativeWrapper</code>的wrappedJSObject被轉交。</p> + + + +<p>這意味著非保護的script不需要擔心關於bug出現因為其他的code會把他們當作是Implicit來處理。換句話說,這些scripts確實需要注意不安全的物件存取。</p> + + + +<p>對explicit的<code>XPCNativeWrapper</code>的屬性存取不論是否由被保護的呼叫者呼叫,都是安全的。</p> + + +<p><strong>Deep vs. Shallow</strong></p> + + +<p>Deep和Shallow的<code>XPCNativeWrapper</code>行為的差異是在於一個deep wrapper的屬性被存取或是函式被呼叫時,傳回值也將會被以他自己的<code>XPCNativeWrapper</code>來包裝。新的<code>XPCNativeWrapper</code>也會是deep並且也會是explicit,若且為若屬性被存取的<code>XPCNativeWrapper</code>是explicit。反之,當被存取的屬性或是函式是用shallow wrapper來呼叫,回傳直也許會是不安全的物件。</p> + + +<p>舉例來說,我們給3個<code>XPCNativeWrapper</code>的實例給同樣的<code>window</code>物件。讓我們叫他們做deepExplicit<code>window</code>,deepImplicit<code>window</code>和shallow<code>window</code>。那我們有:</p> + +<pre>var doc1 = deepExplicitwindow.<code>document</code>; // doc1現在是<code>document</code>物件的一個deep explicit XPCNativeWrapper //存取doc1.open()是安全的 var doc2 = deepImplicitwindow.<code>document</code>; //假如呼叫者有設定.XPCNativeWrappers=yes, 那doc2現在是<code>document</code> object的deep implicit XPCNativeWrapper //否則doc2現在是不安全的<code>document</code> object, 因為屬性存取是簡單的從不安全的window object被傳送 var doc3 = shallowwindow.<code>document</code>; //doc3現在是不安全的<code>document</code> object <strong>創造</strong><strong>XPCNativeWrapper</strong><strong>物件</strong> 有三種創造XPCNativeWrapper的方式;每種方法對應一種類型的XPCNativeWrapper <strong>被保護的</strong><strong>script</strong><strong>存取未信任的物件</strong> 任何時候一個保護的script存取存取一個未信任的物件將會得到一個implicit deep XPCNativeWrapper。從被保護的script存取這個XPCNativeWrapper的屬性是安全的。 一但物件被包裝,一個用這種方式建立的包裝將會逗留(stick around),另外在一行內存取物件兩次也會拿到相同的XPCNativeWrapper 什麼是被保護的script? 在firefox版本1.5到1.5.0.5, 一個script是被保護的或是不被保護是單獨基於他的URI。一個script是被保護的只有當他的URI由已知被保護的前綴開頭;不是由UR被讀取的script(e.g. 由javascript實作的元件)不是被保護的。在Firefox 1.5內被保護的前綴由Chrome Registry決定。 預設<strong>所有的</strong><strong>content package</strong><strong>是被保護的</strong>,這意味著所有的URI開頭是"chrome:// <package name>/content/"(對任何package)是被保護的。單獨的package用flag覆寫在他們的chrome manifest檔案。 從firefox 1.5.0.6開始,Javascript實作的元件是被保護的script。所以一個script不論是由被URI開頭是保護的前綴所讀取或者是Javascript實作的元件都是被保護的。 什麼是未信任的物件? 所有的物件都是信任或是未信任的。一個物件是被信任的假如有以下任何一項: 1.他的parent(Javascript中的_parent_屬性)是一個信任的物件。 2.他是Javascript元件的根範圍(root scope)物件。 3.他是信任的視窗的window物件。</pre> + + + +<p>因為所有的DOM物件有<code>window</code>物件在他的_parent_串裡面,所以他們是被信任的若且唯若他的<code>window</code>是被信任的。</p> +<p>什麼是被信任的<code>window</code>?</p> +<p>一個<code>window</code>物見是否被信任是依據他的容器。一個<code>window</code>是被信任的假如有以下任何一項:</p> +<p>1.他是頂層<code>window</code>(e.g.<xul:<code>window</code>>, <xul:dialog>, 或是某些用命令列flag -chrome被傳送的URI)</p> +<p>2.他的parent是被信任的,且符合以下三種之一:</p> +<p style="margin-left: 1.25cm;">1.他不是在<xul:iframe>或是<xul:browser>中被讀取</p> +<p style="margin-left: 1.25cm;">2.<xul:iframe>或<xul:browser>沒有用type屬性讀取他</p> +<p style="margin-left: 1.25cm;">3.<xul:iframe>或<xul:browser>讀取他的type屬性執不是'content'且沒有用'content-'開頭</p> +<p>注意一個視窗是否是被信任的<strong>不</strong>依據在<code>window</code>被讀取的URI。所以舉例來說,當在<code>window</code>已經是信任的<code>document</code>內,以下將會件創造信任的視窗</p> +<p><xul:browser></p> +<p><xul:browser type=”chrome”></p> +<p><xul:browser type=”rabid_dog”></p> +<p><xul:iframe type=”foofy”></p> +<p><html:iframe></p> +<p><html:iframe type=”content”></p> +<p>以下不會建立信任的<code>window</code>s:</p> +<p><xul:browser type=”content”></p> +<p><html:iframe type=”content_primary”></p> +<p>進一步注意任何未信任的<code>window</code>的child <code>window</code>自動是未信任的。</p> +<p>當script存取物件時什麼會發生?</p> +<p>下面這個表描述當一個script存取物件時會發生什麼,以及偽裝器是如何的參與。</p> +<table> + <colgroup> + <col> + <col> + <col> + </colgroup> + <tbody> + <tr> + <td> + <p>Script</p> + </td> + <td> + <p>Object</p> + </td> + <td> + <p>Effects</p> + </td> + </tr> + <tr> + <td> + <p>保護的</p> + </td> + <td> + <p>信任的</p> + </td> + <td> + <p>沒有偽裝器被創造,所以script可以完全存取Object</p> + </td> + </tr> + <tr> + <td> + <p>保護的</p> + </td> + <td> + <p>未信任的</p> + </td> + <td> + <p>Implicit deep <code>XPCNativeWrapper</code>被建立</p> + </td> + </tr> + <tr> + <td> + <p>未保護的</p> + </td> + <td> + <p>信任的</p> + </td> + <td> + <p>沒有偽裝器被建立,就像protected/trusted的狀況</p> + </td> + </tr> + <tr> + <td> + <p>未保護的</p> + </td> + <td> + <p>未信任的</p> + </td> + <td> + <p>沒有偽裝器被建立,就像protected/trusted的狀況</p> + </td> + </tr> + </tbody> +</table> +<p><strong>使用<code>XPCNativeWrapper</code></strong><strong>建構元</strong></p> +<p>以上描述,預設在新的Firefox版本<code>XPCNativeWrapper</code>被自動建立。你不需要使用<code>XPCNativeWrapper</code>建構元,除非你打算讓你的code用在舊版本的瀏覽器或者你關閉了<code>XPCNativeWrapper</code>。</p> +<p>用字串參數呼叫<code>XPCNativeWrapper</code>建構元</p> +<p>舉例來說:</p> +<p>var contentWinWrapper = new <code>XPCNativeWrapper</code>(content, '<code>document</code>');</p> +<p>這會創造出一個explicit shallow <code>XPCNativeWrapper</code>。這語法被保留為了Firefox 1.5之前的相容性。當contentWinWrapper所有的屬性可以被安全的存取,這些屬性的回傳值不是安全的去存取(就像在版本小於Firefox 1.5裡),因為<code>XPCNativeWrapper</code>是shallow。所以去比較內容文件標題到現在的內容區段,必須要:</p> +<p>var winWrapper = new <code>XPCNativeWrapper</code>(content, '<code>document</code>', 'getSelection()');</p> +<p>var docWrapper = new <code>XPCNativeWrapper</code>(winWrapper.<code>document</code>, 'title');</p> +<p>return docWrapper.title == winWrapper.getSelection();</p> +<p>沒有字串參數呼叫<code>XPCNativeWrapper</code>建構元</p> +<p>舉例來說:</p> +<p>var contentWinWrapper = new <code>XPCNativeWrapper</code>(content);</p> +<p>這創造了explicit deep <code>XPCNativeWrapper</code>。<code>XPCNativeWrapper</code>存取屬性是安全的,並且回傳值也將會是用explicit deep <code>XPCNativeWrapper</code>包裝的物件。</p> +<p>(譯注: 可參閱http://kb.mozillazine.org/<code>XPCNativeWrapper</code>)</p> +<p><strong><code>XPCNativeWrapper</code>生命週期</strong></p> +<p>Explicit <code>XPCNativeWrapper</code>物件存在當他們被參考到。建立一個新的explicit <code>XPCNativeWrapper</code>給一樣的可能不安全的物件將會建立一個新的偽裝器物件;當設定'expando'參數時,有時要注意。</p> +<p>Implicit <code>XPCNativeWrapper</code>物件跟他包裝的物件有相同的生命週期。</p> +<p><strong>設定<code>XPCNativeWrapper</code></strong><strong>的expando</strong><strong>屬性</strong></p> +<p>為<code>XPCNativeWrapper</code>物件設定expando屬性是可能的。假如這樣做了,那chrome將可以看到他們expando屬性,但內容不行。沒有安全的方式從chrome去設定expando屬性並且讓他從content可讀取。</p> +<p>存取不安全的屬性</p> +<p>假如為了某些理由,不安全的屬性存取是必要的,這可以經由偽裝器的wrappedJSObject屬性去來完成。舉例,假如docWrapper是一個doc的偽裝器,那</p> +<p>docWrapper.wrappedJSObject.prop</p> +<p>等同於</p> +<p>doc.prop</p> +<p>就像這節的名稱,這樣做是<strong>不安全</strong>的。你不因該使用wrappedJSObject去傳遞<code>XPCNativeWrapper</code>在產品的code裡面。</p> +<p>在firefox3,wrappedJSObject回傳另外一個包覆JS Object的偽裝器(XPCSafeJSObjectWrapper),這允許你安全的觀察內容物件。請見XPCSafeJSObjectWrapper。</p> +<p>請見Interaction between privileged and non-priviledged pages有另外更好的。</p> +<p><strong>已知Bugs</strong></p> +<p>在1.5.0.x版本有兩個已知的bug在<code>XPCNativeWrapper</code></p> +<p>1.Firefox versions 1.5 through 1.5.0.4 have <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=337095">bug 337095</a>, which causes wrappers to not be created for protected scripts in some cases. Specifically, if a protected script makes a property access or function call that returns an untrusted object, a wrapper will be created. However, if a function in a protected script is called from C++ and an untrusted object is passed as an argument to this function, a wrapper will <strong>not</strong> be created. Functions that expect to be called in this way need to <a href="/en-US/docs/XPCNativeWrapper#XPCNativeWrapper_constructor_call_with_no_string_arguments">do their own wrapping</a>. This bug is fixed in Firefox 1.5.0.5 and later.</p> +<p>2.Firefox versions 1.5 through 1.5.0.5 have <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=345991">bug 345991</a>, which causes components written in JavaScript to not be protected scripts. This bug is fixed in Firefox 1.5.0.6 and later.</p> +<p><strong><code>XPCNativeWrapper</code>的限制</strong></p> +<p>這裡有一些不能被用在<code>XPCNativeWrapper</code>的一般使用的屬性跟程式風格。</p> +<p>1.對一個DOM node或是<code>window</code>物件的<code>XPCNativeWrapper</code>給予或是讀取一個on*屬性將會丟出Exception。(使用addEventListener取代,並且用event.preventDefault();在你的處理器內假如你之前用了return false;)</p> +<p>2.不能夠在<code>XPCNativeWrapper</code>內用<code>window</code>名稱存取iframe(e.g. <code>window</code>.framename)。</p> +<p>3.<code>document</code>.all 在<code>XPCNativeWrapper</code>內不能用。</p> +<p>4.在<code>XPCNativeWrapper</code>內不行對HTML文件用name存取命名的東西。舉例,假如你有<form name=”foo”>並且docWrapper是一個對HTML文件doc的偽裝器,那當docWrapper為定義時,doc.foo是一個HTMLFormElement。希望這樣做的程式能夠使用docWrapper.forms.namedItem('foo')取代。</p> +<p>5.對HTML文件,在<code>XPCNativeWrapper</code>內用id存取node是不行的。因該用getElementById()取代。</p> +<p>6.對HTML form,在<code>XPCNativeWrapper</code>內用name存取input是不行的。想這樣做的程式必須使用form.elements.namedItem('foo')取代。</p> +<p>7.對HTMLCollection,在<code>XPCNativeWrapper</code>內用name存取元素是步行的。想這樣做的程式碼必須使用namedItem()方法。注意這個namedItem只回傳第一個有name的input元素,即使有很多個有相同名稱的元素(e.g. Radio buttons)。</p> +<p>8.同樣的,對plugin、pluginArray、或是MimeTypeArray,在<code>XPCNativeWrapper</code>內用name存取items是不行的。你必須使用namedItem()取代。</p> +<p>9.不能經由<code>XPCNativeWrapper</code>呼叫由NPAPI plugin實作的方法。</p> +<p>10.不能夠經由<code>XPCNativeWrapper</code>取得(getting)或是設定(setting)由NPAPI plugin實作的屬性。</p> +<p>11.不能夠經由<code>XPCNativeWrapper</code>呼叫經由XBL binding附加到node上的方法。</p> +<p>12.不能夠經由<code>XPCNativeWrapper</code>取得(getting)或是設定(setting)經由XBL binding附加到node上的屬性。</p> +<p>13.經由'for(var p in wrapper)'列舉<code>XPCNativeWrapper</code>的屬性不會列舉IDL定義的屬性。</p> +<p>14.Object.prototype不在<code>XPCNativeWrapper</code>的原型鍊裡面。As a result,變異的Object.prototype被定義在<code>XPCNativeWrapper</code>(更準確一點,這裡有__proto__,__parent__,__count__,toSource,toLocalString,valueOf,watch,unwatch,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,<code>__defineGetter__</code>,<code>__defineSetter__</code>,__lookupGetter__,and__lookupSetter__)。</p> +<p>15.沒有實作舊的<code>XPCNativeWrapper</code>有的importXPCNative,</p> +<p>16.不能經由<code>XPCNativeWrapper</code>存取標準類別(例如Function)。要對特定的<code>window</code>的parent建立function和物件,使用<code>window</code>的eval() function。</p> +<p>17.對'expando'的屬性使用刪除操作元在<code>XPCNativeWrapper</code>會丟出安全性Exceprion。</p> diff --git a/files/zh-tw/orphaned/zh-tw/index.html b/files/zh-tw/orphaned/zh-tw/index.html new file mode 100644 index 0000000000..87489b35a7 --- /dev/null +++ b/files/zh-tw/orphaned/zh-tw/index.html @@ -0,0 +1,5 @@ +--- +title: zh-tw +slug: zh-tw +--- +This page was auto-generated because a user created a sub-page to this page. diff --git a/files/zh-tw/orphaned/參與_mozilla_專案/index.html b/files/zh-tw/orphaned/參與_mozilla_專案/index.html new file mode 100644 index 0000000000..ebd327fa1d --- /dev/null +++ b/files/zh-tw/orphaned/參與_mozilla_專案/index.html @@ -0,0 +1,10 @@ +--- +title: 參與 Mozilla 專案 +slug: 參與_Mozilla_專案 +--- +<p>如果你對幫忙修正錯誤有興趣,並以各種方式致力於 Mozilla 平台的代碼的話,這裡可以找到很多文件,並指引你往正確的方向走。</p> +<table class="mainpage-table"> <tbody> <tr> <td> <h2 id="一般性主題">一般性主題</h2> +<dl> <dt><a class="internal" href="/En/Developer_Guide" title="en/Mozilla developer guide">Mozilla 開發者教學</a></dt> <dd>提供給奉獻於 Mozilla 基礎代碼的開發提示和教學。</dd> <dt><a class="internal" href="/En/Developer_Guide/Source_Code" title="en/Mozilla source code">Mozilla 原始碼</a></dt> <dd>關於如何取得 Mozilla 代碼,不論是下載或透過版本控制,以及如何把你的代碼引入這棵樹的資訊。</dd> <dt><a class="internal" href="/En/Developer_Guide/Build_Instructions" title="En/Build Documentation">建置文件</a></dt> <dd>關於如何建置 Mozilla 專案的資訊,包括 Firefox 和 Thunderbird。<em>本頁需要整理。</em></dd> <dt><a class="internal" href="/En/The_Mozilla_platform" title="En/The Mozilla platform">Mozilla 平台</a></dt> <dd>關於 Mozilla 平台的資訊,包含所有的 API 和技術,以及如何在你的專案中使用這些。</dd> <dt><a class="internal" href="/Project:zh_tw/%E5%A6%82%E4%BD%95%E5%8D%94%E5%8A%A9" title="Project:zh tw/如何協助">Mozilla 的文件化</a></dt> <dd>為了 Mozilla,也為了開放式 Web,幫助我們建立並改善我們的文件。</dd> <dt><a class="internal" href="/En/Debugging" title="en/Debugging">除錯</a></dt> <dd>在對 Mozilla 代碼進行除錯時的有用提示和方針。</dd> <dt><a class="internal" href="/en/QA" title="en/QA">品質保證</a></dt> <dd>關於測試和錯誤追蹤的資訊。</dd> <dt><a class="internal" href="/zh_tw/%E6%9C%AC%E5%9C%B0%E5%8C%96" title="zh tw/本地化">本地化</a></dt> <dd>關於翻譯 Mozilla 專案、文件至各種語言的資訊。</dd> +</dl><h2 id="專案頁面">專案頁面</h2> <dl> <dt><a class="internal" href="/en/Thunderbird" title="en/Thunderbird">Thunderbird</a></dt> <dd>Mozilla 的電子郵件客戶端</dd> <dt><a class="internal" href="/en/Calendar" title="en/Calendar">Sunbird</a></dt> <dd>Mozilla 的月曆專案</dd> </dl> </td> <td> <h2 id="工具">工具</h2> <dl> <dt><a class="link-https" href="https://bugzilla.mozilla.org/" title="https://bugzilla.mozilla.org/">Bugzilla</a></dt> <dd>為 Mozilla 專案追蹤問題的 <a class="internal" href="/en/Bugzilla" title="En/Bugzilla">Bugzilla</a> 資料庫。</dd> <dt><a class="external" href="http://mxr.mozilla.org/" title="http://mxr.mozilla.org/">MXR</a></dt> <dd>在 Web 上瀏覽並搜尋 Mozilla 原始碼資料處。</dd> <dt><a class="external" href="http://bonsai.mozilla.org/cvsqueryform.cgi" title="http://bonsai.mozilla.org/cvsqueryform.cgi">Bonsai</a></dt> <dd><a class="internal" href="/en/Bonsai" title="En/Bonsai">Bonsai</a> 工具讓你在資料處找出是誰修改了這些檔案,以及他們做了什麼。</dd> <dt><a class="external" href="http://tinderbox.mozilla.org/showbuilds.cgi" title="http://tinderbox.mozilla.org/showbuilds.cgi">Tinderbox</a></dt> <dd><a class="internal" href="/en/Tinderbox" title="En/Tinderbox">Tinderbox</a> 顯示這棵樹的狀態(不論目前是否可以建置)。在登記和登出之前先檢查這裡,以確保你是和作業樹一起協作。</dd> <dt><a class="internal" href="/en/Crash_reporting" title="en/Crash reporting">崩潰追蹤</a></dt> <dd>關於 <a class="link-https" href="https://crash-reports.mozilla.com/reports" title="https://crash-reports.mozilla.com/reports">Socorro</a> 和 <a class="external" href="http://talkback-public.mozilla.org/search/start.jsp" title="http://talkback-public.mozilla.org/search/start.jsp">Talkback</a> 崩潰回報系統的資訊。</dd> <dt><a class="external" href="http://graphs.mozilla.org/" title="http://graphs.mozilla.org/">效能追蹤</a></dt> <dd>檢視 Mozilla 專案的效能資訊。</dd> <dt><a class="external" href="http://www.mozilla.org/community/developer-forums.html" title="http://www.mozilla.org/community/developer-forums.html">開發者論壇</a></dt> <dd>有各種特定主題的討論列表的論壇,此處你可以交流有關 Mozilla 開發上的問題。</dd> </dl> </td> </tr> </tbody> +</table> +<p> {{ languages( { "en": "en/Participating_in_the_Mozilla_project", "zh-cn": "cn/Participating_in_the_Mozilla_project", "ja": "ja/Participating_in_the_Mozilla_project"} ) }}</p> diff --git a/files/zh-tw/orphaned/建立擴充套件/index.html b/files/zh-tw/orphaned/建立擴充套件/index.html new file mode 100644 index 0000000000..4d6c1c5acf --- /dev/null +++ b/files/zh-tw/orphaned/建立擴充套件/index.html @@ -0,0 +1,6 @@ +--- +title: 建立擴充套件 +slug: 建立擴充套件 +--- +<p>建立擴充套件 +</p> |