จะตรวจสอบได้อย่างไรว่า JavaScript ถูกปิดการใช้งาน?


659

เช้านี้มีโพสต์ถามว่ามีคนปิดการใช้งานจาวา จากนั้นฉันก็เริ่มสงสัยว่าอาจใช้เทคนิคใดในการพิจารณาว่าผู้ใช้ปิดใช้งานหรือไม่

ไม่มีใครรู้วิธีสั้น ๆ / ง่ายๆในการตรวจสอบว่า JavaScript ถูกปิดการใช้งานหรือไม่ ฉันตั้งใจจะให้คำเตือนว่าไซต์นั้นไม่สามารถทำงานได้อย่างถูกต้องหากไม่มีเบราว์เซอร์ที่เปิดใช้งาน JS

ในที่สุดฉันก็ต้องการที่จะเปลี่ยนเส้นทางพวกเขาไปยังเนื้อหาที่สามารถทำงานได้ในกรณีที่ไม่มี JS แต่ฉันต้องการการตรวจจับนี้เป็นตัวยึดเริ่มต้น


คุณต้องการทำอะไรกับข้อมูลนี้? มันสามารถเปลี่ยนคำตอบที่คุณได้รับ - เช่นการเพิ่มประสิทธิภาพที่ก้าวหน้าควรได้รับการสนับสนุนมากกว่าการพยายามตรวจสอบว่า JavaScript ถูกปิดการใช้งานและดำเนินการบางอย่างตามนั้น
Jonny Buchanan

การปรับปรุงแบบก้าวหน้าเป็นสิ่งที่ฉันกำลังมองหา ฉันต้องการให้ ot สามารถเปลี่ยนเส้นทางไปยังเนื้อหาทางเลือกที่จะทำงานอย่างถูกต้องในส่วนที่ไม่สำคัญของการเปิดใช้งาน JS หรือเบราว์เซอร์ที่มีความสามารถ
MikeJ

1
@expiredninja โพสต์นี้จาก Nicholas Zakasพูดว่าประมาณ 2% ถึงแม้ว่าจะมีอายุเกินหนึ่งปีก็ตาม
sdleihssirhc

วิธีที่ง่ายที่สุดคือการใช้ noscript เพื่อแสดงไซต์ที่ไม่ใช่จาวาสคริปต์และใช้จาวาสคริปต์เพื่อแสดงองค์ประกอบที่ขึ้นกับจาวาสคริปต์โดยการปรับเปลี่ยนการแสดงสไตล์
Myforwik

คำตอบ:


286

ฉันคิดว่าคุณกำลังพยายามตัดสินใจว่าจะส่งเนื้อหาที่ปรับปรุงด้วย JavaScript หรือไม่ การใช้งานที่ดีที่สุดลดลงอย่างหมดจดเพื่อให้เว็บไซต์ยังคงทำงานได้โดยไม่ต้องใช้ JavaScript ฉันยังสมมติว่าคุณหมายถึงการตรวจจับฝั่งเซิร์ฟเวอร์แทนที่จะใช้<noscript>องค์ประกอบด้วยเหตุผลที่ไม่สามารถอธิบายได้

ไม่มีวิธีที่ดีในการตรวจจับ JavaScript ฝั่งเซิร์ฟเวอร์ อีกวิธีหนึ่งคือการตั้งค่าคุกกี้โดยใช้ JavaScriptและทดสอบคุกกี้นั้นโดยใช้สคริปต์ฝั่งเซิร์ฟเวอร์เมื่อมีการดูหน้าเว็บครั้งต่อไป อย่างไรก็ตามการทำเช่นนี้จะไม่เหมาะสำหรับการตัดสินใจว่าจะส่งเนื้อหาใดเนื่องจากไม่สามารถแยกแยะผู้เข้าชมได้หากไม่มีคุกกี้จากผู้เข้าชมใหม่หรือผู้เข้าชมที่กำลังบล็อกคุกกี้


129
<noscript> เป็นวิธีที่แม่นยำที่สุดในการระบุเนื้อหาที่ไม่ใช่ javascript - และจากนั้นตรวจพบว่า javascript ถูกปิดใช้งานตรวจสอบว่าเปิดใช้งานหรือไม่ ดังนั้นแสดงข้อความ "คุณต้องมีจาวาสคริปต์เพื่อใช้เว็บไซต์ของฉัน" ตามค่าเริ่มต้น แต่ซ่อนด้วยฟังก์ชั่นจาวาสคริปต์ทันทีที่โหลด
matt lohkamp

58
@matt lohkamp: หรือแม้กระทั่งซ่อนข้อความโดยค่าเริ่มต้นและวาง<style>บล็อกภายใน<noscript>เพื่อยกเลิกการซ่อน (ไม่มีการ reflow ที่นั่นหากเปิดใช้งาน JS) น่าแปลกใจว่าสิ่งนี้ใช้ได้กับเบราว์เซอร์รุ่นใหม่ทั้งหมดและแม้แต่ใน IE6
Piskvor ออกจากอาคารไปเมื่อ

7
@matt - ฉันทำสิ่งนี้มาระยะหนึ่งแล้ว แต่ข้อความก็ยังอยู่พักหนึ่งขณะที่การเชื่อมต่อช้าทำให้ผู้ใช้สับสน ฉันอยู่ที่นี่กำลังมองหาทางออกที่แตกต่าง @Piskvor - แท็ก <noscript> ในส่วนหัวจะไม่ผ่านการตรวจสอบและแท็ก <style> ในเนื้อหาจะไม่ผ่านการตรวจสอบ
Ben

20
... ยกเว้นทำไมคุณถึงเกี่ยวข้องกับการตรวจสอบ คุณกำลังตรวจสอบเพียงเพื่อตรวจสอบ? มันอาจจะไม่ "ถูกต้อง" แต่ถ้ามันใช้งานได้และทำให้สำเร็จ "ด้วยสิ่งสกปรกเล็กน้อยภายใต้ประทุน" ปัญหาคืออะไร? ไม่ต้องกังวลฉันจะไม่ตัดสิน ;-)
keif

4
มันยังคงใช้ได้ถ้าคุณใช้แอตทริบิวต์ style กับองค์ประกอบที่กำหนดภายในแท็ก <noscript> (เช่น <noscript> <div style = "color: red;"> blahblah </div> </noscript> หรือ sg. คล้ายกัน) . แต่มันก็ยังคงใช้ได้ถ้าคุณใส่ <style> BLOCK ตามปกติในส่วนหัวที่กำหนดรูปแบบขององค์ประกอบที่จัดหมวดหมู่. noscript (หรือคล้ายกัน) และในเนื้อหาภายในแท็ก <noscript> คุณแค่ให้องค์ประกอบที่กำหนด คลาส. noscript ที่กำหนดไว้ก่อนหน้านี้เช่นนี้: <noscript> <div class = "noscript"> blahblah </div> </noscript>
Sk8erPeter

360

ฉันต้องการเพิ่ม. 02 ของฉันที่นี่ มันไม่ได้เป็นกระสุน 100% แต่ฉันคิดว่ามันดีพอ

ปัญหาสำหรับฉันด้วยตัวอย่างที่ต้องการในการจัดเรียงข้อความ "ไซต์นี้ทำงานได้ไม่ดีหากไม่มี Javascript" ก็คือคุณต้องตรวจสอบให้แน่ใจว่าเว็บไซต์ของคุณทำงานได้ดีโดยไม่ใช้ Javascript และเมื่อคุณเริ่มต้นบนถนนสายนั้นจากนั้นคุณเริ่มตระหนักว่าไซต์ควรกันกระสุนด้วยการปิด JS และนั่นเป็นงานใหญ่ชิ้นหนึ่ง

ดังนั้นสิ่งที่คุณต้องการจริงๆคือ "การเปลี่ยนเส้นทาง" ไปยังหน้าที่ระบุว่า "เปิดใช้งาน JS, silly" แต่แน่นอนคุณไม่สามารถเปลี่ยนเมตาได้อย่างน่าเชื่อถือ ดังนั้นนี่คือข้อเสนอแนะ:

<noscript>
    <style type="text/css">
        .pagecontainer {display:none;}
    </style>
    <div class="noscriptmsg">
    You don't have javascript enabled.  Good luck with that.
    </div>
</noscript>

... ที่ทุกเนื้อหาในเว็บไซต์ของคุณเป็นห่อด้วย div ของชั้น "pagecontainer" a CSS ภายในแท็ก noscript จะซ่อนเนื้อหาของหน้าทั้งหมดของคุณและแสดงข้อความ "no JS" ที่คุณต้องการแสดงแทน นี่คือสิ่งที่ Gmail ดูเหมือนจะทำ ... และถ้ามันดีพอสำหรับ Google มันก็ดีสำหรับเว็บไซต์เล็ก ๆ ของฉัน


12
@steve พยายามตรวจสอบ google.com หรือไม่ การตรวจสอบความถูกต้องเป็นตัวกำหนดว่าเอกสารจะปิดลงตามแผ่นข้อมูลจำเพาะได้อย่างไรไม่มีผลกระทบต่อการใช้งานของหน้ากระดาษ แต่อย่างใด
JKirchartz

71
@JonasGeiregat มีอะไรผิดปกติในการบังคับให้ผู้ใช้ต้องใช้ Javascript หากเว็บแอปของคุณถูกสร้างขึ้นและต้องการให้ Javascript ทำงาน? ฉันได้ยินความคิดเห็นนี้บ่อยเกินไป แต่มันก็ใช้ได้กับเว็บไซต์ที่ง่ายที่สุดเท่านั้น ลองใช้ Facebook โดยไม่ต้อง JS และดูว่าเกิดอะไรขึ้น หากแอปของคุณสร้างขึ้นสำหรับ Javascript แล้วมีอะไรผิดปกติกับการเปิดใช้งาน 99% ของผู้ใช้หรือไม่
Lee Benson

19
@Lee ยอดนิยมบนเล็บคุณสามารถทำได้มากสำหรับผู้ใช้ก่อนที่คุณจะวาดเส้นในสิ่งที่คุณจะสนับสนุน เราคาดหวังให้ผู้ใช้ทุกคนมีอุปกรณ์ที่เปิดใช้งานอินเทอร์เน็ตฉันควรติดตั้งไซต์กระดาษของฉันสำหรับผู้ที่ปฏิเสธการเข้าถึงอินเทอร์เน็ตหรือไม่
Kolors

14
@Kolors ฉันได้แสดงความคิดเห็นนั้นในเดือนมีนาคม 2012 และฉันจะยืนยันว่ามันเป็นทวีคูณจริงวันนี้ ตั้งแต่นั้นมาเราได้มีดาวตก Angular.Js, Famo.us และตันของห้องสมุดที่น่าตื่นตาตื่นใจที่ทั้งหมดต้องใช้จาวาสคริปต์ที่จะได้เริ่มต้น ฉันสงสัยว่าผู้ใช้ที่เลือกที่จะปิดการใช้งาน JS กำลังพยายามทำให้สำเร็จจริง ๆ ... ชัดเจนว่าพวกเขาไม่ได้ท่องเว็บเดียวกับพวกเราที่เหลือและไม่มีเหตุผลที่ บริษัท จะต้องลดขนาดเว็บไซต์ให้เล็กที่สุด กลุ่มย่อยของผู้ใช้ที่ดื้อรั้น ...
Lee Benson

6
ใช่และฉันสงสัยว่าทำไมฉันไม่สามารถคว่ำคำตอบของคุณได้เนื่องจากฉันลืมเปิดใช้งาน JS :-) ของฉัน) ฉันชอบและใช้โซลูชันของคุณ! ขอบคุณ!
Garavani

198

noscript บล็อกจะถูกดำเนินการเมื่อ JavaScript ถูกปิดใช้งานและโดยทั่วไปจะใช้เพื่อแสดงเนื้อหาทางเลือกอื่น ๆ ที่คุณสร้างขึ้นใน JavaScript เช่น

<script type="javascript">
    ... construction of ajaxy-link,  setting of "js-enabled" cookie flag, etc..
</script>
<noscript>
    <a href="next_page.php?nojs=1">Next Page</a>
</noscript>

ผู้ใช้ที่ไม่มี js จะได้รับnext_pageลิงก์ - คุณสามารถเพิ่มพารามิเตอร์ที่นี่เพื่อให้คุณทราบในหน้าถัดไปว่าพวกเขามาจากลิงก์ JS / non-JS หรือพยายามตั้งค่าคุกกี้ผ่าน JS โดยที่ไม่มีนัยถึง JS ถูกปิดใช้งาน. ตัวอย่างเหล่านี้ทั้งสองมีความสำคัญและเปิดรับการจัดการ แต่คุณจะได้รับแนวคิด

หากคุณต้องการแนวคิดเชิงสถิติอย่างหมดจดเกี่ยวกับจำนวนผู้ใช้ของคุณที่ปิดใช้งานจาวาสคริปต์คุณสามารถทำสิ่งต่อไปนี้:

<noscript>
    <img src="no_js.gif" alt="Javascript not enabled" />
</noscript>

จากนั้นตรวจสอบบันทึกการเข้าถึงของคุณเพื่อดูว่าภาพนี้ถูกโจมตีกี่ครั้ง วิธีการแก้ปัญหาที่หยาบเล็กน้อย แต่จะให้เปอร์เซ็นต์ความคิดที่ดีสำหรับฐานผู้ใช้ของคุณ

วิธีการข้างต้น (การติดตามรูปภาพ) จะใช้งานไม่ได้กับเบราว์เซอร์แบบข้อความเท่านั้นหรือที่ไม่รองรับ js เลยดังนั้นหากฐานผู้ใช้ของคุณเหวี่ยงไปทางด้านนั้นเป็นหลักนี่อาจไม่ใช่วิธีที่ดีที่สุด


7
มันไม่ได้มีประสิทธิภาพมาก ตัวอย่างเช่นจะไม่นับใครเลยที่มีเบราว์เซอร์แบบข้อความเท่านั้นซึ่งโดยปกติจะไม่มีการสนับสนุน JavaScript อย่างน้อยที่สุดคุณควรปิดใช้งานการแคชสำหรับภาพนั้น
Jim

3
การเรียกดูที่ไม่รองรับ JS หรือไม่เพียง แต่ไม่สนใจแท็ก noscript และแสดงภาพ?
LKM

1
@LKM: ขึ้นอยู่กับว่าพวกเขาเขียนอย่างไรส่วนใหญ่จะเป็นไปได้ดังนั้นคุณจะทำให้มันเป็นจุด 1x1px ตัวเลือกนั้นส่วนใหญ่ใช้สำหรับการติดตามรูปแบบการใช้งานฝั่งเซิร์ฟเวอร์ดังนั้นจะยังคงโอเคเนื่องจากผู้ใช้ไม่มีการเรียกใช้จาวาสคริปต์
ConroyP

ทราบว่าขณะนี้ยังไม่มีข้อผิดพลาดกับ IE8 และแท็ก noscript ถ้าคุณสไตล์มัน ... ดู positioniseverything.net/explorer.html
อเล็กซ์

2
นอกจากนี้คุณยังสามารถแสดงภาพนั้นเป็นสคริปต์ฝั่งเซิร์ฟเวอร์, ตั้งค่าประเภท mime และใช้เพื่อบันทึกข้อมูลบางอย่างเกี่ยวกับผู้ใช้หรือวางคุกกี้ ... px.sklar.com/code.html/id=256
JKirchartz

46

นี่คือสิ่งที่ได้ผลสำหรับฉัน: มันเปลี่ยนเส้นทางผู้เข้าชมหากปิดการใช้งานจาวาสคริปต์

<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>

6
สิ่งนี้ไม่ถูกต้อง องค์ประกอบ noscript ไม่สามารถมีองค์ประกอบเมตา ฉันจะไม่เชื่อว่าสิ่งนี้จะทำงานได้อย่างน่าเชื่อถือในเบราว์เซอร์ทั้งหมด (รวมถึงเบราว์เซอร์ในอนาคตที่คุณไม่สามารถทดสอบได้) เนื่องจากอาจทำการกู้คืนข้อผิดพลาดได้หลายวิธี
Quentin

15
สิ่งนี้อาจไม่ถูกต้อง แต่ดูที่รหัสของ Facebook มันใช้โซลูชันเดียวกันในส่วน <head> ซึ่งไม่ได้หมายความว่ามันเป็นทางออกที่ดีมากเพราะรหัสของ Facebook นั้นไกลจากรหัสที่ถูกต้อง แต่อาจหมายถึงว่ามันเป็น ทำงานบนเบราว์เซอร์ของผู้ใช้หลายคนซึ่งอาจเป็นสิ่งสำคัญ แต่มันเป็นความจริงที่ไม่แนะนำจริงๆ นี่คือรหัสของพวกเขา: <noscript> <meta http-equiv = รีเฟรชเนื้อหา = "0; URL = / about / messages /? _ fb_noscript = 1" /> </noscript>
Sk8erPeter

IE9 (อย่างน้อย) มีการตั้งค่า "allow META REFRESH" ฉันดูเหมือนจะไม่ปิดเครื่อง แต่มีคนที่ไม่ชอบจาวาสคริปต์ แต่ถ้าคุณต้องการ 100% ไม่ใช่สิ่งนี้
jenson-button-event

มันถูกต้องใน HTML5
Naszta

1
สิ่งนี้ทำลายลิงก์เมื่อพยายามแชร์บน Linkedin เราพบวิธีที่ยากลำบาก ... นี่ไม่ใช่ความคิดที่ดี ตั้งแต่ LinkedIn ดังนี้รีเฟรชเมตาไม่คำนึงถึงแท็ก Og ฯลฯ
SomeDudeSomewhere

44

หากกรณีการใช้งานของคุณคือคุณมีแบบฟอร์ม (เช่นแบบฟอร์มเข้าสู่ระบบ) และสคริปต์ฝั่งเซิร์ฟเวอร์ของคุณจำเป็นต้องทราบว่าผู้ใช้เปิดใช้งาน JavaScript หรือไม่คุณสามารถทำสิ่งนี้:

<form onsubmit="this.js_enabled.value=1;return true;">
    <input type="hidden" name="js_enabled" value="0">
    <input type="submit" value="go">
</form>

สิ่งนี้จะเปลี่ยนค่าของ js_enabled เป็น 1 ก่อนส่งแบบฟอร์ม หากสคริปต์ฝั่งเซิร์ฟเวอร์ของคุณได้รับ 0 จะไม่มี JS หากได้รับ 1, JS!


44

ฉันขอแนะนำให้คุณใช้วิธีอื่นโดยเขียน JavaScript ที่ไม่เป็นการรบกวน

ทำให้คุณสมบัติของโครงการของคุณใช้งานได้กับผู้ใช้ที่ปิดใช้งาน JavaScript และเมื่อคุณทำเสร็จแล้วให้ใช้การปรับปรุง UI UI ของคุณ

https://en.wikipedia.org/wiki/Unobtrusive_JavaScript


145
ชีวิตสั้นเกินไป มันคือ 2012- เปิดใช้งานจาวาสคริปต์หรือกลับบ้าน
Yarin

25
"ชีวิตสั้นเกินไปมันคือปี 2012 - เปิดใช้งาน JavaScript หรือกลับบ้าน!" เป็นข้อความเล็กน้อยที่สมบูรณ์แบบที่จะแสดงในกรณีที่ไม่มี JS ลงชื่อเข้าใช้เพียงเพื่อบอกคุณว่า @Yarin

5
ฉันเพิ่งเข้าสู่ระบบเพื่อบอกว่ายอดเยี่ยม! @Yarin ฉันกำลังสร้างไซต์เล็ก ๆ ที่ไม่เป็นสาธารณะ (พิจารณาเหมือนอินทราเน็ต แต่สำหรับเพื่อนที่มารวมตัวกันเพื่อทำงานในโครงการ) ฉันทำให้มันเป็นสปาและไม่ได้ใส่ใจที่จะใส่ลงไปในทางเลือก JavaScript ที่ไม่สร้างความรำคาญจะเพิ่มภาระงานให้ฉันเป็นสองเท่าของแนวคิด SPA ด้วยไลบรารี javascript ที่ทันสมัยเช่น Knockout, Jquery และอื่น ๆ เราต้องยอมรับว่าไม่ใช่ทุกเว็บไซต์ที่จะสามารถสร้าง "ไม่สร้างความรำคาญ" ได้ Javascript คืออนาคตของเว็บ
lassombra

5
@Yarin ฉันสร้างแอพ PHP / JS เพื่อการใช้ชีวิตฉันไม่เคยพลาดทางเลือก ... ถ้ามันไม่ได้ผลสำหรับคนที่พวกเขาติดต่อฉันและฉันบอกพวกเขาให้หยุดใช้ชีวิตในอดีตและเปิดใช้งาน JS
Sam

2
@ n611x007 - สิ่งที่ผิดจรรยาบรรณซ่อนอยู่ในรหัสทั้งหมดในทุกอุปกรณ์ไม่ว่าจะเป็นฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ มันไม่ใช่รหัสความผิดมันเป็นความผิดของมนุษย์ ฉันค้นหาแคมเปญต่อต้าน JS ironic เพราะคุณยังคงใช้ ISP ของบุคคลที่สามเพื่อเชื่อมต่ออินเทอร์เน็ตยังคงใช้คอมพิวเตอร์ที่มีฮาร์ดแวร์ / เฟิร์มแวร์ของบุคคลที่สามยังคงใช้เครือข่ายเซลล์ที่ไม่ปลอดภัยที่สามารถเข้าถึงได้โดยบุคคลที่สาม ระบบปฏิบัติการที่ไม่ตรงกันของบุคคลที่สามยังคงใช้ทีวีจอแบนที่ใช้บริการการอัปเดตแบบเปิดกว้างของบุคคลที่สามเป็นต้นคุณมักตกเป็นเหยื่อของช่องทาง MITM-ish เสมอไม่ว่าคุณจะปิด JS ในเบราว์เซอร์ของคุณก็ตาม
dhaupin

35

<noscript>ไม่ได้มีความจำเป็นและไม่พูดถึงไม่ได้รับการสนับสนุนใน XHTML

ตัวอย่างการทำงาน :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
<head>
    <title>My website</title>
    <style>
      #site {
          display: none;
      }
    </style>
    <script src="http://code.jquery.com/jquery-latest.min.js "></script>
    <script>
      $(document).ready(function() {
          $("#noJS").hide();
          $("#site").show();
      });
    </script>
</head>
<body>
    <div id="noJS">Please enable JavaScript...</div>
    <div id="site">JavaScript dependent content here...</div>
</body>
</html>

ในตัวอย่างนี้หากเปิดใช้งาน JavaScript คุณจะเห็นไซต์ หากไม่เป็นเช่นนั้นคุณจะเห็นข้อความ "โปรดเปิดใช้งาน JavaScript" วิธีที่ดีที่สุดในการทดสอบว่ามีการเปิดใช้งาน JavaScript หรือไม่ก็คือลองใช้ JavaScript! ถ้ามันใช้งานได้มันเปิดใช้งานถ้าไม่แสดงว่าไม่ใช่ ...


1
ฮา XHTML นั่นคือวันที่ ... สิ่งต่าง ๆ มีการเปลี่ยนแปลงมากมาย: developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript
Stephan Weinhold

ทำไมต้องใช้ jquery ...
Luis Villavicencio

@StephanWeinhold, JSF ใช้ XHTML
Arash

34

ใช้คลาส. no-js บนเนื้อความและสร้างสไตล์จาวาสคริปต์ที่ไม่ใช่โดยยึดตามคลาสแม่. no-js หากปิดการใช้งานจาวาสคริปต์คุณจะได้รับรูปแบบที่ไม่ใช่จาวาสคริปต์ทั้งหมดหากมี JS รองรับคลาส. no-js จะถูกแทนที่โดยให้สไตล์ทั้งหมดตามปกติ

 document.body.className = document.body.className.replace("no-js","js");

เคล็ดลับที่ใช้ใน HTML5 boilerplate http://html5boilerplate.com/ผ่านทาง modernizr แต่คุณสามารถใช้จาวาสคริปต์หนึ่งบรรทัดเพื่อแทนที่คลาส

แท็ก noscript ไม่เป็นไร แต่ทำไมมีสิ่งพิเศษใน html ของคุณเมื่อสามารถทำได้ด้วย css


5
ไม่อยากจะเชื่อเลยว่ามันต้องใช้เวลานานกว่าจะมีคนพูดถึง.nojsคลาส นี่เป็นหนึ่งในแนวทางที่ราบรื่นและnoscriptน่าละอายที่สุด
โมเสส

15

ค่อนข้างยาก แต่ (ผมให้ความคิดแก่ฉัน)

CSS:

.pagecontainer {
  display: none;
}

JS:

function load() {
  document.getElementById('noscriptmsg').style.display = "none";
  document.getElementById('load').style.display = "block";
  /* rest of js*/
}

HTML:

<body onload="load();">

  <div class="pagecontainer" id="load">
    Page loading....
  </div>
  <div id="noscriptmsg">
    You don't have javascript enabled. Good luck with that.
  </div>

</body>

จะทำงานในกรณีใด ๆ ใช่ไหม? แม้ว่าแท็ก noscript จะไม่ได้รับการสนับสนุน (จำเป็นต้องใช้ css บางตัวเท่านั้น) มีใครรู้วิธีการที่ไม่ใช่ css?


13

คุณสามารถใช้ข้อมูลโค้ด JS แบบง่ายเพื่อกำหนดค่าของฟิลด์ที่ซ่อนอยู่ เมื่อโพสต์กลับคุณรู้ว่า JS ถูกเปิดใช้งานหรือไม่

หรือคุณสามารถลองเปิดหน้าต่างป๊อปอัปที่คุณปิดอย่างรวดเร็ว (แต่อาจปรากฏให้เห็น)

นอกจากนี้คุณยังมีแท็ก NOSCRIPT ที่คุณสามารถใช้เพื่อแสดงข้อความสำหรับเบราว์เซอร์ที่ปิดใช้งาน JS


นี่ไม่ใช่คำตอบที่ดี โซลูชันแรกต้องการการโหลดหน้าซ้ำและการส่งแบบฟอร์ม โซลูชันที่สองเปิดป็อปอัพ (ack!) และปิด "รวดเร็ว" - จากฝั่งไคลเอ็นต์หรือไม่ -1
เบ็น

บางครั้งคุณจำเป็นต้องรู้ว่าฝั่งเซิร์ฟเวอร์หากไซต์เปิดใช้งาน JS หรือไม่ดังนั้นฉันไม่เห็นว่าคุณจะทำได้อย่างไรนอกจากโพสต์บางสิ่งกลับไป ยอมรับว่าป๊อปอัพน่าเกลียดฉันไม่แน่ใจจริงๆเกี่ยวกับเรื่องนี้ แต่มันควรจะเป็นไปได้ที่จะเปิดป๊อปอัปนอกพื้นที่ที่มองเห็นของหน้าจอเพื่อให้ผู้ใช้ไม่ถูกรบกวนจากสิ่งนี้ ไม่สวยงาม แต่ใช้งานได้และไม่มีการโหลดหน้าซ้ำ
rslite

สแปมบอทยังโพสต์ไปยังเขตข้อมูลที่ซ่อนอยู่
Janis Veinbergs

13

คุณจะต้องดูที่แท็ก noscript

<script type="text/javascript">
...some javascript script to insert data...
</script>
<noscript>
   <p>Access the <a href="http://someplace.com/data">data.</a></p>
</noscript>

12

แท็ก noscript ทำงานได้ดี แต่จะต้องการการร้องขอหน้าเพิ่มเติมแต่ละครั้งเพื่อให้บริการไฟล์ JS ที่ไม่มีประโยชน์เนื่องจาก noscript เป็นการตรวจสอบฝั่งไคลเอ็นต์

คุณสามารถตั้งค่าคุกกี้ด้วย JS แต่เมื่อมีคนอื่นชี้ให้เห็นสิ่งนี้อาจล้มเหลว เป็นการดีที่คุณต้องการตรวจสอบฝั่งไคลเอ็นต์ JS และโดยไม่ใช้คุกกี้ให้ตั้งค่าฝั่งเซิร์ฟเวอร์เซสชันสำหรับผู้ใช้ที่ระบุว่าเปิดใช้งาน JS แล้ว

ความเป็นไปได้คือการเพิ่มภาพ 1x1 แบบไดนามิกโดยใช้ JavaScript โดยที่แอตทริบิวต์ src เป็นสคริปต์ฝั่งเซิร์ฟเวอร์ สคริปต์นี้ทั้งหมดจะถูกบันทึกลงในเซสชันผู้ใช้ปัจจุบันที่เปิดใช้งาน JS ($ _SESSION ['js_enabled']) จากนั้นคุณสามารถส่งภาพเปล่า 1x1 กลับไปที่เบราว์เซอร์ สคริปต์จะไม่ทำงานสำหรับผู้ใช้ที่ปิดใช้งาน JS ดังนั้นจะไม่มีการตั้งค่า $ _SESSION ['js_enabled'] จากนั้นสำหรับหน้าเพิ่มเติมที่ให้บริการแก่ผู้ใช้รายนี้คุณสามารถตัดสินใจว่าจะรวมไฟล์ JS ภายนอกทั้งหมดของคุณหรือไม่ แต่คุณต้องการรวมการตรวจสอบอยู่เสมอเนื่องจากผู้ใช้ของคุณบางคนอาจใช้ Add-on NoScript Firefox หรือมี JS ปิดใช้งานชั่วคราวด้วยเหตุผลอื่น

คุณอาจต้องการรวมการตรวจสอบนี้ไว้ใกล้กับส่วนท้ายของหน้าเพื่อให้คำขอ HTTP เพิ่มเติมไม่ทำให้การแสดงผลหน้าเว็บของคุณช้าลง


12

เพิ่มสิ่งนี้ไปยังแท็ก HEAD ของแต่ละหน้า

<noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
</noscript>

ดังนั้นคุณมี:

<head>
    <noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
    </noscript>
</head>

ขอบคุณเจย์


12

เพราะฉันต้องการให้สิ่งที่คุ้มค่าแก่การดูเบราว์เซอร์ฉันมักจะใช้เคล็ดลับนี้:

ขั้นแรกส่วนใด ๆ ของหน้าเว็บที่ต้องการ JavaScript เพื่อให้ทำงานได้อย่างถูกต้อง (รวมถึงองค์ประกอบ HTML แบบพาสซีฟที่ได้รับการแก้ไขผ่านการเรียกใช้ getElementById เป็นต้น) ได้รับการออกแบบมาให้สามารถใช้งานได้ (ออกแบบราวกับว่ามันไม่ได้มี)

องค์ประกอบใด ๆ ที่จะต้องใช้ JavaScript ฉันวางไว้ภายในแท็กบางอย่างเช่น:

<span name="jsOnly" style="display: none;"></span>

จากนั้นที่จุดเริ่มต้นของเอกสารของฉันฉันใช้.onloadหรือdocument.readyภายในวงของgetElementsByName('jsOnly')การตั้งค่าการ.style.display = "";เปิดใช้งานองค์ประกอบที่ขึ้นกับ JS อีกครั้ง ด้วยวิธีนี้เบราว์เซอร์ที่ไม่ใช่ JS ไม่จำเป็นต้องเห็นส่วนที่ขึ้นกับ JS ของไซต์และหากมีก็จะปรากฏขึ้นทันทีเมื่อพร้อม

เมื่อคุณคุ้นเคยกับวิธีการนี้แล้วมันค่อนข้างง่ายที่จะไฮบริดโค้ดของคุณเพื่อจัดการกับทั้งสองสถานการณ์แม้ว่าตอนนี้ฉันกำลังทดลองกับnoscriptแท็กและคาดว่ามันจะมีข้อได้เปรียบเพิ่มเติม


10

นี่คือรหัสโซลูชันที่ "สะอาด" ใช้:

<noscript>
    <style>
        body *{ /*hides all elements inside the body*/
            display: none;
        }
        h1{ /* even if this h1 is inside head tags it will be first hidden, so we have to display it again after all body elements are hidden*/
            display: block;
        }
    </style>
    <h1>JavaScript is not enabled, please check your browser settings.</h1>
</noscript>

9

วิธีแก้ไขปัญหาทั่วไปคือเมตาแท็กร่วมกับ noscript เพื่อรีเฟรชหน้าเว็บและแจ้งเตือนเซิร์ฟเวอร์เมื่อปิดการใช้งาน JavaScript ดังนี้:

<!DOCTYPE html>
<html lang="en">
    <head>
        <noscript>
            <meta http-equiv="refresh" content="0; /?javascript=false">
        </noscript>
        <meta charset="UTF-8"/>
        <title></title>
    </head>
</html>

ในตัวอย่างด้านบนเมื่อปิดใช้งาน JavaScript เบราว์เซอร์จะเปลี่ยนเส้นทางไปยังหน้าแรกของเว็บไซต์ใน 0 วินาที นอกจากนี้ยังจะส่งพารามิเตอร์ javascript = false ไปยังเซิร์ฟเวอร์

สคริปต์ฝั่งเซิร์ฟเวอร์เช่น node.js หรือ PHP สามารถแยกพารามิเตอร์และรู้ว่า JavaScript ถูกปิดใช้งาน จากนั้นสามารถส่งรุ่นพิเศษที่ไม่ใช่จาวาสคริปต์ของเว็บไซต์ไปยังไคลเอนต์


8

หากปิดการใช้งานจาวาสคริปต์รหัสฝั่งไคลเอ็นต์ของคุณจะไม่ทำงานดังนั้นฉันถือว่าคุณหมายความว่าคุณต้องการให้ข้อมูลนั้นอยู่ในฝั่งเซิร์ฟเวอร์ ในกรณีนี้noscriptมีประโยชน์น้อยกว่า แต่ฉันมีอินพุตที่ซ่อนอยู่และใช้จาวาสคริปต์เพื่อเติมค่า หลังจากคำขอหรือ postback ครั้งต่อไปของคุณหากมีค่าคุณจะทราบว่ามีการเปิดใช้งาน JavaScript

ระวังสิ่งต่าง ๆ เช่น noscript เมื่อคำขอแรกอาจแสดงว่าปิดใช้งานจาวาสคริปต์ แต่คำขอในอนาคตจะเปิดใช้งาน


5

ตัวอย่างเช่นคุณอาจใช้บางสิ่งบางอย่างเช่น document.location = 'java_page.html' เพื่อเปลี่ยนเส้นทางเบราว์เซอร์ไปยังหน้าใหม่ซึ่งเป็นสคริปต์ที่รับภาระ ความล้มเหลวในการเปลี่ยนเส้นทางแสดงว่า JavaScript ไม่พร้อมใช้งานซึ่งในกรณีนี้คุณสามารถใช้ CGI ro utines หรือใส่รหัสที่เหมาะสมระหว่างแท็ก (หมายเหตุ: NOSCRIPT ใช้ได้เฉพาะใน Netscape Navigator 3.0 ขึ้นไป)

เครดิต http://www.intranetjournal.com/faqs/jsfaq/how12.html


4

เทคนิคที่ฉันเคยใช้ในอดีตคือการใช้จาวาสคริปต์ในการเขียนคุกกี้เซสชั่นที่ทำหน้าที่เป็นธงเพื่อบอกว่าเปิดใช้งาน JavaScript แล้ว จากนั้นโค้ดฝั่งเซิร์ฟเวอร์จะค้นหาคุกกี้นี้และหากไม่พบจะดำเนินการตามความเหมาะสม แน่นอนว่าเทคนิคนี้ใช้คุกกี้ที่เปิดใช้งาน!


4

ฉันคิดว่าคุณสามารถแทรกแท็กรูปภาพลงในแท็ก noscript และดูสถิติได้ว่าเว็บไซต์ของคุณมีกี่ครั้งและโหลดรูปภาพนี้บ่อยแค่ไหน


4

ผู้คนได้โพสต์ตัวอย่างที่เป็นตัวเลือกที่ดีสำหรับการตรวจจับ แต่ขึ้นอยู่กับความต้องการของคุณ "ให้คำเตือนว่าไซต์ไม่สามารถทำงานได้อย่างถูกต้องหากไม่มีเบราว์เซอร์ที่เปิดใช้งาน JS" โดยทั่วไปคุณจะเพิ่มองค์ประกอบที่ปรากฏบนหน้าเว็บเช่น 'ป๊อปอัป' ใน Stack Overflow เมื่อคุณได้รับป้ายพร้อมข้อความที่เหมาะสมจากนั้นลบออกด้วย Javascript บางตัวที่ทำงานทันทีที่โหลดหน้าเว็บ ( และฉันหมายถึง DOM ไม่ใช่ทั้งหน้า)


3

ตรวจพบในอะไร JavaScript? นั่นคงเป็นไปไม่ได้ หากคุณต้องการใช้สำหรับการบันทึกคุณสามารถใช้รูปแบบการติดตามบางประเภทโดยที่แต่ละหน้ามี JavaScript ที่จะทำการร้องขอสำหรับทรัพยากรพิเศษ (อาจจะเล็กgifหรือคล้ายกัน) ด้วยวิธีนี้คุณสามารถรับความแตกต่างระหว่างคำขอหน้าที่ไม่ซ้ำกันและคำขอสำหรับไฟล์ติดตามของคุณ


3

ทำไมคุณไม่ใส่ hijacked onClick () ตัวจัดการเหตุการณ์ที่จะเริ่มทำงานเมื่อเปิดใช้งาน JS และใช้สิ่งนี้ต่อท้ายพารามิเตอร์ (js = true) ไปยัง URL ที่คลิก / เลือก (คุณยังสามารถตรวจจับรายการดรอปดาวน์ได้ และเปลี่ยนค่าของการเพิ่มเขตข้อมูลฟอร์มที่ซ่อนอยู่) ดังนั้นตอนนี้เมื่อเซิร์ฟเวอร์เห็นพารามิเตอร์นี้ (js = true) ก็รู้ว่า JS เปิดใช้งานแล้วทำเซิร์ฟเวอร์ตรรกะของคุณแฟนซี
ข้อเสียคือนี่เป็นครั้งแรกที่ผู้ใช้มาที่ไซต์ของคุณบุ๊กมาร์ก URL เครื่องมือค้นหาที่สร้าง URL คุณจะต้องตรวจสอบว่านี่เป็นผู้ใช้ใหม่ดังนั้นอย่ามองหา NVP ต่อท้าย URL และเซิร์ฟเวอร์จะต้องรอการคลิกครั้งต่อไปเพื่อตรวจสอบว่าผู้ใช้นั้นเปิดใช้งาน / ปิดใช้งาน JS หรือไม่ นอกจากนี้ข้อเสียอีกอย่างคือ URL จะจบลงที่ URL ของเบราว์เซอร์และหากผู้ใช้นี้คั่นหน้า URL นี้ไว้จะมี js = true NVP แม้ว่าผู้ใช้จะไม่ได้เปิดใช้งาน JS แม้ว่าจะคลิกเซิร์ฟเวอร์ครั้งต่อไปก็ตาม ควรรู้ว่าผู้ใช้ยังเปิดใช้งาน JS อยู่หรือไม่ เฮ้อ .. นี่มันสนุก ...


3

เพื่อบังคับให้ผู้ใช้เปิดใช้งาน JavaScript ฉันตั้งค่าคุณลักษณะ 'href' ของแต่ละลิงก์ไปยังเอกสารเดียวกันซึ่งแจ้งให้ผู้ใช้เปิดใช้งาน JavaScript หรือดาวน์โหลด Firefox (หากพวกเขาไม่รู้วิธีเปิดใช้งาน JavaScript) ฉันเก็บ url ของลิงก์จริงไปยังแอตทริบิวต์ 'name' ของลิงก์และกำหนดเหตุการณ์ onclick ทั่วโลกที่อ่านแอตทริบิวต์ 'name' และเปลี่ยนเส้นทางหน้าเว็บนั้น

สิ่งนี้ทำงานได้ดีสำหรับฐานผู้ใช้ของฉัน


และน่ารำคาญนิดหน่อยถ้าผู้ใช้เปิดใช้งาน JS และคลิกที่ลิงค์ก่อนที่จาวาสคริปต์โปรเกรสซีฟของคุณจะเริ่มทำงาน ...
Simon_Weaver

1
แน่นอน แต่ยังไม่มีรายงานปัญหา
Jan Sahin

3

คุณไม่ตรวจพบว่าผู้ใช้ปิดการใช้งานจาวาสคริปต์ (ฝั่งเซิร์ฟเวอร์หรือลูกค้า) แต่คุณคิดว่า javascript ถูกปิดใช้งานและสร้างหน้าเว็บของคุณโดยที่ปิดการใช้งาน javascript นี่เป็นสิ่งจำเป็นสำหรับ obviates noscriptซึ่งคุณควรหลีกเลี่ยงการใช้เพราะมันใช้งานไม่ได้และไม่จำเป็น

ตัวอย่างเช่นเพียงสร้างเว็บไซต์ของคุณเพื่อพูด <div id="nojs">This website doesn't work without JS</div>

จากนั้นสคริปต์ของคุณจะทำdocument.getElementById('nojs').style.display = 'none';และดำเนินธุรกิจ JS ตามปกติ


นี่คือแท็ก <noscript> ที่ไร้รอยต่อที่ยอดเยี่ยมซึ่งจะยากกว่ามากในการรักษาหน้าต่างๆด้วยวิธีนี้คุณสามารถรักษาสไตล์ noscript ของคุณผ่านไฟล์ css ของคุณ
zadubz

3

ตรวจสอบคุกกี้โดยใช้โซลูชันฝั่งเซิร์ฟเวอร์ที่ฉันแนะนำไว้ที่นี่จากนั้นตรวจสอบจาวาสคริปต์โดยวางคุกกี้โดยใช้ Jquery.Cookie แล้วตรวจสอบคุกกี้ด้วยวิธีนี้คุณตรวจสอบทั้งคุกกี้และจาวาสคริปต์


3

ในบางกรณีการทำย้อนกลับอาจเพียงพอ เพิ่มคลาสโดยใช้ javascript:

// Jquery
$('body').addClass('js-enabled');

/* CSS */
.menu-mobile {display:none;}
body.js-enabled .menu-mobile {display:block;}

สิ่งนี้สามารถสร้างปัญหาการบำรุงรักษาในสิ่งที่ซับซ้อนได้ แต่เป็นการแก้ไขง่ายๆสำหรับบางสิ่ง แทนที่จะพยายามตรวจจับเมื่อไม่ได้โหลดเพียงแค่จัดรูปแบบตามเวลาที่โหลด


3

ฉันต้องการเพิ่มโซลูชันของฉันเพื่อรับสถิติที่เชื่อถือได้เกี่ยวกับจำนวนผู้ใช้จริงที่เข้าชมไซต์ของฉันโดยที่ปิดการใช้งานจาวาสคริปต์ในจำนวนผู้ใช้ทั้งหมด การตรวจสอบจะทำเพียงครั้งเดียวต่อเซสชันที่มีประโยชน์เหล่านี้:

  • ผู้ใช้ที่เข้าชม 100 หน้าหรือเพียง 1 รายการจะถูกนับ 1 หน้า สิ่งนี้ทำให้สามารถมุ่งเน้นที่ผู้ใช้คนเดียวไม่ใช่หน้าเว็บ
  • ไม่ทำลายโฟลว์ของหน้าโครงสร้างหรือความหมายในอีกต่อไป
  • สามารถบันทึกตัวแทนผู้ใช้ อนุญาตให้ยกเว้นบ็อตจากสถิติเช่น google bot และ bing bot ซึ่งโดยปกติจะปิดใช้งาน JS! ยังสามารถบันทึก IP, เวลา ฯลฯ ...
  • ตรวจสอบเพียงครั้งเดียวต่อเซสชัน (ใช้งานน้อยเกินไป)

รหัสของฉันใช้ PHP, mysql และ jquery กับ ajax แต่สามารถปรับให้เหมาะกับภาษาอื่นได้:

สร้างตารางในฐานข้อมูลของคุณเช่นนี้:

CREATE TABLE IF NOT EXISTS `log_JS` (
  `logJS_id` int(11) NOT NULL AUTO_INCREMENT,
  `data_ins` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `session_id` varchar(50) NOT NULL,
  `JS_ON` tinyint(1) NOT NULL DEFAULT '0',
  `agent` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`logJS_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

เพิ่มสิ่งนี้ลงในทุกหน้าหลังจากใช้ session_start () หรือเทียบเท่า (จำเป็นต้องมี jquery):

<?  if (!isset($_SESSION["JSTest"]))
    { 
        mysql_query("INSERT INTO log_JS (session_id, agent) VALUES ('" . mysql_real_escape_string(session_id()) . "', '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']). "')"); 
        $_SESSION["JSTest"] = 1; // One time per session
        ?>
        <script type="text/javascript">
            $(document).ready(function() { $.get('JSOK.php'); });
        </script>
        <?
    }
?>

สร้างหน้า JSOK.php ดังนี้:

<?
include_once("[DB connection file].php");   
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");

3

ฉันหาวิธีอื่นโดยใช้ css และ javascript เอง
นี่เป็นเพียงการเริ่มต้นการซ่อมด้วยคลาสและรหัส

ตัวอย่าง CSS:
1. สร้างกฎ css ID และตั้งชื่อ #jsDis
2. ใช้คุณสมบัติ "เนื้อหา" เพื่อสร้างข้อความหลังองค์ประกอบ BODY (คุณสามารถจัดรูปแบบตามที่คุณต้องการ)
3 สร้างกฎ css ID ที่ 2 และตั้งชื่อ #jsEn แล้วทำให้เป็นสไตล์ (เพื่อความเรียบง่ายฉันให้ #jsEn ของฉันควบคุมสีพื้นหลังที่แตกต่างกัน

<style>
#jsDis:after {
    content:"Javascript is Disable. Please turn it ON!";
    font:bold 11px Verdana;
    color:#FF0000;
}

#jsEn {
    background-color:#dedede;
}

#jsEn:after {
    content:"Javascript is Enable. Well Done!";
    font:bold 11px Verdana;
    color:#333333;
}
</style>

ตัวอย่าง JavaScript:
1. สร้างฟังก์ชั่น
2. หยิบ BODY ID ด้วย getElementById และกำหนดให้กับตัวแปร
3. การใช้ฟังก์ชัน JS 'setAttribute' ให้เปลี่ยนค่าของแอตทริบิวต์ ID ขององค์ประกอบ BODY

<script>
function jsOn() {
    var chgID = document.getElementById('jsDis');
    chgID.setAttribute('id', 'jsEn');
}
</script>

ส่วนที่เป็น HTML
1. ตั้งชื่อแอตทริบิวต์ BODY องค์ประกอบด้วย ID ของ #jsDis
2. เพิ่มเหตุการณ์ onLoad ด้วยชื่อฟังก์ชัน (JSON ())

<body id="jsDis" onLoad="jsOn()">

เนื่องจากแท็ก BODY ได้รับรหัสของ #jsDis:
- หากเปิดใช้งาน Javascript จึงจะเปลี่ยนแอตทริบิวต์ของแท็ก BODY ด้วยตนเอง
- หาก Javascript ถูกปิดการใช้งานก็จะแสดงข้อความ 'เนื้อหา: css'

คุณสามารถเล่นกับ #wrapper container หรือ DIV ใด ๆ ที่ใช้ JS

หวังว่านี่จะช่วยให้ได้แนวคิด


2

การเพิ่มการรีเฟรชในเมตาภายใน noscript ไม่ใช่ความคิดที่ดี

  1. เนื่องจากแท็ก noscript ไม่สอดคล้องกับ XHTML

  2. ค่าแอตทริบิวต์ "Refresh" ไม่เป็นมาตรฐานและไม่ควรใช้ "รีเฟรช" จะควบคุมหน้าเว็บจากผู้ใช้ ใช้ "รีเฟรช" จะทำให้เกิดความล้มเหลวในของ W3C Web Content แนวทางการเข้าถึง --- โดยอ้างอิงhttp://www.w3schools.com/TAGS/att_meta_http_equiv.asp


ไม่มีใครพูดอะไรเกี่ยวกับ XHTML <noscript> เป็น HTML 4.01 ที่ถูกต้องสมบูรณ์
Tom

2
noscript ใช้ได้อย่างสมบูรณ์ใน XHTML 1.0 และ XHTML 1.1 มันไม่สามารถมีองค์ประกอบเมตาและควรหลีกเลี่ยงการเพิ่มประสิทธิภาพแบบก้าวหน้า แต่เป็นส่วนหนึ่งของภาษา
Quentin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.