中餐時間到囉~!要一起訂中餐還是吃自己想吃的?

是不是安農路的美食都吃膩了呢?不想天天吃迷客夏 伊通店

又不想湊外送費的你,記住這個網址一定會很喜歡

https://ezo.tw/ubereats

第一次訂還送你兩百!今天中午、晚上我想點...西式美食

清洲路吉豚屋 KATSUYA 京站店叮叮滷味ELECT
興國街肯德基 KFC 台北雙連零食外送
寓埔路原涮樂活鍋物飲料外送
松柏街小油蔥 第宅店印度料理外送
長樂街呷喀煙燻滷味便當外送
中民路大口咬吐司蛋糕外送
邱浚彥:微整過頭致纖維化 永久隆鼻成首選
邱浚彥:隆鼻後照護很重要 醫師提醒禁忌不要犯
邱浚彥:找回隆起山根! 隆鼻後,最忌熬夜抽菸
邱浚彥:鼻子越挺越好看嗎? 鼻形比例自然更重要
邱浚彥:隆鼻想用「男友的肋骨」! 醫美顧問傻住:工具人升級成材料人
男子想靠手術找回性福 丁立文:治療前應三思
丁立文醫師幫你恢復自信雄風

使用體例:洗淨後,便可進行摒擋。
有用日期:請以冷水浸泡1小時,待食材軟化落後行料理。
利用方式:洗淨後,即可進行摒擋。
內容物:花菇
內容物:花菇

商品規格
品名:上等 韓國花菇
重量:120g ±10g
產地:韓國
內容物:花菇
留存期限:12個月
有用日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。
利用體式格局:洗淨後,即可進行摒擋。


保存前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。利用體例:洗淨後,便可進行摒擋。

  • 無色素、無香料、無防腐劑
  • 口感厚實香Q、外型完全
  • 健康飲食與素食者的最愛

: 十翼饌 上等韓國花菇(120g)哪裡買比力划算呢? 十翼饌 上等韓國花菇(120g)在PTT上面說下面這個網站廉價又快速,所以我都到這個網站采辦 十翼饌 上等韓國花菇(120g)了!"/>

第一次采辦?


有用日期:請以冷水浸泡1小時,待食材軟化落後行料理。

 

留存刻日:12個月
重量:120g ±10g

 

馬上購置 宅配到府

© 2016  十翼饌 上等韓國花菇(120g). All Rights Reserved. Designed by FreeHTML5.co Demo Images: Pexelssponsor: 床的世界. 除臭襪有用嗎. 借錢.

內容物:花菇
 十翼饌 上等韓國花菇(120g)新光三越,  商品規格
留存條件:為確保品質,請寄存於陰涼處,開封後請密封冷藏。

內容物:花菇
產地:韓國
內容物:花菇
有效日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。

使用方式:洗淨後,即可進行摒擋。
<本產品已投保1,000萬產品責任險>

精緻包裝 送禮適宜;關心設計 輕鬆保存

有用日期:請以冷水浸泡1小時,待食材軟化落後行料理。
產地:韓國

有用日期:請以冷水浸泡1小時,待食材軟化落後行料理。內容物:花菇
產地:韓國
留存刻日:12個月
【周全特價中】 <font size='2'>商品規格<br>有效日期:請以冷水浸泡1小時,待食材軟化後進行料理。<br>使用體例:洗淨後,即可進行料理。<br>重量:120g ±10g <br>重量:120g ±10g <br> 嚴選健康平安的新鮮甘旨,讓料理人輕鬆締造唇齒留香、眷念不已的味覺打動。<br />保存刻日:12個月<br>利用方式:洗淨後,便可進行摒擋。<br>保留期限:12個月<br>利用體例:洗淨後,便可進行料理。<br>保留期限:12個月<br> 產地:韓國<br> </div> <div class="col-md-12"> 有用日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。<br><br>有效日期:請以冷水浸泡1小時,待食材軟化後進行料理。 健康飲食者及素食者最愛的養生食材之一</font></div> </td> </tr> <tr> <td align="top" valign="top" > <div style="text-align:center;"> </div> </td> </tr> </tbody> </table> 保留條件:為確保品質,請寄存於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)忠孝東路 </figcaption> </figure> </div> <div class="col-md-12"> 保存期限:12個月<br>使用方式:洗淨後,便可進行摒擋。<br> <table width="650" > <tbody> <tr> <td align="top" valign="top" > 保存刻日:12個月<br>重量:120g ±10g <br>產地:韓國<br>品名:上等 韓國花菇<br>保存期限:12個月<br><p style="text-align:center;">  </p> </div> </div> </div> </div> </div> <!-- jQuery --> <script src="js/jquery.min.js"></script> <!-- jQuery Easing --> <script src="js/jquery.easing.1.3.js"></script> <!-- Bootstrap --> <script src="js/bootstrap.min.js"></script> <!-- Carousel --> <script src="js/owl.carousel.min.js"></script> <!-- Stellar --> <script src="js/jquery.stellar.min.js"></script> <!-- Waypoints --> <script src="js/jquery.waypoints.min.js"></script> <!-- Counters --> <script src="js/jquery.countTo.js"></script> <!-- MAIN JS --> <script src="js/main.js"></script> </body> </html> 有用日期:請以冷水浸泡1小時,待食材軟化落後行摒擋。<br>重量:120g ±10g <br>產地:韓國<br>利用體例:洗淨後,便可進行摒擋。<br>留存前提:為確保品質,請存放於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)宅配,  <font size='2'>商品規格<br>產地:韓國<br></font></div> </td> </tr> </tbody> </table> <font color="#000000" size="2">包裝上附有封口條,讓食物不易散出,連結美觀、新穎。品名:上等 韓國花菇<br>重量:120g ±10g <br>內容物:花菇<br>產地:韓國<br>重量:120g ±10g <br>內容物:花菇<br>品名:上等 韓國花菇<br><p style="text-align:center;"> <b><font color="#ff0000" style="font-size:12pt;">菇中極品 口感絕佳 [無色素、無香料、無防腐劑]</font></b></p> <font color="#000000" size="2">台南六十餘年南北貨老字號,精挑國內外上乘食材、南北各地幸福香氣的元素、<br /> </div> <div class="col-md-12"> <figure><img src="https://s.yimg.com/wb/images/2C071663B7FB11737FAE6CEC652E992EF5A02722" alt=" <font size='2'>商品規格<br> 內容物:花菇<br>產地:韓國<br>有用日期:請以冷水浸泡1小時,待食材軟化落後行摒擋。<br> <table width="650" > <tbody> <tr> <td align="top" valign="top" > <div style="text-align:center;"> </div> </td> </tr> <tr> <td align="top" valign="top" > <div style="text-align:center;"> <br />品名:上等 韓國花菇<br>品名:上等 韓國花菇<br>有用日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。<br>產地:韓國<br>每筆預借現金手續費:新臺幣100元+預借現金金額 X 3.5%及其他費用查詢請洽滙豐銀行網站/環利率基準日為104年9月1日</span></p><p class="fh5co-lead">若您第一次購買 十翼饌 上等韓國花菇(120g),建議領取折價券享有優惠價!別的保舉信譽卡刷卡付款,享有2.22%購物起回饋,等同享有優惠外再打98折以上優惠,當即申辦享有優惠!<br><br><span style="font-size:14px">謹慎理財信譽至上</span><br><ul><li><a href="https://www.ticrf.org.tw/category/ding-liwen-doctors/">丁立文醫師</a></li><li><a href="https://market.ltn.com.tw/article/6121">丁斌煌醫師:「曲線雕塑」解決深層脂肪 今年最夯!</a></li><li><a href="https://market.ltn.com.tw/article/6086">丁立文醫師:杜絕外遇 緊抓住男人的心</a></li><li><a href="https://act.chinatimes.com/market/content.aspx?AdID=9140&chdtv">邱浚彥</a></li></ul><a target='_blank' href='http://mypaper.pchome.com.tw/goodmaforehy'>永興巷麥當勞 S474北南京五 McDonald's Nan Jing V,Taipei外送距離</a><br><a target='_blank' href='http://mypaper.pchome.com.tw/quennelkakxm'>達生二街NICE GREEn 美蔬菜廚房 忠孝店電話外送</a><br><a target='_blank' href='https://batesi8tmwo.pixnet.net/blog/post/359325718'>天德一路2派克脆皮雞排 四平總店外送門坎</a><br><a target='_blank' href='https://maynargaigabb6fg.wordpress.com/2020/05/14/聯興三街金鐘茶餐廳電話外送/'>聯興三街金鐘茶餐廳電話外送</a><br><a target='_blank' href='http://blog.udn.com/willowterrk/135268366'>大成三街Dejia得嘉野餐廚房零食外送</a><br><span style="font-size:12px">信譽消費及預借現金合用之循環信譽利率:5.68%-15.00%。<br>使用方式:洗淨後,便可進行摒擋。重量:120g ±10g <br>內容物:花菇<br><br>有用日期:請以冷水浸泡1小時,待食材軟化後進行料理。保留期限:12個月<br> 因為領會您下廚的用心,所以更要為您嚴選進級的食材。</font></div> </td> </tr> </tbody> </table> 重量:120g ±10g <br></font> : 十翼饌 上等韓國花菇(120g)哪裡買比力划算呢? 十翼饌 上等韓國花菇(120g)在PTT上面說這個網站廉價又快速,所以我都到這個網站采辦 十翼饌 上等韓國花菇(120g)了!</p><p><p>前陣子在網路購物時看到 十翼饌 上等韓國花菇(120g)的商品,發現品質還不錯,良多口碑文章推薦,但 <font size='2'>商品規格<br>品名:上等 韓國花菇<br>重量:120g ±10g <br>產地:韓國<br>內容物:花菇<br>保存刻日:12個月<br>有效日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。<br>保存前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。<br>使用體式格局:洗淨後,即可進行料理。內容物:花菇<br>保留刻日:12個月<br>產地:韓國<br>品名:上等 韓國花菇<br>留存前提:為確保品質,請存放於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)全聯,  <font size='2'>商品規格<br>品名:上等 韓國花菇<br>利用體式格局:洗淨後,即可進行摒擋。<br><br>有效日期:請以冷水浸泡1小時,待食材軟化落後行料理。保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)台茂,  <font size='2'>商品規格<br> <br>有效日期:請以冷水浸泡1小時,待食材軟化落後行料理。</p> <div class="row"> <div class="col-md-12"> <font color="#000000" size="2">菇傘厚實香Q 外型完全<br /> <ul> <li><i class="icon-facebook"></i></li> <li><i class="icon-twitter"></i></li> <li><i class="icon-instagram"></i></li> <li><i class="icon-linkedin"></i></li> </ul> </div> </aside> <div id="fh5co-main"> <div class="fh5co-narrow-content animate-box fh5co-border-bottom" data-animate-effect="fadeInLeft"> <h1 class="fh5co-heading" > 十翼饌 上等韓國花菇(120g)</span></h1> 保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)新竹巨城,  <font size='2'>商品規格<br>熬煮經典的香菇雞湯、切絲拌炒蔬菜、或是添入蒸蛋中,口感香氣立即提拔。富含多醣體、高卵白質、及低熱量,一貫是健康飲食者及素食者最愛的攝生食材之一。 <font color="#000000" size="2">香菇不常是摒擋的主角,但絕對是畫龍點睛的提味好料。<br />產地:韓國<br><p class="text-center">立時購買 宅配到府</p></font>  十翼饌 上等韓國花菇(120g)折價券,  <font size='2'>商品規格<br>保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。<p style="text-align:center;">  </p>品名:上等 韓國花菇<br></font>  十翼饌 上等韓國花菇(120g)哪裡買,  <font size='2'>商品規格<br>保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。 <br />內容物:花菇<br>品名:上等 韓國花菇<br>重量:120g ±10g <br>品名:上等 韓國花菇<br>重量:120g ±10g <br><p></p><br>有用日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。產地:韓國<br></font>  十翼饌 上等韓國花菇(120g)哪裡有,  <font size='2'>商品規格<br>留存前提:為確保品質,請存放於陰涼處,開封後請密封冷藏。利用體例:洗淨後,便可進行摒擋。<br>有用日期:請以冷水浸泡1小時,待食材軟化落後行料理。<br>產地:韓國<br></font> : 十翼饌 上等韓國花菇(120g)" class="img-responsive"> <figcaption>  <font size='2'>商品規格<br>保存條件:為確保品質,請寄存於陰涼處,開封後請密封冷藏。留存前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)板橋遠百,  <font size='2'>商品規格<br>保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。</font>  十翼饌 上等韓國花菇(120g)宜蘭,  <font size='2'>商品規格<br>品名:上等 韓國花菇<br>品名:上等 韓國花菇<br></font>  十翼饌 上等韓國花菇(120g)大潤發,  <font size='2'>商品規格<br>保存前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。重量:120g ±10g <br></font>  十翼饌 上等韓國花菇(120g)大遠百,  <font size='2'>商品規格<br>保留前提:為確保品質,請存放於陰涼處,開封後請密封冷藏。品名:上等 韓國花菇<br><p></p><ul><li><a href="https://youtu.be/oGBEe4sSLsw">丁立文醫師</a></li><li><a href="https://market.ltn.com.tw/article/6121">丁斌煌醫師:「曲線雕塑」解決深層脂肪 今年最夯!</a></li><li><a href="https://market.ltn.com.tw/article/6086">丁立文醫師:杜絕外遇 緊抓住男人的心</a></li><li><a href="https://n.yam.com/Article/20191023978924">邱浚彥</a></li></ul><a target='_blank' href='https://xzwxahmbm5.pixnet.net/blog/post/324146323'>巿前街Like 17賴一起印度摒擋外送</a><br><a target='_blank' href='https://landrilic427.pixnet.net/blog/post/324415653'>大湳路咖啡和茶 • 珍珠奶茶美式摒擋外送</a><br><a target='_blank' href='https://breakingha634.pixnet.net/blog/post/324395373'>隘口三街世界豆乳大王 總店中式摒擋外送</a><br><a target='_blank' href='http://mypaper.pchome.com.tw/goodmaforehy'>惠文街頂呱呱 北車站前店有外送嗎?</a><br><a target='_blank' href='http://mypaper.pchome.com.tw/goodmaforehy'>猴探井街Oyami Cafe西門店飲料外送外送</a><br>保存前提:為確保品質,請存放於陰涼處,開封後請密封冷藏。</font> , 十翼饌 上等韓國花菇(120g)" /> <meta name="keywords" content=" <font size='2'>商品規格<br>保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。</font> , 十翼饌 上等韓國花菇(120g)" /> <meta name="author" content="FreeHTML5.co" /> <script type="application/ld+json">{ "@context": "http://schema.org", "@type": "brand", "aggregateRating": { "@type": "AggregateRating", "bestRating": 5, "worstRating": 1, "ratingCount": 6666 , "ratingValue": 4.8 }, "image": "https://s.yimg.com/wb/images/2C071663B7FB11737FAE6CEC652E992EF5A02722", "name": " 十翼饌 上等韓國花菇(120g)"}</script> <!-- ////////////////////////////////////////////////////// FREE HTML5 TEMPLATE DESIGNED & DEVELOPED by FreeHTML5.co Website: http://freehtml5.co/ Email: info@freehtml5.co Twitter: http://twitter.com/fh5co Facebook: https://www.facebook.com/fh5co ////////////////////////////////////////////////////// --> <!-- Facebook and Twitter integration --> <meta property="og:title" content="【驚】 十翼饌 上等韓國花菇(120g)原裝進口!"/> <meta property="og:image" content="https://s.yimg.com/wb/images/2C071663B7FB11737FAE6CEC652E992EF5A02722"/> <meta property="og:url" content="https://tw.partner.buy.yahoo.com:443/gd/buy?mcode=MV94cVVGN2ZHdlRGK2ZwbHNlZU5vcU43NmhlVU52d080T285dC9CeWxtR01FPQ==&url=https%3A%2F%2Ftw.buy.yahoo.com%2Fgdsale%2Fgdsale.asp%3Fgdid%3D4184333"/> <meta property="og:site_name" content="台灣購物網"/> <meta property="og:description" content="前陣子在網路購物時看到 十翼饌 上等韓國花菇(120g)的商品,發現品質還不錯,良多口碑文章保舉,但 <font size='2'>商品規格<br> <table width="650" > <tbody> <tr> <td style="text-align: center;" align="top" valign="top" >  </td> <td align="top" valign="top" > 品名:上等 韓國花菇<br>保留刻日:12個月<br><p style="text-align:center;"> <b><font color="#ff0000" style="font-size:14pt;">十翼饌-上等 韓國花菇</font></b></p> <div style="text-align:center;"> <br /> <font color="#999999" size="2">一道菜餚,就可以締造幸福與感動!<br /> 六合的天然素材,在巧手下釀成滿足的香氣、傳家的味覺記憶。<br />重量:120g ±10g <br><p class="text-center">頓時采辦 宅配到府</p> 使用體例:洗淨後,便可進行摒擋。<br>品名:上等 韓國花菇<br> <br />產地:韓國<br>內容物:花菇<br>產地:韓國<br><br>使用方式:洗淨後,即可進行摒擋。內容物:花菇<br>重量:120g ±10g <br>使用方式:洗淨後,即可進行摒擋。<br>品名:上等 韓國花菇<br>保留期限:12個月<br>內容物:花菇<br>內容物:花菇<br>產地:韓國<br>品名:上等 韓國花菇<br>使用方式:洗淨後,便可進行摒擋。<br>重量:120g ±10g <br> <br />保留刻日:12個月<br><p> <p style="text-align:center;">  </p>保留刻日:12個月<br><p style="text-align:center;">  </p>重量:120g ±10g <br><br>有用日期:請以冷水浸泡1小時,待食材軟化後進行摒擋。<br>利用體式格局:洗淨後,便可進行料理。內容物:花菇<br>產地:韓國<br>產地:韓國<br>品名:上等 韓國花菇<br>重量:120g ±10g <br> </div> <div class="col-md-12"> 保存刻日:12個月<br><ul><li><a href="https://www.icare.org.tw/">丁立文醫師</a></li><li><a href="https://market.ltn.com.tw/article/6121">丁斌煌醫師:「曲線雕塑」解決深層脂肪 今年最夯!</a></li><li><a href="https://market.ltn.com.tw/article/6086">丁立文醫師:杜絕外遇 緊抓住男人的心</a></li><li><a href="http://www.taiwanhot.net/?p=730257">邱浚彥</a></li></ul><a target='_blank' href='http://blog.udn.com/michaej07hrg/135249318'>工業路茶湯會 伊通店台中市外送</a><br><a target='_blank' href='https://bicwcvdmw6.pixnet.net/blog/post/324412803'>隘口三街Lacuz泰食一樂 台大店高雄市外送</a><br><a target='_blank' href='http://mypaper.pchome.com.tw/goodmaforehy'>口庄街史料味極 牛肉麵壽司外送外送</a><br><a target='_blank' href='http://mypaper.pchome.com.tw/quennelkakxm'>貢旗玖牛餓虎 和牛滷肉飯 林森店蛋糕外送</a><br><a target='_blank' href='http://blog.udn.com/noqmsarvz8/135266602'>明科街I'm Pasta 和平店日本料理外送</a><br><br>利用方式:洗淨後,即可進行料理。</font>  十翼饌 上等韓國花菇(120g)麗寶百貨,  <font size='2'>商品規格<br>保留前提:為確保品質,請寄存於陰涼處,開封後請密封冷藏。重量:120g ±10g <br> 花菇是冬菇的一種,發展在乾燥情況中,因氣候嚴寒致使香菇菌蓋上表皮裂開,露出白色的菌肉,狀如斑紋而得名,是冬菇裡的極品,價位也比一般冬菇高。</font></div> </td> </tr> </tbody> </table> 十翼饌嚴選花菇,菇傘厚實香Q,外型完全,菇面有很多斑紋、光彩鮮明,為您的菜餚健康加分、菜色美感也大大晉升。<p></p>品名:上等 韓國花菇<br>重量:120g ±10g <br></font>  十翼饌 上等韓國花菇(120g)家樂福,  <font size='2'>商品規格<br>保留前提:為確保品質,請存放於陰涼處,開封後請密封冷藏。品名:上等 韓國花菇<br>重量:120g ±10g <br>重量:120g ±10g <br><br>使用體式格局:洗淨後,即可進行摒擋。 <table width="650" > <tbody> <tr> <td align="top" valign="top" > <div style="text-align:center;"> </div> </td> </tr> <tr> <td align="top" valign="top" > 品名:上等 韓國花菇<br><ul><li><a href="https://youtu.be/xnF0mMEGTBs">丁立文醫師</a></li><li><a href="https://market.ltn.com.tw/article/6121">丁斌煌醫師:「曲線雕塑」解決深層脂肪 今年最夯!</a></li><li><a href="https://market.ltn.com.tw/article/6086">丁立文醫師:杜絕外遇 緊抓住男人的心</a></li><li><a href="https://tw.sports.appledaily.com/appledaily/article/adcontent/20200709/38675672/">邱浚彥</a></li></ul><a target='_blank' href='http://mypaper.pchome.com.tw/almakentq5'>北平路天仁茗茶 民生社區店義式摒擋外送</a><br><a target='_blank' href='https://jimmiexj0uuu.pixnet.net/blog/post/218656239'>樂利二街吉馬陳蚵仔麵線大王甜點外送</a><br><a target='_blank' href='https://oqc3hjgeofgfk7v.wordpress.com/2020/05/15/光榮南路一街小春園滷味飲料外送外送/'>光榮南路一街小春園滷味飲料外送外送</a><br><a target='_blank' href='http://mypaper.pchome.com.tw/leroyrantbf'>復興二街家和素食中式摒擋外送</a><br><a target='_blank' href='https://lg0gs3reeda23q44h.wordpress.com/2020/05/14/清興路啜飲室-大安亞洲食品外送/'>清興路啜飲室 大安亞洲食品外送</a><br> </div> <!-- /.article-content-inner --> <div class="tag-container-parent"> <div class="tag-container article-keyword" data-version="a"> </div> </div> <!-- /.tag-container-parent --> <div class="author-profile"> <div class="author-profile__header">創作者介紹</div> <div class="author-profile__main" id="mixpanel-author-box"> <a> <img class="author-profile__avatar" src="https://s3.1px.tw/blog/common/avatar/blog_cover_light.jpg" alt="創作者 deaucootvan的部落格 的頭像" loading="lazy" /> </a> <div class="author-profile__content"> <a href="https://www.pixnet.net/pcard/deaucootvan" class="author-profile__name">deaucootvan</a> <p class="author-profile__info">deaucootvan的部落格</p> </div> <div class="author-profile__subscribe hoverable"> <button data-follow-state="關注" class="subscribe-btn member"></button> </div> </div> </div> <!-- /.author-profile --> </div> <!-- /.article-content --> <p class="author"> deaucootvan 發表在 <a href="https://www.pixnet.net">痞客邦</a> <a href="#comments">留言</a>(0) <span class="author-views">人氣( <span id="BlogArticleCount" data-stats="single" data-post-id="16018663260"> 0 </span> ) </span> </p> <!-- /.author --> <div id="pixnet-ad-content-left-right-wrapper"> <div class="left"></div> <div class="right"></div> </div> <!-- /#pixnet-ad-content-left-right-wrapper --> <div class="article-footer"> <ul class="refer"> <li> 全站分類: <a href="https://www.pixnet.net/channel/religion">宗教超自然</a> </li> </ul> <div class="back-to-top"> <a href="#top" title="back to the top of the page">▲top</a> </div> <div id="post-comment" class="comment-container" x-data="commentComponent({postId: '16018663260', blog_id: '7810648', allowComment: true})" x-init="init()"> <div class="post-comment__header"> <span x-text="meta.totalCount + ' 則留言'"></span> </div> <div class="post-comment__body"> <ol class="post-comment__list"> <template x-for="comment in comments" :key="comment.id"> <li class="post-comment__item"> <div class="comment-card"> <a href="#" class="comment-card__avatar-link" :aria-label="'查看 ' + comment.commenter.display_name + ' 的個人頁'"> <img class="comment-card__avatar" :src="comment.commenter.avatar" :alt="comment.commenter.display_name" loading="lazy" /> </a> <div class="comment-card__main"> <div class="comment-card__bubble"> <div class="comment-card__author-row"> <a href="#" class="comment-card__author" x-text="comment.commenter.display_name"></a> <span class="comment-card__badge comment-card__badge--author" x-show="comment.commenter.is_author">作者</span> </div> <div class="comment-card__content" x-html="comment.content"></div> </div> <!-- /.comment-card__bubble --> <div class="comment-card__meta"> <time class="comment-card__time" :datetime="comment.datetime" x-text="comment.human_time"></time> <a href="#" class="comment-card__action" x-show="isOwner()" @click.prevent="toggleReply(comment.id)">回覆</a> <a href="#" class="comment-card__action" x-show="isOwner()" :class="{ 'comment-card__action--active': comment.visibility == 1 }" @click.prevent="changeCommentVisibility(comment.id, 'show')">顯示</a> <a href="#" class="comment-card__action" x-show="isOwner()" :class="{ 'comment-card__action--active': comment.visibility == 2 }" @click.prevent="changeCommentVisibility(comment.id, 'hide')">隱藏</a> <a href="#" class="comment-card__action" x-show="isOwner()" @click.prevent="deleteComment(comment.id)">刪除</a> </div> <!-- /.comment-card__meta --> <div class="comment-card__replies"> <ol class="reply-list"> <template x-for="reply in comment.replies"> <li class="reply-list__item"> <div class="comment-card comment-card--reply" :class="{'comment-card--hidden': reply.visibility == 2 && isOwner()}"> <a href="#" class="comment-card__avatar-link" aria-label="查看 Eric 的個人頁"> <img class="comment-card__avatar" :src="reply.replyer.avatar" :alt="reply.replyer.display_name" loading="lazy" /> </a> <div class="comment-card__main"> <div class="comment-card__bubble"> <div class="comment-card__author-row"> <a :href="reply.replyer.card_url" class="comment-card__author" x-text="reply.replyer.display_name"></a> <span class="comment-card__badge comment-card__badge--author" x-show="reply.replyer.is_author">作者</span> </div> <div class="comment-card__content" x-html="reply.content"></div> </div> <div class="comment-card__meta"> <time class="comment-card__time" :datetime="reply.datetime" x-text="reply.human_time"></time> <a href="#" class="comment-card__action" x-show="isOwner()" :class="{ 'comment-card__action--active': reply.visibility == 1 }" @click.prevent="changeReplyVisibility(comment.id, reply.id, 'show')">顯示</a> <a href="#" class="comment-card__action" x-show="isOwner()" :class="{ 'comment-card__action--active': reply.visibility == 2 }" @click.prevent="changeReplyVisibility(comment.id, reply.id, 'hide')">隱藏</a> <a href="#" class="comment-card__action" x-show="isOwner()" @click.prevent="deleteReply(comment.id, reply.id)">刪除</a> </div> <!-- /.comment-card__meta --> </div> </div> </li> </template> </ol> </div> <!-- /.comment-card__replies --> <div class="comment-card__reply-editor" x-show="replyingTo === comment.id && isOwner()"> <div class="reply-editor"> <div class="reply-editor__avatar"> <img src="https://i.pravatar.cc/48?img=5"> </div> <form class="reply-editor__form"> <div class="reply-editor__input-wrap"> <textarea class="reply-editor__textarea" placeholder="寫下你的回覆..." x-model="replyDraft[comment.id].content"></textarea> </div> <div class="reply-editor__footer"> <div class="reply-editor__visibility"> <label> <input type="radio" name="reply_visibility" value="1" x-model="replyDraft[comment.id].visibility" checked> 公開回覆 </label> <label> <input type="radio" name="reply_visibility" value="2" x-model="replyDraft[comment.id].visibility"> 私密回覆 </label> </div> <div class="reply-editor__actions"> <button type="button" class="reply-editor__cancel" @click="replyingTo = null">取消</button> <button type="submit" class="reply-editor__submit" @click.prevent="submitReply(comment.id)">回覆</button> </div> </div> </form> </div> </div> <!-- /.comment-card__reply-editor --> </div> <!-- /.comment-card__main --> </div> </li> </template> <template x-if="comments.length === 0"> <li class="post-comment__item" style="text-align: center; color: #888; padding: 2rem 0;"> 沒有留言,快來搶沙發吧! </li> </template> </ol> <button class="btn-more" x-show="meta.page < meta.pageCount" @click="loadMore">載入更多</button> </div> <!-- /.post-comment__body --> <div class="post-comment__footer" x-show="allowComment"> <div class="comment-editor" x-show="isLoggedIn"> <a href="#" class="comment-editor__avatar-link" aria-label="我的個人頁"> <img class="comment-editor__avatar" :src="user?.avatar" :alt="user?.display_name" loading="lazy" /> </a> <form class="comment-editor__form" action="" method="post"> <label for="comment-message" class="comment-editor__label" x-text="'以 ' + user?.display_name + ' 身份發表留言'"></label> <div class="comment-editor__input-wrap"> <textarea id="comment-message" name="comment" class="comment-editor__textarea" rows="3" placeholder="寫下你的留言..." x-model="newComment.content"></textarea> </div> <div class="comment-editor__footer"> <div class="comment-editor__visibility"> <label class="comment-editor__visibility-option"> <input type="radio" name="visibility" value="1" x-model="newComment.visibility" checked> <span>公開留言</span> </label> <label class="comment-editor__visibility-option"> <input type="radio" name="visibility" value="2" x-model="newComment.visibility"> <span>私密留言</span> </label> </div> <div class="comment-editor__actions"> <button type="submit" class="comment-editor__button comment-editor__button--primary" @click.prevent="submitComment()"> 發佈留言 </button> </div> </div> </form> </div> <div x-show="!isLoggedIn" style="text-align: center; padding: 2rem 0;"> <p style="color: #555;">請先 <a :href="loginUrl" style="color: #007bff; text-decoration: underline;">登入</a> 以發表留言。</p> </div> </div> <!-- /.post-comment__footer --> </div> <script type="text/javascript"> function commentComponent({ postId, blog_id, allowComment }) { return { postId, blog_id, allowComment, /* ------------------------- state -------------------------- */ user: null, isLoggedIn: false, isOwner() { return this.isLoggedIn && this.user.is_blogger && this.user.blog.id === this.blog_id }, comments: [], meta: { page: 1, pageSize: 10, pageCount: 1, totalCount: 0 }, loading: false, replyingTo: null, newComment: { content: "", visibility: 1 }, replyDraft: {}, guest: { name: "", contact: "" }, get loginUrl() { return '/auth/authorize?redirect_uri=' + encodeURIComponent(location.href) }, /* ------------------------- init -------------------------- */ async init() { await this.fetchUser() await this.fetchComments() }, /* ------------------------- user -------------------------- */ async fetchUser() { try { const res = await fetch("/auth/me") if (res.status === 401) { this.isLoggedIn = false return } const user = await res.json() this.user = user this.isLoggedIn = true } catch (e) { console.error("auth error", e) } }, /* ------------------------- comments -------------------------- */ async fetchComments(page = 1) { this.loading = true const res = await fetch( `/blog/get-comments?postId=${this.postId}&page=${page}` ) const json = await res.json() this.comments = json.data this.meta = json.meta this.comments.forEach(comment => { if (!this.replyDraft[comment.id]) { this.replyDraft[comment.id] = { content: "", visibility: "1" } } }) this.loading = false }, async loadMore() { if (this.meta.page >= this.meta.pageCount) return const nextPage = this.meta.page + 1 const res = await fetch( `/blog/get-comments?postId=${this.postId}&page=${nextPage}` ) const json = await res.json() this.comments = [...this.comments, ...json.data] this.meta = json.meta }, /* ------------------------- reply editor -------------------------- */ toggleReply(commentId) { if (this.replyingTo === commentId) { this.replyingTo = null } else { this.replyingTo = commentId if (!this.replyDraft[commentId]) { this.replyDraft[commentId] = { content: "", visibility: "public" } } } }, /* ------------------------- submit comment -------------------------- */ async submitComment() { if (!this.newComment.content.trim()) return const payload = { postId: this.postId, content: this.newComment.content, visibility: this.newComment.visibility, commenter: this.isLoggedIn ? this.user.display_name : this.guest.name, contact: this.isLoggedIn ? null : this.guest.contact } const res = await fetch("/blog/post-comment", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }) if (!res.ok) { const errorData = await res.json() alert(errorData.message || "留言失敗,請稍後再試") return } const comment = await res.json() this.comments.push(comment) this.newComment.content = "" }, /* ------------------------- submit reply -------------------------- */ async submitReply(commentId) { if (!this.isOwner()) return const draft = this.replyDraft[commentId] if (!draft || !draft.content.trim()) return const payload = { commentId: commentId, content: draft.content, visibility: draft.visibility } try { const res = await fetch("/blog/post-reply", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }) if (!res.ok) { const errorData = await res.json() alert(errorData.message || "回覆失敗,請稍後再試") return } const reply = await res.json(); const comment = this.comments.find(c => c.id === commentId) if (!comment.replies) { comment.replies = [] } comment.replies.push(reply) draft.content = "" this.replyingTo = null } catch (e) { console.error("reply error", e) } }, async changeCommentVisibility(commentId, visibility) { try { const res = await fetch("/blog/comments/visibility", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ commentId, visibility: visibility == 'show' ? 1 : 2}) }) const data = await res.json() if (!res.ok) { alert(data.message || "操作失敗") return } const comment = this.comments.find(c => c.id === commentId) if (comment) { comment.visibility = visibility == 'show' ? 1 : 2; } } catch (e) { alert("系統錯誤,請稍後再試") console.error("show comment error", e) } }, async deleteComment(commentId) { if (!confirm("確定要刪除此留言嗎?")) return try { const res = await fetch(`/blog/comments/${commentId}`, { method: "DELETE" }) const data = await res.json() if (!res.ok) { alert(data.message || "操作失敗") return } this.comments = this.comments.filter(c => c.id !== commentId) } catch (e) { console.error("delete comment error", e) } }, async changeReplyVisibility(commentId, replyId, visibility) { try { const res = await fetch("/blog/replies/visibility", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ commentId, replyId, visibility: visibility == 'show' ? 1 : 2 }) }) const data = await res.json() if (!res.ok) { alert(data.message || "操作失敗") return } const comment = this.comments.find(c => c.id === commentId) const reply = comment.replies.find(r => r.id === replyId) if (reply) { reply.visibility = visibility == 'show' ? 1 : 2; } } catch (e) { console.error("change reply visibility error", e) } }, async deleteReply(commentId, replyId) { if (!confirm("確定要刪除此回覆嗎?")) return try { const res = await fetch(`/blog/comments/${commentId}/replies/${replyId}`, { method: "DELETE" }) const data = await res.json() if (!res.ok) { alert(data.message || "操作失敗") return } const comment = this.comments.find(c => c.id === commentId) comment.replies = comment.replies.filter(r => r.id !== replyId) } catch (e) { console.error("delete reply error", e) } }, /* ------------------------- guest avatar -------------------------- */ guestAvatar() { const name = this.guest.name || "Guest" return `https://ui-avatars.com/api/?name=${encodeURIComponent(name)}` } } } </script> <section class="rcmd-related-posts" x-data="pixPostRecommendWidget({ postId: '16018663260', limit: 3, })" > <div class="rcmd-related-posts__inner"> <div class="rcmd-related-posts__header"> <div class="rcmd-related-posts__title-wrap"> <span class="rcmd-related-posts__eyebrow">Recommended</span> <h2 class="rcmd-related-posts__title">你可能也喜歡</h2> <p class="rcmd-related-posts__desc">為你精選 3 篇值得延伸閱讀的內容</p> </div> </div> <!-- loading --> <div class="rcmd-related-posts__state" x-show="loading" x-cloak> <div class="rcmd-related-posts__loading">載入推薦文章中...</div> </div> <!-- error --> <div class="rcmd-related-posts__state" x-show="!loading && error" x-cloak> <div class="rcmd-related-posts__error" x-text="error"></div> </div> <!-- empty --> <div class="rcmd-related-posts__state" x-show="!loading && !error && posts.length === 0" x-cloak> <div class="rcmd-related-posts__empty">目前沒有推薦文章</div> </div> <!-- list --> <div class="rcmd-related-posts__grid" x-show="!loading && !error && posts.length > 0" x-cloak> <template x-for="post in posts" :key="post.id"> <article class="rcmd-post-card"> <a class="rcmd-post-card__link" :href="post.url"> <div class="rcmd-post-card__image-wrap"> <img class="rcmd-post-card__image" :src="getImage(post)" :alt="post.title" loading="lazy" > </div> <div class="rcmd-post-card__body"> <div class="rcmd-post-card__meta"> <time :datetime="post.date" x-text="formatDate(post)"></time> </div> <h3 class="rcmd-post-card__title" x-text="post.title"></h3> <p class="rcmd-post-card__summary" x-show="post.summary" x-text="post.summary" ></p> <div class="rcmd-post-card__footer"> <span class="rcmd-post-card__readmore">閱讀文章</span> </div> </div> </a> </article> </template> </div> </div> </section> <script> function pixPostRecommendWidget(config = {}) { return { postId: config.postId || '', limit: Number(config.limit || 6), endpoint: '/blog/get-widget-data?name=pixPostRecommend&postId=', loading: false, error: '', posts: [], fallbackImage: 'https://picsum.photos/seed/pixpostrecommend/800/500', async init() { if (!this.postId) { this.error = '缺少 postId'; return; } this.loading = true; this.error = ''; try { const response = await fetch(`${this.endpoint}${encodeURIComponent(this.postId)}`, { method: 'GET', headers: { 'Accept': 'application/json' } }); if (!response.ok) { throw new Error(`HTTP ${response.status}`); } const result = await response.json(); if (!result || Number(result.code) !== 0 || !Array.isArray(result.data)) { throw new Error('API 回傳格式不正確'); } this.posts = result.data .slice(0, this.limit) .map(item => ({ id: item.id, title: item.title || '', url: item.url || '#', published_at: item.published_at || '', date: item.date || '', time: item.time || '', timestamp: item.timestamp || 0, views: item.views || '', feature_image: item.feature_image || null, summary: item.summary || '', })); } catch (err) { console.error('[pixPostRecommendWidget]', err); this.error = '推薦文章載入失敗'; } finally { this.loading = false; } }, getImage(post) { return post.feature_image || this.fallbackImage; }, formatDate(post) { if (post.date) { return post.date.replace(/-/g, '/'); } return post.published_at || ''; } }; } </script> <div id="pixnet-ad-after-footer"></div> </div> <!-- /.article-footer --> </div> </div> </div> </div> </div> <div id="links"> <div id="sidebar__inner"> <div id="links-row-1"> <div id="user-info" class="hslice box"> <h4 class="box-title entry-title"></h4> <div class="box-text entry-content"> <a class="user-img" href="#"> <img src="https://s3.1px.tw/blog/common/avatar/blog_cover_light.jpg" alt="" loading="lazy" style="width: 90px; height: 90px;" /> </a> <div class="user-action hoverable"> <button data-follow-state="關注" class="subscribe-btn member" ></button> </div> <dl> <dt>暱稱:</dt> <dd>deaucootvan</dd> <dt>分類:</dt> <dd> <a href="#">不設分類</a> </dd> <dt>好友:</dt> <dd> 累積中 <!-- 共75位{" "} <a href="#" id="user-info-open-friends-iframe"> (看全部) </a> --> </dd> <dt>地區:</dt> <dd> </dd> </dl> </div> </div> <div class="hslice box" data-identifier="pixHotArticle" id="hot-article"> <h4 class="box-title entry-title"></h4> <div class="box-text entry-content"> <ul id="hotArtUl"> </ul> </div> <script> (function () { async function loadHotArticle() { const box = document.querySelector('.box[data-identifier="pixHotArticle"]'); if (!box) return; const ul = box.querySelector("#hotArtUl"); if (!ul) return; if (ul.dataset.loaded) return; ul.dataset.loaded = "1"; try { const res = await fetch("/blog/get-widget-data?name=pixHotArticle", { method: "GET", headers: { "Accept": "application/json" } }); const json = await res.json(); if (json.code !== 0 || !Array.isArray(json.data)) return; const data = json.data; const fragment = document.createDocumentFragment(); data.forEach(item => { const li = document.createElement("li"); const a = document.createElement("a"); a.href = item.url; const span = document.createElement("span"); span.textContent = "(" + item.views + ") "; a.appendChild(span); a.appendChild(document.createTextNode(item.title)); li.appendChild(a); fragment.appendChild(li); }); ul.appendChild(fragment); } catch (err) { console.error("pixHotArticle load failed", err); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", loadHotArticle); } else { loadHotArticle(); } })(); </script> </div> <div class="hslice box" data-identifier="pixCategory" id="category"> <h4 class="box-title entry-title"> </h4> <div class="box-text entry-content"> <div class="box-more"></div> </div> <script type="text/javascript"> (function () { function formatNumber(num) { return new Intl.NumberFormat().format(num || 0); } function renderFolder(item) { const wrapper = document.createElement("div"); wrapper.className = "inner-box"; const h6 = document.createElement("h6"); h6.style.cursor = "pointer"; const img = document.createElement("img"); img.src = "//s.pixfs.net/blog/images/choc/plus.gif"; img.width = 11; img.height = 11; img.alt = "toggle"; const ul = document.createElement("ul"); ul.className = "category-" + item.id; ul.style.display = "none"; h6.appendChild(img); h6.appendChild(document.createTextNode(" " + item.name + " (" + (item.children?.length || 0) + ")")); h6.addEventListener("click", function () { const isHidden = ul.style.display === "none"; ul.style.display = isHidden ? "block" : "none"; img.src = isHidden ? "//s.pixfs.net/blog/images/choc/minus.gif" : "//s.pixfs.net/blog/images/choc/plus.gif"; }); (item.children || []).forEach(child => { const li = document.createElement("li"); const a = document.createElement("a"); a.href = child.url; a.textContent = child.name + " (" + formatNumber(child.post_count) + ")"; li.appendChild(a); ul.appendChild(li); }); wrapper.appendChild(h6); wrapper.appendChild(ul); return wrapper; } function renderCategoryList(data) { const ul = document.createElement("ul"); data .filter(item => item.type === "category") .forEach(item => { const li = document.createElement("li"); const a = document.createElement("a"); a.href = item.url; a.textContent = item.name + " (" + formatNumber(item.post_count) + ")"; li.appendChild(a); ul.appendChild(li); }); return ul; } async function loadPixCategory() { const box = document.querySelector('.box[data-identifier="pixCategory"]'); if (!box) return; const content = box.querySelector(".box-text.entry-content"); try { const res = await fetch("/blog/get-widget-data?name=pixCategory"); const json = await res.json(); if (json.code !== 0) return; const data = json.data; data.forEach(item => { if (item.type === "folder") { content.appendChild(renderFolder(item)); } }); const categoryList = renderCategoryList(data); content.appendChild(categoryList); } catch (err) { console.error("pixCategory load failed", err); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", loadPixCategory); } else { loadPixCategory(); } })(); </script> </div> <div class="hslice box" data-identifier="pixLatestArticle" id="latest-article"> <h4 class="box-title entry-title"> </h4> <div class="box-text entry-content"> <ul id="last-article-box"> </ul> </div> <script> (function () { async function loadLatestArticle() { const box = document.querySelector('.box[data-identifier="pixLatestArticle"]'); if (!box) return; const ul = box.querySelector("#last-article-box"); if (!ul) return; try { const res = await fetch("/blog/get-widget-data?name=pixLatestArticle", { method: "GET", headers: { "Accept": "application/json" } }); const json = await res.json(); if (json.code !== 0 || !Array.isArray(json.data)) return; const data = json.data; const fragment = document.createDocumentFragment(); data.forEach(item => { const li = document.createElement("li"); const a = document.createElement("a"); a.href = item.url; a.textContent = item.title; li.appendChild(a); fragment.appendChild(li); }); ul.appendChild(fragment); } catch (err) { console.error("pixLatestArticle load failed", err); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", loadLatestArticle); } else { loadLatestArticle(); } })(); </script> </div> <div class="hslice box" data-identifier="pixLatestComment" id="last-comment"> <h4 class="box-title entry-title"> </h4> <div class="box-text entry-content"> <div class="box-more"></div> <ul id="last-comment-box"> </ul> </div> <script> (function () { function truncate(str, len = 30) { if (!str) return ""; return str.length > len ? str.slice(0, len) + "..." : str; } async function loadLatestComment() { const box = document.querySelector('.box[data-identifier="pixLatestComment"]'); if (!box) return; const ul = box.querySelector("#last-comment-box"); if (!ul) return; if (ul.dataset.loaded) return; ul.dataset.loaded = "1"; try { const res = await fetch("/blog/get-widget-data?name=pixLatestComment"); const json = await res.json(); if (json.code !== 0 || !Array.isArray(json.data)) return; const fragment = document.createDocumentFragment(); json.data.forEach(item => { const li = document.createElement("li"); const a = document.createElement("a"); a.href = item.url; const title = truncate(item.post_title, 25); a.textContent = `[${item.time}] ${item.commenter} 於文章「${title}」`; li.appendChild(a); if (item.visibility === "public") { li.appendChild(document.createTextNode("留言:")); const br = document.createElement("br"); li.appendChild(br); li.appendChild(document.createTextNode(item.content)); } else { li.appendChild( document.createTextNode("發表了一則私密留言") ); } fragment.appendChild(li); }); ul.appendChild(fragment); } catch (err) { console.error("pixLatestComment load failed", err); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", loadLatestComment); } else { loadLatestComment(); } })(); </script> </div> <div class="hslice box" data-identifier="pixHits" id="counter"> <h4 class="box-title entry-title">參觀人氣</h4> <div class="box-text entry-content"> <ul> <li>本日人氣:<span id="blog_hit_daily"></span></li> <li>累積人氣:<span id="blog_hit_total"></span></li> </ul> </div> <script> (function () { async function loadPixHits() { const box = document.querySelector("#counter"); if (!box) return; const dailyEl = box.querySelector("#blog_hit_daily"); const totalEl = box.querySelector("#blog_hit_total"); if (!dailyEl || !totalEl) return; // 避免重複載入 if (box.dataset.loaded) return; box.dataset.loaded = "1"; try { const res = await fetch("/blog/get-widget-data?name=pixHits", { method: "GET", headers: { "Accept": "application/json" } }); const json = await res.json(); if (json.code !== 0 || !json.data) return; const data = json.data; dailyEl.textContent = data.views_today ?? "0"; totalEl.textContent = data.views_total ?? "0"; } catch (err) { console.error("pixHits load failed", err); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", loadPixHits); } else { loadPixHits(); } })(); </script> </div> </div> <div id="links-row-2"> <div id="sticky-sidebar-ad"></div> </div> </div> </div> </div> <div id="footer"> </div> <img src="/api/track/pv?postId=16018663260" alt="Blog Stats" width="1" height="1" style="display:none;" /> <script type="text/javascript" async src="https://static.1px.tw/blog/v1p2/js/stats.min.js?v=1777073750"></script> </div> <div id="extradiv11"></div> <div id="extradiv10"></div> <div id="extradiv9"></div> <div id="extradiv8"></div> </div> <div id="extradiv7"></div> <div id="extradiv6"></div> <div id="extradiv5"></div> <div id="extradiv4"></div> </div> <div id="extradiv3"></div> <div id="extradiv2"></div> <div id="extradiv1"></div> <div id="extradiv0"></div> </div> </div> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TRLQMPKX" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <!-- Pixnet SDK --> <script type="text/javascript"> document.addEventListener("DOMContentLoaded", function () { // datalayer push event window.dataLayer = window.dataLayer || []; window.dataLayer.push({ 'event': 'hydration_complete' }) }); </script> <!-- End Pixnet SDK --> <div x-data="adultWarning()" x-init="init()" x-show="visible" x-cloak class="aw-overlay" :class="{ 'mobile': isMobile }" > <div class="aw-modal"> <div class="aw-icon"> ⚠️ </div> <h2 class="aw-title">成人內容提醒</h2> <p class="aw-desc"> 本部落格內容僅限年滿十八歲者瀏覽。<br> 若您未滿十八歲,請立即離開。 </p> <p class="aw-sub"> 已滿十八歲者,亦請勿將內容提供給未成年人士。 </p> <div class="aw-actions"> <button class="aw-btn primary" @click="accept()">我已滿18歲</button> <button class="aw-btn secondary" @click="decline()">離開</button> </div> </div> </div> <script> document.addEventListener('alpine:init', () => { Alpine.data('adultWarning', () => ({ visible: false, isMobile: false, storageKey: 'adult_warning_accepted_at', init() { this.isMobile = window.innerWidth < 768; if (!window.PIXNET?.options?.AdultWarning) return; const ts = localStorage.getItem(this.storageKey); if (ts && Date.now() - parseInt(ts) < 4 * 60 * 60 * 1000) return; this.visible = true; // 🔒 防止背景滾動 document.body.classList.add('modal-open'); }, accept() { localStorage.setItem(this.storageKey, Date.now().toString()); this.close(); }, decline() { window.location.href = 'https://www.pixnet.net/'; // 或其他安全的網站 }, close() { this.visible = false; document.body.classList.remove('modal-open'); } })) }) </script> <!-- end of adult warning --> </body> </html>