<?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>setDomStorageEnabled &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/setdomstorageenabled/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Wed, 06 Nov 2019 14:20:00 +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>setDomStorageEnabled &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android WebView Error &#8211; Uncaught TypeError: Cannot call method &#039;getItem&#039; of null at &#8230;</title>
		<link>https://noter.tw/2969/android-webview-error-uncaught-typeerror-cannot-call-method-getitem-of-null-at/</link>
					<comments>https://noter.tw/2969/android-webview-error-uncaught-typeerror-cannot-call-method-getitem-of-null-at/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Thu, 08 Aug 2013 12:30:04 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[WebView]]></category>
		<category><![CDATA[WebViewClient]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[setDomStorageEnabled]]></category>
		<category><![CDATA[Uncaught TypeError]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2969</guid>

					<description><![CDATA[<p>昨天在試 Android WebView 這個元件，發現整個速度跟瀏覽器完全沒得比，包括内建瀏覽器、Chrome、Firefox、Opera &#8230;。每種瀏覽器的速度都比 WebView 快上&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2969/android-webview-error-uncaught-typeerror-cannot-call-method-getitem-of-null-at/" data-wpel-link="internal">Android WebView Error &#8211; Uncaught TypeError: Cannot call method &#039;getItem&#039; of null at &#8230;</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>昨天在試 Android <a href="https://www.google.com.tw/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CDAQFjAA&amp;url=http%3A%2F%2Fdeveloper.android.com%2Freference%2Fandroid%2Fwebkit%2FWebView.html&amp;ei=lQ4DUtK2OYnilAXOj4HQDA&amp;usg=AFQjCNEk-YZ6BGxAqElZx5KoFxB3yLOrhA&amp;sig2=8YtWJDY53zgy1XyvIMNbvw" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">WebView<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 這個元件，發現整個速度跟瀏覽器完全沒得比，包括内建瀏覽器、Chrome、Firefox、Opera &#8230;。每種瀏覽器的速度都比 WebView 快上許多 &#8230; 小蛙跟許多人一樣巴不得把 chrome 塞進 app 裡面！網路上有些人推薦 <a href="https://github.com/pwnall/chromeview" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">chromeview<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，不過有一些 bug 以及對於比較低 API 的 app 是沒辦法使用的！這篇記錄小蛙遇到 WebView 在載入網頁的時候遇到 <span style="color: #ff0000;"><strong>Uncaught TypeError</strong></span> 錯誤的解決方法。<br />
<span id="more-2969"></span><br />
小蛙之前只拿 WebView 來做簡單的頁面呈現，例如：<a href="https://noter.tw/1433/%e8%bb%9f%e9%ab%94%e5%88%86%e4%ba%ab%ef%bc%9a%e6%88%91%e7%9a%84%e8%82%a1%e7%a5%a8%e7%b2%be%e7%ae%97%e5%b8%ab/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">我的股票精算師</a>的新聞頁面 (讀取 url)、<a href="https://noter.tw/2245/%e8%bb%9f%e9%ab%94%e5%88%86%e4%ba%ab%ef%bc%9a%e6%88%91%e7%9a%84%e9%83%b5%e5%b1%80%e4%be%bf%e5%88%a9%e6%9f%a5/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">我的郵局便利查</a>的 ATM 及郵局頁面 (讀取 assets)、<a href="https://noter.tw/2232/%e8%bb%9f%e9%ab%94%e5%88%86%e4%ba%ab%ef%bc%9amicat-%e7%99%bc%e7%8f%be%e5%b9%b8%e7%a6%8f/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Micat發現幸福</a>的文章頁面 (讀取 url)。速度感覺沒有瀏覽器快但還算是可以接受！這次小蛙測試了幾個網頁，包括：小蛙的部落格-<a href="https://noter.tw" data-wpel-link="internal">記下來</a>、<a href="http://s9134131.pixnet.net/blog" 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>、<a href="http://m.tw.bid.yahoo.com/" 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>(會自動轉成手機版) &#8230; 等網頁，結構越複雜的網頁就越慢 &#8230; 但是特別的是奇摩拍賣手機版網頁，竟然也可以慢到如此誇張 &#8230; 不怪 WebView，因為就連直接用 Chrome 開啟都要花很長的一段時間，問題出在整個頁面載入完成之後，又做了大量的 DOM 操作，像是動態選單建立，動態元件 &#8230; 等等。奇摩拍賣放進了太多功能，造成整個效能低落 &#8230; (也許是小蛙自己的感覺有問題 &#8230; )！</p>
<p><a title="webview.png" href="http://lh5.ggpht.com/-tQu45g3jO3Y/UgMUr0qWNYI/AAAAAAAAICI/-_-COoVCfek/s0/webview.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="webview.png" src="//lh5.ggpht.com/-tQu45g3jO3Y/UgMUr0qWNYI/AAAAAAAAICI/-_-COoVCfek/w500-o/webview.png" alt="webview.png" /></a><br />
上圖是奇摩拍賣手機版放入 WebView 的畫面，小小一個頁面上有著非常多功能，左上角的找商品、右上角的會員、中間上方搜尋、中間選單、中間下面拍賣品陳列；但這個頁面其實有兩個部份在 WebView 中開啟的時候發生了錯誤(紅框部份)！小蛙試了很久紅框部份應該要出現動態選單，在這邊卻遲遲未出現，造成該頁面既有功能癱瘓掉 &#8230; 下圖才是正常的頁面 (用 Chrome 開啟)</p>
<p><a title="webviw2.png" href="http://lh3.ggpht.com/-UWWUYCwM1-w/UgMa61QIOFI/AAAAAAAAICg/4PkHncofSVI/s0/webviw2.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="webviw2.png" src="//lh3.ggpht.com/-UWWUYCwM1-w/UgMa61QIOFI/AAAAAAAAICg/4PkHncofSVI/w500-o/webviw2.png" alt="webviw2.png" /></a><br />
找了好久找不到問題在哪邊，後來在 Logcat 中發現一行關鍵的錯誤</p>
<div>
<div id="highlighter_924999" class="syntaxhighlighter  text">
<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="text plain">08-08 10:04:45.990: E/Web Console(3324): Uncaught TypeError: Cannot call method 'getItem' of null at <a href="http://l.yimg.com/tu/90e25deb72225483a6103a633c757035.js:1" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">http://l.yimg.com/tu/90e25deb72225483a6103a633c757035.js:1<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>當時小蛙還異想天開的以為是 WebViewClient.onReceivedError 或是 WebViewClient.onLoadResource 丟出這個令人覺得大心的錯誤，如果直接把網址貼上瀏覽器會發生錯誤，把後面的 :1 刪掉就可以正常讀取該 js，那只要在 WebViewClient.onLoadResource 讀取資源的時候，把 :1 這種造成錯誤的字元過濾掉就好了，把動作加上去之後發現，事情絕對沒有笨蛋想的那麼簡單 &#8230; 這個錯誤的拋出跟上面提到那兩個 function 一點關係都沒有 &#8230; 錯誤依然存在，跑不出來的功能依然跑不出來！<br />
Google 一下發現有很多人都遇到這個問題，解決的方法很簡單，這個錯誤的引起是因為剛剛一開始有提到該網頁是在 DOM 載入之後才開始對 DOM 元素進行操作，這邊有提到 WebSettings.setDomStorageEnabled(boolean)</p>
<div>
<div id="highlighter_491694" class="syntaxhighlighter  text">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">public synchronized void setDomStorageEnabled (boolean flag)</code></div>
<div class="line number2 index1 alt1"><code class="text plain">Sets whether the DOM storage API is enabled. The default value is false.</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>預設是不做 DOM 儲存的動作，也就是說在整個網頁載入完成之後並不把 DOM tree 儲存起來，所以導致後續對於 DOM 元素的操作，因為找不到這棵 tree 而發生錯誤，只要加上以下這行</p>
<div>
<div id="highlighter_616064" 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.getSettings().setDomStorageEnabled(</code><code class="java keyword">true</code><code class="java plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>問題就解決了！這次使用 WebView 來做一些東西加上整個切換成 fragment 的方式，應該會遇到不少問題！黃小蛙，加油！</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2969/android-webview-error-uncaught-typeerror-cannot-call-method-getitem-of-null-at/" data-wpel-link="internal">Android WebView Error &#8211; Uncaught TypeError: Cannot call method &#039;getItem&#039; of null at &#8230;</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2969/android-webview-error-uncaught-typeerror-cannot-call-method-getitem-of-null-at/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
