<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaScript &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Tue, 26 Jul 2022 01:32:06 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>JavaScript &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android 2.3 @JavascriptInterface Issue</title>
		<link>https://noter.tw/3202/android-2-3-javascriptinterface-issue/</link>
					<comments>https://noter.tw/3202/android-2-3-javascriptinterface-issue/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 28 Mar 2014 12:25:25 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[@JavascriptInterface]]></category>
		<category><![CDATA[addJavascriptInterface]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3202</guid>

					<description><![CDATA[<p>JavascriptInterface 這個問題相信 Google 一下就可以找到很多文章，雖然如此小蛙還是試了好久才成功，這篇文章記錄一下當時小蛙不成功的盲點在哪裡。上一篇文章「Android 與 &#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3202/android-2-3-javascriptinterface-issue/" data-wpel-link="internal">Android 2.3 @JavascriptInterface Issue</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>JavascriptInterface 這個問題相信 Google 一下就可以找到很多文章，雖然如此小蛙還是試了好久才成功，這篇文章記錄一下當時小蛙不成功的盲點在哪裡。上一篇文章「<a href="https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Android 與 WebView 中的 Javascript 相互溝通</a>」記錄怎麼讓 Android 與 Javascript 相互溝通。</p>



<span id="more-3202"></span>



<p>小蛙在實作 WebView 載入的網頁與 Android 互動時，一直都以手邊的 Nexus 7 2013 來做測試，直到所有功能都已就緒，有一天突然想起之前好像有看到 Javascript 在 2.3.x 會出現錯誤的問題，於是開了 2.3 版本的 emulator 來做測試，由於小蛙實作的部分是從 Javascript 呼叫某一個 function 來實作開啟行事曆的功能，這邊發生了大概類似下面的這種錯誤(小蛙的錯誤訊息已經洗掉了，以下內容來字<a href="http://twigstechtips.blogspot.tw/2013/09/android-webviewaddjavascriptinterface.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">參考資料1<span class="wpel-icon wpel-image wpel-icon-6"></span></a>)</p>



<pre class="wp-block-preformatted withcode">JNI WARNING: jarray 0xb5d256f0 points to non-array object (Ljava/lang/String;)
"WebViewCoreThread" prio=5 tid=8 NATIVE
  | group="main" sCount=0 dsCount=0 obj=0xb5cfc348 self=0x8234e98
  | sysTid=2023 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=136531904
  at android.webkit.WebViewCore.nativeTouchUp(Native Method)
  at android.webkit.WebViewCore.nativeTouchUp(Native Method)
  at android.webkit.WebViewCore.access$3300(WebViewCore.java:53)
  at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:1162)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:130)
  at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:633)
  at java.lang.Thread.run(Thread.java:1019)
VM aborting</pre>



<p>對於這個問題，<a href="http://twigstechtips.blogspot.tw/2013/09/android-webviewaddjavascriptinterface.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">參考資料1 <span class="wpel-icon wpel-image wpel-icon-6"></span></a>的作者將 JavascriptInterface 整理成一個比較完整的 solution，不過因為教學文章「漏漏長」，所以小蛙後來沒有採用這個方案，雖然方案不同，不過解決這個問題的邏輯是差不多的。</p>



<p>小蛙後來使用了<a href="http://fred-zone.blogspot.tw/2011/12/android-23x-javascript-interface.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">參考資料2<span class="wpel-icon wpel-image wpel-icon-6"></span></a>的方法來解決，這邊大概記錄一下作法 (不知道怎麼讓 Android 與 Javascript 互通的話可參考「<a href="https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Android 與 WebView 中的 Javascript 相互溝通 @ 蛙齋</a>」)：</p>



<p><strong>檢查 Android 版本</strong></p>



<p>設定參數來記錄 Android 版本是否為 2.3.x</p>



<pre class="wp-block-preformatted withcode">private static JavaScriptInterface JSInterface;
// 設置 javascriptInterfaceBroken 來判斷是否為 2.3.x
private static boolean javascriptInterfaceBroken = false;
public static WebView wv;
try {
        if (Build.VERSION.RELEASE.contains("2.3.")) {
                javascriptInterfaceBroken = true;
        }
} catch (Exception e) { }
JSInterface = new JavaScriptInterface(getActivity());</pre>



<p><strong>依照版本設定對應動作</strong></p>



<pre class="wp-block-preformatted withcode">if(!javascriptInterfaceBroken){
    // 非 2.3.x 版本，正常執行
    wv.addJavascriptInterface(JSIterface, "JSInterface");
    ...
}else{
    // 2.3.x 版本
    wv.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url){
        super.onPageFinished(view, url);
        String handleGingerbreadStupidity =
                "javascript:function addToNotify(title, url, start, end) { window.location='http://JSInterface:addToNotify:'+(title)+'◎'+(url)+'◎'+(start)+'◎'+(end); }; "
                + "javascript: function handler() { this.addToNotify=addToNotify }; "
                + "javascript: var JSInterface = new handler();";
                view.loadUrl(handleGingerbreadStupidity);
        }
        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
            if (url.contains("JSInterface:addToNotify")) {
                // 在這邊可用 regular expression 把剛剛組出來的 url 解回
                                // 須注意如果有中文的話，字串要先從 ISO-8859-1 轉回 UTF-8
                String nUrl = new String(url.getBytes("ISO-8859-1"), "UTF-8");
                String title = "title";
                String desc = "desc";
                String start = "start";
                String end = "end";
                try {
                    Method sMethod = JSInterface.getClass().getMethod("addToNotify", new Class[] { String.class, String.class, String.class, String.class });
                    sMethod.invoke(JSInterface, title, desc, start, end);
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
            return true;
        }
    });
}</pre>



<p>上述程式碼中有幾個部份小蛙提出來記錄：</p>



<p>handleGingerbreadStupidity 字串中的 addToNotify 改成自己的方法名稱；JSInterface 改成自己的 JavaScriptInterface 名稱；後面參數有幾個都用「:」連接，因為小蛙的參數中有冒號會跟原本的冒號混淆，導致要拆出字串的時候很麻煩，因此這邊改成用「◎」來區隔。</p>



<p>shouldOverrideUrlLoading 會接收到從 onPageFinished 過來的 url，接著判斷如果包含剛剛我們自己組合的字串的話，就使用 reflection 的方式來呼叫對應方法。JSInterface.getClass().getMethod 中的 JSInterface 是開頭宣告的 JavaScriptInterface 的物件名稱，getMethod 第一個參數為呼叫的方法名稱，第二個參數是傳入的參數型別，都設定好之後就用 sMethod.invoke 呼叫該方法並傳入需要的物件及參數。</p>



<p>記錄的有點亂，小蛙當時卡在 onPagefinished 中傳參數的部分，因為內容包含了冒號導致發生一些問題；再來是 getMethod 方法不太會用，卡了一段時間 &#8230;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3202/android-2-3-javascriptinterface-issue/" data-wpel-link="internal">Android 2.3 @JavascriptInterface Issue</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3202/android-2-3-javascriptinterface-issue/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android 與 WebView 中的 Javascript 相互溝通</title>
		<link>https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/</link>
					<comments>https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 28 Mar 2014 12:25:19 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[addJavascriptInterface]]></category>
		<category><![CDATA[Uncaught TypeError: Object [object Object] has no method]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[@JavascriptInterface]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3204</guid>

					<description><![CDATA[<p>最近的一個 app 需要讓 Android 可以呼叫 WebView 中的 Javascript，並且按下 WebView 中的按鈕時，也可以呼叫 Android 內部的方法，這篇文章記錄一下大概的做&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/" data-wpel-link="internal">Android 與 WebView 中的 Javascript 相互溝通</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>最近的一個 app 需要讓 Android 可以呼叫 WebView 中的 Javascript，並且按下 WebView 中的按鈕時，也可以呼叫 Android 內部的方法，這篇文章記錄一下大概的做法，免得下次遇到又忘記 &#8230;<br />
<span id="more-3204"></span><br />
這個 app 需要做到的功能很簡單，在 Android 端希望可以點選「字體放大」、「字體縮小」的按鈕來呼叫 WebView 中的 Javascript；並且點選 WebView 中的行事曆按鈕後，可以開啟 Android 內建的 Google 行事曆。</p>
<ul>
<li>
<h5>Android 呼叫 WebView 中的 Javascript</h5>
</li>
</ul>
<p>透過 Android 本身的按鈕來達到呼叫 Javascript 的功能很簡單，以小蛙的例子是用 fragment 中放置一個 WebView</p>
<div>
<div id="highlighter_456521" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java comments">// 取得 WebView 物件</code></div>
<div class="line number2 index1 alt1"><code class="java plain">WebView wv = (WebView) v.findViewById(R.id.webView1);</code></div>
<div class="line number3 index2 alt2"><code class="java comments">// 設定此 WebView 支援 Javascript</code></div>
<div class="line number4 index3 alt1"><code class="java plain">wv.getSettings().setJavaScriptEnabled(</code><code class="java keyword">true</code><code class="java plain">);</code></div>
<div class="line number5 index4 alt2"><code class="java comments">// 取得按鈕物件</code></div>
<div class="line number6 index5 alt1"><code class="java plain">Button b = (Button) v.findViewById(R.id.button1);</code></div>
<div class="line number7 index6 alt2"><code class="java plain">b.setOnClickListener(</code><code class="java keyword">new</code> <code class="java plain">View.OnClickListener() {</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">    </code><code class="java color1">@Override</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onClick(View v) {</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">                </code><code class="java plain">wv.loadUrl(</code><code class="java string">"javascript:fontSize('+')"</code><code class="java plain">);</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number12 index11 alt1"><code class="java plain">});</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>上面的程式碼只寫出個大概，取得 WebView 後設定支援 Javascript，並且設定按鈕來執行 Javascript，上面例子小蛙 WebView 中有一個字體放大的 Javascript 叫做 fontSize(&#8216;+&#8217;)，因此直接使用 wv.loadUrl(&#8216;要呼叫的 Javascript&#8217;); 即可！</p>
<ul>
<li>
<h5>從 WebView 呼叫 Android Function</h5>
</li>
</ul>
<p>這個部分就比較複雜一些些，首先必須先建立一個 JavascriptInterface 物件，設定好要執行的相對應功能。例如：</p>
<div>
<div id="highlighter_626920" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">JavaScriptInterface {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">       </code><code class="java keyword">private</code> <code class="java plain">Activity activity;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">       </code><code class="java keyword">public</code> <code class="java plain">JavaScriptInterface(Activity activiy) {</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">               </code><code class="java keyword">this</code><code class="java plain">.activity = activiy;</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">       </code><code class="java plain">}</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">       </code><code class="java color1">@JavascriptInterface</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">       </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">showToast(){</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">               </code><code class="java plain">Toast.makeText(activity, </code><code class="java string">"我被從WebView呼叫了"</code><code class="java plain">, Toast.LENGTH_SHORT).show();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">       </code><code class="java plain">}</code></div>
<div class="line number10 index9 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>這邊要注意的是如果 targetSdkVersion 設定為 17 以上，就必須在每個可以被 Javascript 呼叫的方法前面加上 @JavascriptInterface，否則會出現以下錯誤</p>
<div>
<div id="highlighter_751180" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java plain">Uncaught TypeError: Object [object Object] has no method </code><code class="java string">'showToast'</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>將設定好的 JavaScriptInterface 設定給 WebView 物件</p>
<div>
<div id="highlighter_558003" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java plain">wv.addJavascriptInterface(</code><code class="java keyword">new</code> <code class="java plain">JavaScriptInterface(getActivity()), </code><code class="java string">"JSInterface"</code><code class="java plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>後面的參數名字可以自己取，小蛙這邊使用 JSInterface，這個名字是讓 Javascript 可以知道透過哪個物件來呼叫。Android 這邊完成後接著在 html 中加入相對應的動作，例如：</p>
<div>
<div id="highlighter_659373" class="syntaxhighlighter  html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">&lt;</code><code class="html keyword">input</code> <code class="html color1">type</code><code class="html plain">=</code><code class="html string">'button'</code> <code class="html color1">value</code><code class="html plain">=</code><code class="html string">'按我'</code> <code class="html color1">onclick</code><code class="html plain">=</code><code class="html string">'javascript:showToast();'</code><code class="html plain">&gt;</code></div>
<div class="line number2 index1 alt1"><code class="html plain">&lt;</code><code class="html keyword">script</code> <code class="html color1">type</code><code class="html plain">=</code><code class="html string">'text/javascript'</code><code class="html plain">&gt;</code></div>
<div class="line number3 index2 alt2"><code class="html plain">function showToast(){</code></div>
<div class="line number4 index3 alt1"><code class="html spaces">    </code><code class="html plain">if(JSInterface)</code></div>
<div class="line number5 index4 alt2"><code class="html spaces">        </code><code class="html plain">JSInterface.showToast();</code></div>
<div class="line number6 index5 alt1"><code class="html plain">}</code></div>
<div class="line number7 index6 alt2"><code class="html plain">&lt;/</code><code class="html keyword">script</code><code class="html plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>設定一個 button 讓使用者點選時執行 function showToast()，而 showToast 方法中倘若存在 JSInterface 物件 (這個物件是上面 wv.addJavascriptInterface 時設定的)，就執行 JSInterface.showToast() 的方法 (這一步就會對應到我們自訂的 JavaScriptInterface 類別中的 public void showToast())，在 app 中顯示 Toast 訊息。<br />
到這邊，從 Android 呼叫 Javascript 以及從 Javascript 呼叫 Android 方法都已經完成，但是在 Android 2.3.x 版本中會發生一些錯誤，造成當機無法正確執行，解決方法請參考 <a href="https://noter.tw/3202/android-2-3-javascriptinterface-issue/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Android 2.3 @JavascriptInterface Issue</a>。</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/" data-wpel-link="internal">Android 與 WebView 中的 Javascript 相互溝通</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3204/android-%e8%88%87-webview-%e4%b8%ad%e7%9a%84-javascript-%e7%9b%b8%e4%ba%92%e6%ba%9d%e9%80%9a/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>jQuery $(document).ready()</title>
		<link>https://noter.tw/2301/jquery-document-ready/</link>
					<comments>https://noter.tw/2301/jquery-document-ready/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 25 Sep 2012 14:05:22 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[$.ready()]]></category>
		<category><![CDATA[$(document).ready()]]></category>
		<category><![CDATA[DOM]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2301</guid>

					<description><![CDATA[<p>前陣子跟新同事聊天的時候聊到，$(document).ready(function(){}});的問題，有同事就舉了個例子來說明，其實小蛙沒有真正去研究過為什麼要寫這個，只知道「寫了比較保險」，聽過例&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2301/jquery-document-ready/" data-wpel-link="internal">jQuery $(document).ready()</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前陣子跟新同事聊天的時候聊到，$(document).ready(function(){}});的問題，有同事就舉了個例子來說明，其實小蛙沒有真正去研究過為什麼要寫這個，只知道「寫了比較保險」，聽過例子之後恍然大悟，原來有這麼一層原因在。 </p>



<span id="more-2301"></span>



<pre class="left red">$(document).ready(function(){}});</pre>



用最最白話的方式來說，就是說<mark class="pink-solid">當整個HTML元素都被載入之後，才開始做以下動作</mark>。咦？還是覺得不重要？同事舉了一個簡單的例子



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">&lt;html&gt;
&nbsp;&nbsp;&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type="text/javascript" src="jquery-1.8.2.min.js"&gt;&lt;/script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type="text/javascript"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert($('#mydiv').text());
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;/head&gt;
&nbsp;&nbsp;&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="mydiv"&gt;mydiv&lt;/div&gt;
&nbsp;&nbsp;&lt;/body&gt;
&lt;/html&gt;</pre>



<p>上面的例子執行後會發現，alert出來空白的東西，並不符合我們的預期，預期應該要印出mydiv的字樣。如果把alert包在$(function(){}});裡面試試 </p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">&lt;html&gt;
&nbsp;&nbsp;&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type="text/javascript" src="jquery-1.8.2.min.js"&gt;&lt;/script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type="text/javascript"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(function(){alert($('#mydiv').text());});
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;/head&gt;
&nbsp;&nbsp;&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="mydiv"&gt;mydiv&lt;/div&gt;
&nbsp;&nbsp;&lt;/body&gt;
&lt;/html&gt;</pre>



<p>就如同預期的印出 mydiv 字樣了！會造成這個結果的原因是，head部分的JS程式碼在整個網頁還沒完整載入前就已經先執行，因此找不到 mydiv 這個 DOM 元素，而將alert程式碼放在 $(function(){}); 之中，等到整個網頁元素載入完成後才執行，自然就可以找到 mydiv 這個元素而印出當中的值了。其實這部分應該算是JavaScript基礎班，小蛙真是覺得不太好意思。 </p>



<p>附帶一提，小蛙為什麼有時候忘記加$(function(){});也還是可以正常執行呢？是因為小蛙習慣把JavaScript寫在網頁的最後，如果沒有&#8221;意外&#8221;的話，會是可以正常執行的(寫$(function(){});是好習慣！記下來吧！)。例如： </p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">&lt;html&gt;
&nbsp;&nbsp;&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type="text/javascript" src="jquery-1.8.2.min.js"&gt;&lt;/script&gt;
&nbsp;&nbsp;&lt;/head&gt;
&nbsp;&nbsp;&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="mydiv"&gt;mydiv&lt;/div&gt;
&nbsp;&nbsp;&lt;/body&gt;
&lt;/html&gt;
&lt;script type="text/javascript"&gt;
&nbsp;&nbsp;alert($('#mydiv').text());
&lt;/script&gt;</pre>



<p>另外在 <strong><a rel="noreferrer noopener nofollow external" aria-label=" (在新分頁中開啟)" href="http://api.jquery.com/ready/" target="_blank" data-wpel-link="external" class="wpel-icon-right">jQuery官網<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong> 中提到 </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p> All three of the following syntaxes are equivalent:<br> <code>$(document).ready(handler)</code><br> <code>$().ready(handler)</code>&nbsp;(this is not recommended)<br> <code>$(handler)</code> </p></blockquote>



<p>也就是說$(document).ready(function(){}); 可以縮寫成 $(function(){}});，這兩個是一樣的意思(既然一樣，為什麼不選短的來用呢 @@?) </p>



<p>更多內容可參考<strong><a rel="noreferrer noopener nofollow external" href="http://api.jquery.com/ready/" target="_blank" data-wpel-link="external" class="wpel-icon-right"> jQuery 官網<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong> 或 <strong><a rel="noreferrer noopener nofollow external" href="https://groups.google.com/forum/?fromgroups=#!topic/jquery-/Ht6r9hTsCVs" target="_blank" data-wpel-link="external" class="wpel-icon-right">此討論串<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>。 </p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2301/jquery-document-ready/" data-wpel-link="internal">jQuery $(document).ready()</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2301/jquery-document-ready/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JavaScript 重新整理頁面</title>
		<link>https://noter.tw/2297/javascript%e9%87%8d%e6%96%b0%e6%95%b4%e7%90%86%e9%a0%81%e9%9d%a2/</link>
					<comments>https://noter.tw/2297/javascript%e9%87%8d%e6%96%b0%e6%95%b4%e7%90%86%e9%a0%81%e9%9d%a2/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 19 Sep 2012 12:00:30 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[refresh]]></category>
		<category><![CDATA[reload]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2297</guid>

					<description><![CDATA[<p>突然發現蛙齋的JavaScript分類中的文章只有三篇，但對於小蛙的工作來說JavaScript也算是重要的一環，還是記錄一下以後查找方便。這篇主要是記錄網路上查到的一些關於「重新整理頁面」的資料。 &#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2297/javascript%e9%87%8d%e6%96%b0%e6%95%b4%e7%90%86%e9%a0%81%e9%9d%a2/" data-wpel-link="internal">JavaScript 重新整理頁面</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>突然發現蛙齋的JavaScript分類中的文章只有三篇，但對於小蛙的工作來說JavaScript也算是重要的一環，還是記錄一下以後查找方便。這篇主要是記錄網路上查到的一些關於「重新整理頁面」的資料。<br />
<span id="more-2297"></span><br />
在《<strong><a href="http://blog.yam.com/htshboy/article/12692684" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Javascript刷新頁面的幾種方法 @ 玲瓏天空<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>》一開頭就直接寫明了重新整理頁面的方法，整篇文章也很細心的列出一些常用的情況。</p>
<blockquote><p><strong>Javascript刷新頁面的幾種方法：</strong><br />
1&nbsp;&nbsp; history.go(0)<br />
2&nbsp;&nbsp; location.reload()<br />
3&nbsp;&nbsp; location=location<br />
4&nbsp;&nbsp; location.assign(location)<br />
5&nbsp;&nbsp; document.execCommand(&#8216;Refresh&#8217;)<br />
6&nbsp;&nbsp;&nbsp;window.navigate(location)<br />
7&nbsp;&nbsp; location.replace(location)<br />
8&nbsp;&nbsp; document.URL=location.href</p></blockquote>
<p>上面的八種方法小蛙並沒有一個一個測試，只找了符合自己使用情況的方法，例如：小蛙有一個編輯頁面上有多選欄位、單選欄位、文字欄位 &#8230; 等，這些資料原本就已經有值了(從資料庫撈出來)，而有一個重填按鈕，點了之後將頁面設定為尚未編輯前的資料，也就是如果原本多選欄位選了五個，編輯時把全部取消勾選，後來發現想要恢復原始設定點了重填按鈕，希望可以回復原始資料(跟新增時的重填不同，新增時的重填只要清空即可)，好吧！這裡可能寫的有點複雜，總而言之最偷懶的方法就是讓頁面變成第一次載入時的狀況，於是小蛙直接用JavaScript的重新整理。<br />
常看到的重新整理大概是location.reload();，但做了之後發現，原本被修改過的欄位並不會回復到原始狀況，就是說上面取消的五個多選欄位，並不會恢復成勾選狀態，之後試了location=location可以達到這個要求。有點像是F5(重新整理)跟Ctrl+F5(強制重新整理)的差別，location.reload();跟小蛙直接點F5一樣結果，而location=location的結果跟Ctrl+F5相同。<br />
後來小蛙在《<strong><a href="http://topic.csdn.net/u/20071025/10/d7f7e90e-3c8f-4b61-824f-2146d411f49c.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">请问如何区别window.location.Reload()和window.location.href=window.location.href;<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>》這個討論串中找到了為什麼location.reload();不能的答案</p>
<blockquote><p>flyerwing :<br />
定义和用法<br />
reload() 方法用于重新加载当前文档。<br />
语法<br />
location.reload(force)说明<br />
如果该 方法没有规定参数，或者参数是 false，它就会用 HTTP 头 If-Modified-Since 来检测服务器上的文档是否已改变。如果文档已改变，reload() 会再次下载该文档。如果文档未改变，则该方法将从缓存中装载文档。这与用户单击浏览器的刷新按钮的效果是完全一样的。<br />
如果把该方法的参数设置为 true，那么无论文档的最后修改日期是什么，它都会绕过缓存，从服务器上重新下载该文档。这与用户在单击浏览器的刷新按钮时按住 Shift 健的效果是完全一样。<br />
好象是说:<br />
如果window.loacation.reload(true)==window.location.href=&#8221;xxx.xx&#8221;;</p></blockquote>
<p>馬上試了一下，果然把location.reload();改成location.reload(true);就可以了！</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2297/javascript%e9%87%8d%e6%96%b0%e6%95%b4%e7%90%86%e9%a0%81%e9%9d%a2/" data-wpel-link="internal">JavaScript 重新整理頁面</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2297/javascript%e9%87%8d%e6%96%b0%e6%95%b4%e7%90%86%e9%a0%81%e9%9d%a2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JavaScript列印頁面及mailto寄信亂碼</title>
		<link>https://noter.tw/1704/javascript%e5%88%97%e5%8d%b0%e9%a0%81%e9%9d%a2%e5%8f%8amailto%e5%af%84%e4%bf%a1%e4%ba%82%e7%a2%bc/</link>
					<comments>https://noter.tw/1704/javascript%e5%88%97%e5%8d%b0%e9%a0%81%e9%9d%a2%e5%8f%8amailto%e5%af%84%e4%bf%a1%e4%ba%82%e7%a2%bc/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 28 Dec 2011 09:42:17 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[列印]]></category>
		<category><![CDATA[亂碼]]></category>
		<category><![CDATA[mailto]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[encodeURI]]></category>
		<category><![CDATA[java.net.URLEncoder.encode]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=1704</guid>

					<description><![CDATA[<p>接續前兩篇文章，從FancyBox到達申請表頁面後，對方要求可以透過(1)印表機列印申請表，(2)透過email寄送申請表。這篇文章小蛙要來說明怎麼透過JavaScript列印頁面以及用email寄送&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1704/javascript%e5%88%97%e5%8d%b0%e9%a0%81%e9%9d%a2%e5%8f%8amailto%e5%af%84%e4%bf%a1%e4%ba%82%e7%a2%bc/" data-wpel-link="internal">JavaScript列印頁面及mailto寄信亂碼</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>接續前兩篇文章，從FancyBox到達申請表頁面後，對方要求可以透過(1)印表機列印申請表，(2)透過email寄送申請表。這篇文章小蛙要來說明怎麼透過JavaScript列印頁面以及用email寄送申請表，小蛙在處理mailto的時候遇到亂碼問題卡了一天，也會在這篇文章中說明。<br />
<span id="more-1704"></span></p>
<ul>
<li><strong><span style="color: #ff0000;">JavaScript列印頁面</span></strong></li>
</ul>
<p style="padding-left: 30px;">JavaScript列印頁面非常簡單，只需要一行就可以達成，更多詳細資料可以參考<a href="http://nievor.wordpress.com/2008/07/31/javascript_print_preview/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Javascript呼叫IE列印以及預覽列印的方法@小峰峰的筆記本<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。</p>
<pre style="padding-left: 30px;">&amp;lt;input type="button" onclick="&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;print()&lt;/strong&gt;&lt;/span&gt;" value="列印申請表"&amp;gt;</pre>
<ul>
<li><span style="color: #ff0000;"><strong>JavaScript寄送電子郵件</strong></span></li>
</ul>
<p style="padding-left: 30px;">JavaScript寄送電子郵件指令也非常簡單，但是隱藏的問題其實還蠻多的，小蛙先介紹寄送電子郵件的指令。</p>
<pre style="padding-left: 30px;">&lt;input type="button" onclick="sendMail(true);" value="使用Big5寄送(Outlook)"&gt;
&lt;input type="button" onclick="sendMail(false);" value="使用UTF-8寄送"&gt;</pre>
<p style="padding-left: 30px;">小蛙用了sendMail()來讓使用者自行選擇要用哪種方式寄送等等再說明原因。JavaScript程式碼寄信程式碼如下，因為小蛙只用到簡單的寄件人、主旨及內容，更多詳細設定請參閱<a href="http://ant4html.blogspot.com/2009/01/mailto.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">用mailto寄信 @ 螞蟻的HTML<span class="wpel-icon wpel-image wpel-icon-6"></span></a>：</p>
<pre style="padding-left: 30px;">&lt;script type="text/javascript"&gt;
  // 基本寄信，沒有判斷編碼
  function sendMail(){
    var text_title = "這是一封透過JavsScript寄送的郵件主旨";
    var text_body  = "這是內文的部分。";
    sendmail = "mailto:xxxx@gmail.com?subject=" + text_title;
    sendmail += "&amp;body=" + text_body;
    location.href = sendmail;
  }
&lt;/script&gt;</pre>
<p style="padding-left: 30px;">如果要用到換行的話，必須使用<span style="color: #ff0000;"><strong>%0A</strong></span>。這個範例可能有些人跑起來是OK的，有些人卻得到亂碼，接下來小蛙要記錄一下自己的做法，也許有更好的做法，但時間緊迫只好先用這種特殊方式來解決。</p>
<ul>
<li><span style="color: #ff0000;"><strong>JavaScript mailto 亂碼解決</strong></span></li>
</ul>
<p style="padding-left: 30px;">目前小蛙找不到可以自動判斷要用什麼編碼的方法，也就是像上面的兩個按鈕，透過Big5寄送，或是透過UTF-8寄送，當小蛙以為就只有那麼簡單的時候又發現還要多一個條件判斷IE。Microsoft Outlook或Outlook Express會亂碼的原因是Outlook<strong><span style="color: #ff0000;">只能接受BIG5的編碼</span></strong>，但透過頁面location.href引導過去的參數會變成<span style="color: #ff0000;"><strong>UTF-8</strong></span>，所以不管怎麼試只要編碼不是BIG5在Outlook就一定會出現亂碼，但又找不到方法可以判斷客戶端在點了按鈕之後所呼叫的是Outlook還是透過Webmail寄送，像小蛙的電腦點了之後會跳出瀏覽器，透過gmail送出郵件，而不是使用Outlook。</p>
<p style="padding-left: 30px;">要確保送出的資料一定是用BIG5來編碼，在Java可以透過以下方式編碼。</p>
<pre style="padding-left: 30px;">java.net.URLEncoder.encode("一定要轉成BIG5編碼", "BIG5");</pre>
<p style="padding-left: 30px;">小蛙直接以自己的例子來說明，所有的頁面都是透過UTF-8編碼，包括使用者輸入的表單也是，這邊卡了一個問題是java.net.URLEncoder.encode()這個是Java的function，所以必須要在Server端才可以使用，也就是說使用者輸入完的資料沒有辦法直接透過java.net.URLEncoder.encode()來處理，這邊小蛙只好把所有的參數POST到另一頁sendMail.jsp專門處理亂碼及送出，以下是sendMail.jsp中Java編碼的部分。</p>
<pre style="padding-left: 30px;">String applyName = request.getParameter("applyName") == null ? "" : new String(request.getParameter("applyName").getBytes("ISO-8859-1"), "UTF-8");
String applyNameB = java.net.URLEncoder.encode("名稱："&nbsp;&nbsp; + applyName).replaceAll("[+]", " ");</pre>
<p style="padding-left: 30px;">編碼邏輯部分如下(以下是小蛙的dirty code，JavaScript跟Java夾雜，硬要分還是可以分的開，要怎麼處理就看自己的規畫囉！)：</p>
<pre style="padding-left: 30px;">&amp;lt;script type="text/javascript"&amp;gt;
&nbsp; var text_title = "&amp;lt;%=title%&amp;gt;";
&amp;lt;%
&nbsp; //也就是按下上面的「使用Big5寄送(Outlook)」
&nbsp; if("true".equals(big5)){
%&amp;gt;
&nbsp; &nbsp; &nbsp; // 這邊無論是哪個瀏覽器都務必要使用 &lt;span style="color: #ff0000;"&gt;&lt;strong&gt;big5&lt;/strong&gt;&lt;/span&gt; 送出
&nbsp;&nbsp;&nbsp; &nbsp; text_title = "&amp;lt;%=title&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/span&gt;%&amp;gt;";
&nbsp;&nbsp; &nbsp;&nbsp; text_body&nbsp; = "%0A" + ("&amp;lt;%=applyName&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/span&gt;%&amp;gt;");
&nbsp; &nbsp; &nbsp; ....
&amp;lt;%
&nbsp; }else{
  &nbsp;&nbsp;  if("IE".equals(browser)){
%&amp;gt;
    &nbsp;&nbsp;    // 如果瀏覽器是IE，還要額外做encodeURI處理
      &nbsp;&nbsp;  text_title = &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;encodeURI&lt;/span&gt;&lt;/strong&gt;(text_title);
&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;text_body&nbsp; = "&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;%0A&lt;/strong&gt;&lt;/span&gt;" + &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;encodeURI&lt;/span&gt;&lt;/strong&gt;("名稱：&amp;lt;%=applyName%&amp;gt;");
  &nbsp;&nbsp;      ....
&amp;lt;%
    &nbsp; }else{
%&amp;gt;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Firefox, Chrome直接傳送即可
&nbsp;&nbsp;        text_title = (text_title);
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;text_body&nbsp; = "&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;%0A&lt;/strong&gt;&lt;/span&gt;" + ("物件名稱：&amp;lt;%=applyName%&amp;gt;");
&amp;lt;%
    &nbsp; }
&nbsp; }
%&amp;gt;
&nbsp; mail_str = "mailto:xxxxx@gmail.com?subject=" + text_title;
&nbsp; mail_str += "&amp;amp;body=" + text_body;
&nbsp; location.href = mail_str;
&amp;lt;/script&amp;gt;</pre>
<p>好吧！還有時間的話再來看看要不要把這些Code清乾淨一些&#8230;天啊！Web工程師最怕看到的應該就是亂碼，每次一遇到亂碼問題就會卡一段時間 &#8230; 還是希望瀏覽器的行為模式可以統一呀！上面的方法可以「手動」解決亂碼問題，讓使用者自己點選是否透過Outlook或是透過Webmail傳送，而在瀏覽器的特殊行為上小蛙也做了判斷，最有問題的IE特別隔離出來，希望之後能看到更好的做法&gt;&lt;。<br />
這方法有一些不足的地方<br />
(1)程式碼太醜，Java跟JavaScript全都混在一起(剛上面提到可以拆的開!!!)<br />
(2)沒辦法做到完全自動判斷，還要讓使用者點選<br />
(3)小蛙只測試了IE8, FF7.0.1, Chrome 16.0.912.63<br />
(4)如果使用者預設瀏覽器是IE，而透過非IE瀏覽器去點選寄送mail，有些情況可以，有些情況不行，這個部份處理起來真的沒完沒了，真正遇到再說了 = =<br />
打完收工，繼續處理其他工作，希望可以不要抱著工作跨年。</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1704/javascript%e5%88%97%e5%8d%b0%e9%a0%81%e9%9d%a2%e5%8f%8amailto%e5%af%84%e4%bf%a1%e4%ba%82%e7%a2%bc/" data-wpel-link="internal">JavaScript列印頁面及mailto寄信亂碼</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/1704/javascript%e5%88%97%e5%8d%b0%e9%a0%81%e9%9d%a2%e5%8f%8amailto%e5%af%84%e4%bf%a1%e4%ba%82%e7%a2%bc/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>客製化FancyBox標題列，在FancyBox中加入Button</title>
		<link>https://noter.tw/1711/%e5%ae%a2%e8%a3%bd%e5%8c%96fancybox%e6%a8%99%e9%a1%8c%e5%88%97%ef%bc%8c%e5%9c%a8fancybox%e4%b8%ad%e5%8a%a0%e5%85%a5button/</link>
					<comments>https://noter.tw/1711/%e5%ae%a2%e8%a3%bd%e5%8c%96fancybox%e6%a8%99%e9%a1%8c%e5%88%97%ef%bc%8c%e5%9c%a8fancybox%e4%b8%ad%e5%8a%a0%e5%85%a5button/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 28 Dec 2011 06:43:09 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[fancybox]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[button]]></category>
		<category><![CDATA[fancybox style]]></category>
		<category><![CDATA[titleFormat]]></category>
		<category><![CDATA[標題列]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=1711</guid>

					<description><![CDATA[<p>接續上一篇，小蛙使用了FancyBox讓從多媒體中心取得的圖片可以透過燈箱效果呈現，接著有一個新的需求是，如果有使用者對於該張圖片有授權需求，可以透過Button點擊後帶出申請表，於是需要在Fancy&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1711/%e5%ae%a2%e8%a3%bd%e5%8c%96fancybox%e6%a8%99%e9%a1%8c%e5%88%97%ef%bc%8c%e5%9c%a8fancybox%e4%b8%ad%e5%8a%a0%e5%85%a5button/" data-wpel-link="internal">客製化FancyBox標題列，在FancyBox中加入Button</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>接續<a href="https://noter.tw/1706/%e4%bd%bf%e7%94%a8fancybox%e7%87%88%e7%ae%b1%e6%95%88%e6%9e%9c%e5%91%88%e7%8f%be%e5%9c%96%e7%89%87%e7%84%a1%e6%b3%95%e9%a1%af%e7%a4%ba%e5%9c%96%e7%89%87" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">上一篇</a>，小蛙使用了FancyBox讓從多媒體中心取得的圖片可以透過燈箱效果呈現，接著有一個新的需求是，如果有使用者對於該張圖片有授權需求，可以透過Button點擊後帶出申請表，於是需要在FancyBox中加入Button。<br />
<span id="more-1711"></span><br />
官方範例畫面，有各式各樣的demo：<br />
<a href="https://noter.tw/wp-content/uploads/2011/12/fancybox-1.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-1718" title="fancybox-1" src="https://noter.tw/wp-content/uploads/2011/12/fancybox-1.png" alt="fancybox 1 客製化FancyBox標題列，在FancyBox中加入Button" width="403" height="724"></a><br />
針對title的部分，FancyBox有提供幾款樣式供使用者選擇。這張圖是FancyBox title預設樣式。<br />
<a href="https://noter.tw/wp-content/uploads/2011/12/fancybox-2.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><img decoding="async" class="alignnone size-full wp-image-1720" title="fancybox-2" src="https://noter.tw/wp-content/uploads/2011/12/fancybox-2.png" alt="fancybox 2 客製化FancyBox標題列，在FancyBox中加入Button" width="534" height="571"></a><br />
Photo Credit: <a href="http://www.flickr.com/people/kharied/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Katie Harris<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<pre>$("a#example5").fancybox();</pre>
<p>&#8216;outside&#8217;樣式。<br />
<a href="https://noter.tw/wp-content/uploads/2011/12/fancybox-3.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><img decoding="async" class="alignnone size-full wp-image-1721" title="fancybox-3" src="https://noter.tw/wp-content/uploads/2011/12/fancybox-3.png" alt="fancybox 3 客製化FancyBox標題列，在FancyBox中加入Button" width="529" height="572"></a><br />
Photo Credit: <a href="http://www.flickr.com/people/kharied/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Katie Harris<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<pre>$("a#example6").fancybox({
    'titlePosition' : 'outside'
});</pre>
<p>&#8216;inside&#8217;樣式<br />
<a href="https://noter.tw/wp-content/uploads/2011/12/fancybox-4.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><img decoding="async" class="alignnone size-full wp-image-1719" title="fancybox-4" src="https://noter.tw/wp-content/uploads/2011/12/fancybox-4.png" alt="fancybox 4 客製化FancyBox標題列，在FancyBox中加入Button" width="527" height="409"></a><br />
Photo Credit: <a href="http://www.flickr.com/people/kharied/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Katie Harris<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<pre>$("a#example7").fancybox({
&nbsp; &nbsp; 'titlePosition' : 'inside'
});</pre>
<p>&#8216;Over&#8217;樣式<br />
<a href="https://noter.tw/wp-content/uploads/2011/12/fancybox-5.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><img decoding="async" class="alignnone size-full wp-image-1717" title="fancybox-5" src="https://noter.tw/wp-content/uploads/2011/12/fancybox-5.png" alt="fancybox 5 客製化FancyBox標題列，在FancyBox中加入Button" width="357" height="529"></a><br />
Photo Credit: <a href="http://www.flickr.com/people/kharied/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Katie Harris<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<pre>$("a#example8").fancybox({
&nbsp;&nbsp;&nbsp; 'titlePosition' : 'over'
});</pre>
<p>小蛙採用最少量的修改來達到這個目的，畢竟動到FancyBox套件內部的話，到時候升級版本會非常麻煩。其實只要看一下FancyBox API就可以發現，FancyBox在標題列的部分是可以自行修改並且帶入html的。</p>
<pre>$("a[rel=example_group]").fancybox({
&nbsp;&nbsp;&nbsp; 'transitionIn'&nbsp; : 'none',
&nbsp;&nbsp;&nbsp; 'transitionOut' : 'none',
&nbsp;&nbsp;&nbsp; 'titlePosition' : 'inside',
&nbsp;&nbsp;&nbsp; 'titleFormat'&nbsp;&nbsp; : function(title, currentArray, currentIndex, currentOpts) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '&lt;span id="fancybox-title-over"&gt;Image ' + (currentIndex + 1) + ' / ' + currentArray.length + (title.length ? ' &amp;nbsp; ' + title : '') + '&lt;/span&gt;';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
});</pre>
<p>titleFormat的部分後面接了個function(title, currentArray, currentIndex, currentOpts){}，重點是處理完之後return的是'&lt;span xxxx&#8217;，表示最後可以回傳html碼，簡單的說就是可以return希望呈現的元件。小蛙把return部分改成對方要求的「申請圖像授權」Button。</p>
<pre>$("a[rel=example_group]").fancybox({
&nbsp;&nbsp;&nbsp; 'transitionIn'&nbsp; : 'none',
&nbsp;&nbsp;&nbsp; 'transitionOut' : 'none',
&nbsp;&nbsp;&nbsp; 'titlePosition' : 'inside',
&nbsp;&nbsp;&nbsp; &lt;span style="color: #ff0000;"&gt;&lt;strong&gt;'titleFormat' &nbsp; : function(title, currentArray, currentIndex, currentOpts) {&lt;/strong&gt;&lt;/span&gt;
&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return '&amp;lt;center&amp;gt;&amp;lt;input type="button" name="title" value="申請圖像授權" onclick="xxx()"&amp;gt;&amp;lt;/center&amp;gt;';&lt;/strong&gt;&lt;/span&gt;
&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&lt;/strong&gt;&lt;/span&gt;
});</pre>
<p>可以增加html，當然也包括form元件，結果就變成這樣囉！<br />
<a href="https://noter.tw/wp-content/uploads/2011/12/fancybox-6.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><img decoding="async" class="alignnone size-full wp-image-1722" title="fancybox-6" src="https://noter.tw/wp-content/uploads/2011/12/fancybox-6.png" alt="fancybox 6 客製化FancyBox標題列，在FancyBox中加入Button" width="526" height="392"></a><br />
Photo Credit: <a href="http://www.flickr.com/people/kharied/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Katie Harris<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1711/%e5%ae%a2%e8%a3%bd%e5%8c%96fancybox%e6%a8%99%e9%a1%8c%e5%88%97%ef%bc%8c%e5%9c%a8fancybox%e4%b8%ad%e5%8a%a0%e5%85%a5button/" data-wpel-link="internal">客製化FancyBox標題列，在FancyBox中加入Button</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/1711/%e5%ae%a2%e8%a3%bd%e5%8c%96fancybox%e6%a8%99%e9%a1%8c%e5%88%97%ef%bc%8c%e5%9c%a8fancybox%e4%b8%ad%e5%8a%a0%e5%85%a5button/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>使用FancyBox燈箱效果呈現圖片，無法顯示圖片</title>
		<link>https://noter.tw/1706/%e4%bd%bf%e7%94%a8fancybox%e7%87%88%e7%ae%b1%e6%95%88%e6%9e%9c%e5%91%88%e7%8f%be%e5%9c%96%e7%89%87%e7%84%a1%e6%b3%95%e9%a1%af%e7%a4%ba%e5%9c%96%e7%89%87/</link>
					<comments>https://noter.tw/1706/%e4%bd%bf%e7%94%a8fancybox%e7%87%88%e7%ae%b1%e6%95%88%e6%9e%9c%e5%91%88%e7%8f%be%e5%9c%96%e7%89%87%e7%84%a1%e6%b3%95%e9%a1%af%e7%a4%ba%e5%9c%96%e7%89%87/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 28 Dec 2011 04:15:05 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[圖片]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[box]]></category>
		<category><![CDATA[fancybox]]></category>
		<category><![CDATA[gallery]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[燈箱]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=1706</guid>

					<description><![CDATA[<p>小蛙的最近一個工作中，要讓使用者點了縮圖之後可以透過燈箱效果開啟大圖並且上下頁切換，之前小蛙試過很多種燈箱效果套件，舉凡是colorbox, fancybox, lightbox, thinbox, &#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1706/%e4%bd%bf%e7%94%a8fancybox%e7%87%88%e7%ae%b1%e6%95%88%e6%9e%9c%e5%91%88%e7%8f%be%e5%9c%96%e7%89%87%e7%84%a1%e6%b3%95%e9%a1%af%e7%a4%ba%e5%9c%96%e7%89%87/" data-wpel-link="internal">使用FancyBox燈箱效果呈現圖片，無法顯示圖片</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>小蛙的最近一個工作中，要讓使用者點了縮圖之後可以透過燈箱效果開啟大圖並且上下頁切換，之前小蛙試過很多種燈箱效果套件，舉凡是colorbox, fancybox, lightbox, thinbox, thickbox, greybox &#8230; 等(小蛙沒記錯的話應該試了有十種)，為什麼要是那麼多種呢？不是效果不好，每個套件都有自己獨特的做法，但呈現出來的效果大致上是差不多的，會嘗試那麼多種的原因在於圖片讀取的方式，這篇文章紀錄一下使用FancyBox讀不到圖片時的小技巧。<br />
<span id="more-1706"></span><br />
fancybox的使用方式很簡單，只要到<a href="http://fancybox.net/home" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">fancybox官網<span class="wpel-icon wpel-image wpel-icon-6"></span></a>點選右上角的<a href="http://fancybox.googlecode.com/files/jquery.fancybox-1.3.4.zip" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Download<span class="wpel-icon wpel-image wpel-icon-6"></span></a>就可以開始下載，解壓縮後可以看到有一個index.html，點開來就可以看到範例了。這邊以官方的<a href="http://fancybox.net/howto" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">說明文件<span class="wpel-icon wpel-image wpel-icon-6"></span></a>簡單列出基本使用方法。</p>
<pre>&lt;!-- 這邊很方便只要多載入 jquery 就可以使用 --&gt;
&lt;!-- 如果懶得自己下載就把這行貼上，使用google的 --&gt;
&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"&gt;&lt;/script&gt;
&lt;!-- 套件主程式 --&gt;
&lt;script type="text/javascript" src="/fancybox/jquery.fancybox-1.3.4.pack.js"&gt;&lt;/script&gt;
&lt;!-- 載入fancybox css --&gt;
&lt;link rel="stylesheet" href="/fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" /&gt;</pre>
<p>以上這些code都是放在&lt;head&gt; <em>放在這</em> &lt;/head&gt;，另外有一些其他選項。</p>
<pre>&lt;!-- 如果要用滑鼠中間的滾輪控制圖片上下張，要新增這個 --&gt;
&lt;script type="text/javascript" src="./fancybox/jquery.mousewheel-3.0.4.pack.js"&gt;&lt;/script&gt;
&lt;!-- 如果要其他切換效果 --&gt;
&lt;script type="text/javascript" src="./fancybox/jquery.fancybox-1.3.4.pack.js"&gt;&lt;/script&gt;</pre>
<p>接下來是建立點了會跳出燈箱的連結。</p>
<pre>&lt;!-- 這種是單一圖片的，href及src換成自己的圖片位置 --&gt;
&lt;a id="single_image" href="image_big.jpg"&gt;&lt;img src="image_small.jpg" alt=""/&gt;&lt;/a&gt;
&lt;!-- 這種是多張圖片的(gallery)，href及src換成自己的圖片位置 --&gt;
&lt;a rel="example_group" href="./example/11_b.jpg" title=""&gt;&lt;img alt="" src="./example/11_s.jpg" /&gt;&lt;/a&gt;
&lt;a rel="example_group" href="./example/12_b.jpg" title=""&gt;&lt;img alt="" src="./example/12_s.jpg" /&gt;&lt;/a&gt;
&lt;a rel="example_group" href="./example/13_b.jpg" title=""&gt;&lt;img alt="" src="./example/13_s.jpg" /&gt;&lt;/a&gt;</pre>
<p>要以Gallery(相簿)方式呈現，只要在&lt;a&gt;中加一個rel的屬性就可以了，rel全部設相同就會在同一個Gallery群組。這邊要注意的是如果有設定id屬性，千萬不可以有重複名稱！接下來到最後一個步驟了，呼叫fancybox()讓這些設定「活」起來。</p>
<pre>// 讓單一圖片活起來
$("a#single_image").fancybox();
// 讓gallery活起來，titleFormat是圖片下方要呈現的樣式，可以自行修改
$("a[rel=example_group]").fancybox({
    'transitionIn'  : 'none',
    'transitionOut' : 'none',
    'titlePosition' : 'inside',
    'titleFormat'   :  function(title, currentArray, currentIndex, currentOpts) {
                           return '&lt;span id="fancybox-title-over"&gt;Image ' + (currentIndex + 1) + ' / ' + currentArray.length + (title.length ? ' &amp;nbsp; ' + title : '') + '&lt;/span&gt;';
                       }
});</pre>
<p>到這邊正常來說fancybox基本設定已經完成，只要點選圖片連結就可以看到燈箱效果，如果沒有出現的話，很高的機率都是js或是css的路徑設定錯誤。對於$()這個符號有興趣的網友可以參考<a href="http://webdesign.kerthis.com/jquery/jquery_selectors" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">jQuery Selectors<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。更多特效及客製化設定請參考<a href="http://fancybox.net/howto" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">fancybox#how to use<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，<a href="http://fancybox.net/api" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">fancybox#API &amp; Options<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，<a href="http://fancybox.net/blog" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">fancybox#Tips &amp; Tricks<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。<br />
之所以測試了那麼多種box，原因在於某個工作內容要取得的圖片是放在<a href="http://ndmmc2.iis.sinica.edu.tw" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">多媒體中心<span class="wpel-icon wpel-image wpel-icon-6"></span></a>(數位典藏國家型科技計畫，由中央研究院資訊科學研究所建置)，而多媒體中心讀取圖片的方式是透過以下連結來取圖。</p>
<pre>http://ndmmc2.iis.sinica.edu.tw/System/upload/GetImage.jsp?file_name=03-00001-0&amp;type=6&amp;user_name=taipei</pre>
<p>這就遇到一個問題了，有很多box套件會先檢查&lt;a href=&#8221;xxxxxx&#8221;&gt;及&lt;img src=&#8221;xxxxx&#8221;&gt;這兩個圖片來源部份是不是以「圖片」副檔名做為結尾，過濾掉有問題的檔名，減少套件發生錯誤的機率，也就是說上面這條從多媒體中心讀取圖片的連結在某些套件下是讀不到圖片的(被套件預先過濾掉了，會被判定成taipei結尾，不符合圖片副檔名)，所以遇到遠端取圖卻無法出圖的時候，可以在連結最後面加一個參數<span style="color: #ff0000;"><strong>&amp;_=.jpeg</strong><span style="color: #000000;">目的只是在跳過套件的過濾。</span></span></p>
<pre>http://ndmmc2.iis.sinica.edu.tw/System/upload/GetImage.jsp?file_name=03-00001-0&amp;type=6&amp;user_name=taipei&amp;_=.jpeg</pre>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1706/%e4%bd%bf%e7%94%a8fancybox%e7%87%88%e7%ae%b1%e6%95%88%e6%9e%9c%e5%91%88%e7%8f%be%e5%9c%96%e7%89%87%e7%84%a1%e6%b3%95%e9%a1%af%e7%a4%ba%e5%9c%96%e7%89%87/" data-wpel-link="internal">使用FancyBox燈箱效果呈現圖片，無法顯示圖片</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/1706/%e4%bd%bf%e7%94%a8fancybox%e7%87%88%e7%ae%b1%e6%95%88%e6%9e%9c%e5%91%88%e7%8f%be%e5%9c%96%e7%89%87%e7%84%a1%e6%b3%95%e9%a1%af%e7%a4%ba%e5%9c%96%e7%89%87/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Javascript用RegExp達成trim()</title>
		<link>https://noter.tw/2475/javascript%e7%94%a8regexp%e9%81%94%e6%88%90trim/</link>
					<comments>https://noter.tw/2475/javascript%e7%94%a8regexp%e9%81%94%e6%88%90trim/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Mon, 14 Mar 2011 07:33:47 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[Regex]]></category>
		<category><![CDATA[Regular Expression]]></category>
		<category><![CDATA[trim]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2475</guid>

					<description><![CDATA[<p>Java 中有個功能叫做 trim()，當字串中前後可能會有空白字元的時候，可以透過 trim() 來去除，小蛙使用 JavaScript 的時候發現沒有這個功能，Google 一下找到一篇文章講解怎&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2475/javascript%e7%94%a8regexp%e9%81%94%e6%88%90trim/" data-wpel-link="internal">Javascript用RegExp達成trim()</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>Java 中有個功能叫做 <span style="color: #ff0000;"><strong>trim()</strong></span>，當字串中前後可能會有空白字元的時候，可以透過 trim() 來去除，小蛙使用 JavaScript 的時候發現沒有這個功能，Google 一下找到一篇文章講解怎麼實作一個 JavaScript trim 功能，後來同事說：「為什麼不用<strong><span style="color: #ff0000;"> jQuery.trim(str)</span> </strong>就好了？」@_@ 小蛙開發 web 都會使用到 jQuery，不過這篇文章既然打好了，就還是留下來囉！<br />
<span id="more-2475"></span><br />
直接上程式碼，下面分成清除左邊空白、清除右邊空白，在合併成清除左右空白。</p>
<pre class="brush: javascript; gutter: true">// 去除左邊空白
function lelftrim ( terms ) {
    return terms.replace ( /^[\s]*/gi, "" );
}</pre>
<pre class="brush: javascript; gutter: true">// 去除右邊空白
function righttrim ( terms ) {
    return terms.replace ( /[\s]*$/gi, "" );
}</pre>
<pre class="brush: javascript; gutter: true">// 去除左右空白
function trim ( terms ) {
    terms = lefttrim ( terms );
    terms = righttrim ( terms );
    return terms;
}</pre>
<h4>Regex 說明</h4>
<p>/^[\s]*/gi<br />
\s：會產生空白的字元，ex. &#8221; &#8220;(空白)、&#8221;\t&#8221;、&#8221;\n&#8221;、&#8221;\x0B&#8221;、&#8221;\f&#8221;、&#8221;\r&#8221;<br />
^[\s]：空白字元開頭的字串 (意思同於左邊有空白字元)<br />
^[\s]*：0 個以上空白字元開頭的字串<br />
g：global<br />
i：case insensitive<br />
/[\s]*$/gi<br />
[\s]*$：0 個以上空白字元結尾的字串 (意思同於右邊有空白字元)<br />
參考資料 <strong><a href="http://www.dotblogs.com.tw/rox/archive/2008/04/10/2753.aspx" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Javascript function : trim() &#8211; 自訂<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong><br />
更多正則表示式可參考&nbsp;<strong><a href="http://www.javaworld.com.tw/jute/post/view?bid=20&amp;id=130126&amp;sty=1&amp;tpg=1&amp;age=0" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Java Regular Expression的學習筆記 [精華]<span class="wpel-icon wpel-image wpel-icon-6"></span></a>&nbsp;</strong>很詳細唷！如果開發上都會直接使用 jQuery 的話，就直接使用 <strong><a href="http://api.jquery.com/jQuery.trim/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">jQuery.trim(str)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong> 方法就好囉！<br />
<strong>參考資料：</strong></p>
<ol>
<li>
<address>jQuery.trim() @ jQuery</address>
<address><a href="http://api.jquery.com/jQuery.trim/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://api.jquery.com/jQuery.trim/<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>
<address>Java Regular Expression的學習筆記 [精華] @ JWorld@TW</address>
<address><a href="http://www.javaworld.com.tw/jute/post/view?bid=20&amp;id=130126&amp;sty=1&amp;tpg=1&amp;age=0" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://www.javaworld.com.tw/jute/post/view?bid=20&amp;id=130126&amp;sty=1&amp;tpg=1&amp;age=0<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>
<address>Javascript function : trim() &#8211; 自訂 @ Rox</address>
<address><a href="http://www.dotblogs.com.tw/rox/archive/2008/04/10/2753.aspx" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://www.dotblogs.com.tw/rox/archive/2008/04/10/2753.aspx<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
</ol>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2475/javascript%e7%94%a8regexp%e9%81%94%e6%88%90trim/" data-wpel-link="internal">Javascript用RegExp達成trim()</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2475/javascript%e7%94%a8regexp%e9%81%94%e6%88%90trim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Javascript用RegExp達成replaceAll()</title>
		<link>https://noter.tw/2479/javascript%e7%94%a8regexp%e9%81%94%e6%88%90replaceall/</link>
					<comments>https://noter.tw/2479/javascript%e7%94%a8regexp%e9%81%94%e6%88%90replaceall/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Mon, 14 Mar 2011 06:58:00 +0000</pubDate>
				<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Regex]]></category>
		<category><![CDATA[Regular Expression]]></category>
		<category><![CDATA[replace]]></category>
		<category><![CDATA[replaceAll()]]></category>
		<category><![CDATA[Strings.replace]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2479</guid>

					<description><![CDATA[<p>Java 有個很方便的功能，透過 replaceAll() 可以把字串中所有符合的子字串替換成別的字串，這篇文章記錄一下在網路上蒐尋到在 JavaScript 實作的方法。 Javascript 只有&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2479/javascript%e7%94%a8regexp%e9%81%94%e6%88%90replaceall/" data-wpel-link="internal">Javascript用RegExp達成replaceAll()</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>Java 有個很方便的功能，透過 replaceAll() 可以把字串中所有符合的子字串替換成別的字串，這篇文章記錄一下在網路上蒐尋到在 JavaScript 實作的方法。<br />
<span id="more-2479"></span><br />
Javascript 只有 replace，replace 只會替換一次，也就是只會替換第一個遇到的字串！但是透過 Regular Expression 就可以讓 JavaScript 的 replace 也有 replaceAll 的功能！上程式碼。</p>
<pre class="brush: javascript; gutter: true">function replaceAll ( terms, oldChar, newChar ) {
    terms.replace ( new RegExp ( oldChar , "gm" ), newChar );
}</pre>
<p>參考資料自&nbsp;<a href="http://yueguangyuan.iteye.com/blog/31744" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>JavaScript 中使用 replace 达到 replaceAll的效果 @ yueguangyuan</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<h4>參數說明</h4>
<p>terms：原始字串<br />
oldChar：要被替換掉的字串<br />
newChar：用來替換的新字串<br />
g：global<br />
m：multiline<br />
另外一個部落格也有一個類似的做法</p>
<pre class="brush: javascript; gutter: true">strings = strings.replace(/find/g,"replace");
// 例如："你好嗎?我很好".replace(/好/g, "Good")
// 會變成 你Good嗎?我很Good</pre>
<p><strong>參考資料：</strong></p>
<ol>
<li>
<address>JavaScript 中使用 replace 达到 replaceAll的效果 @ yueguangyuan</address>
<address><a href="http://yueguangyuan.iteye.com/blog/31744" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://yueguangyuan.iteye.com/blog/31744<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>
<address>jQuery: find and replace all the occurances from string @ Php Bugs</address>
<address><a href="http://phpbugs.wordpress.com/2011/06/16/jquery-find-and-replace-all-the-occurances-from-string/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://phpbugs.wordpress.com/2011/06/16/jquery-find-and-replace-all-the-occurances-from-string/<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
</ol>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2479/javascript%e7%94%a8regexp%e9%81%94%e6%88%90replaceall/" data-wpel-link="internal">Javascript用RegExp達成replaceAll()</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2479/javascript%e7%94%a8regexp%e9%81%94%e6%88%90replaceall/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
