ฉันจะรู้ได้อย่างไรว่าองค์ประกอบ DOM ใดที่มีจุดสนใจ?


1309

ฉันต้องการค้นหาคำตอบใน JavaScript องค์ประกอบใดที่มีจุดสนใจอยู่ในขณะนี้ ฉันได้ดูผ่าน DOM และยังไม่พบสิ่งที่ฉันต้องการ มีวิธีทำเช่นนี้หรือไม่?

เหตุผลที่ฉันมองหาสิ่งนี้:

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


2
นี่คือ bookmarklet ที่ console.log องค์ประกอบที่มีโฟกัส: github.com/lingtalfi/where-is-focus-bookmarklet
ling

คุณสามารถใช้find-focused-elementแพ็คเกจ: npmjs.com/package/find-focused-element
Maxim Zhukov

คำตอบ:


1533

ใช้document.activeElementมันได้รับการสนับสนุนในเบราว์เซอร์ที่สำคัญทั้งหมด

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

หากคุณต้องการลบactiveElementคุณสามารถใช้เบลอ document.activeElement.blur(). มันจะเปลี่ยนไปactiveElementbody

ลิ้งค์ที่มีความเกี่ยวข้อง:


53
ไม่แน่ใจเกี่ยวกับ IE แต่ FF และ Safari ทั้งคู่ส่งคืนองค์ประกอบ BODY
เจดับบลิว

10
activeElementที่จริงแล้วไม่ได้คืนองค์ประกอบที่มุ่งเน้น องค์ประกอบใดก็ได้ที่สามารถโฟกัสได้ หากเอกสารมี 4 'scrolldivs' 0 หรือ 1 ของ divs เหล่านั้นสามารถเลื่อนได้โดยใช้ปุ่มลูกศร หากคุณคลิกที่หนึ่ง div นั้นจะเน้น หากคุณคลิกนอกทั้งหมดร่างกายจะมุ่งเน้น คุณจะรู้ได้อย่างไรว่า scrolldiv นั้นเน้นไปที่ใด? jsfiddle.net/rudiedirkx/bC5ke/show (ตรวจสอบคอนโซล)
Rudie

18
@Rudie, @Stewart: ผมสร้างขึ้นบนไวโอลินของคุณเพื่อสร้างสนามเด็กเล่นที่ซับซ้อนมากขึ้น: jsfiddle.net/mklement/72rTF คุณจะพบว่าเบราว์เซอร์หลักเพียงตัวเดียว (จนถึงปลายปี 2012) ที่สามารถโฟกัสได้เช่นdivFirefox 17 และเพียงแท็บเท่านั้น ประเภทขององค์ประกอบที่เบราว์เซอร์หลักทั้งหมดส่งคืนdocument.activeElementจะถูก จำกัด เฉพาะองค์ประกอบที่เกี่ยวข้องกับอินพุต หากไม่มีองค์ประกอบดังกล่าวให้ความสำคัญเบราว์เซอร์หลักทั้งหมดจะส่งคืนbodyองค์ประกอบ - ยกเว้น IE 9 ซึ่งจะส่งคืนhtmlองค์ประกอบนั้น
mklement0

10
ไม่แน่ใจว่ามันช่วยได้หรือไม่ แต่คุณสามารถสร้างองค์ประกอบเช่น div ได้รับการโฟกัสของแป้นพิมพ์โดยการรวม tabindex แอตทริบิวต์ = "0"
Marco Luglio

4
การเข้าถึงใด ๆ ที่document.activeElementควรห่อหุ้มในtry catchภายใต้สถานการณ์บางอย่างมันสามารถโยนข้อยกเว้น (ไม่เพียง IE9 AFAIK) ดูbugs.jquery.com/ticket/13393และbugs.jqueryui.com/ticket/8443
robocat

127

ตามที่กล่าวโดย JW คุณไม่สามารถค้นหาองค์ประกอบที่มุ่งเน้นในปัจจุบันอย่างน้อยก็ในลักษณะที่ไม่ขึ้นกับเบราว์เซอร์ แต่ถ้าแอปของคุณเป็น IE เท่านั้น (บางตัวเป็น ... ) คุณสามารถค้นหาได้ด้วยวิธีต่อไปนี้:

document.activeElement

แก้ไข: ดูเหมือนว่า IE ไม่ได้มีทุกอย่างผิดปกติซึ่งเป็นส่วนหนึ่งของร่าง HTML5 และดูเหมือนว่าจะได้รับการสนับสนุนโดย Chrome เวอร์ชันล่าสุด, Safari และ Firefox อย่างน้อย


5
FF3 ด้วย นี่เป็นส่วนหนึ่งของข้อกำหนด HTML5 ที่อยู่รอบ ๆ "การจัดการโฟกัส"
Crescent Fresh

2
สามารถใช้งานได้ใน Chrome และ Opera เวอร์ชันปัจจุบัน (9.62) ไม่ทำงานใน Safari 3.2.3 บน OS X แต่การทำงานใน Safari 4 ที่ได้รับการปล่อยตัวเมื่อวานนี้ :)
Gregers

ยังคงเหมือนเดิมสำหรับ chrome 19: S
Sebas

1
ใช้งานได้เฉพาะกับโครเมียม (20) / ซาฟารี (5.1.3) เมื่อคุณใช้แป้นพิมพ์เพื่อแท็บลงบนองค์ประกอบ ถ้าคุณคลิกที่มันแล้ว jquery: focus selector หรือ document.activeElement ไม่ประสบความสำเร็จในการคืนสิ่งที่คุณคลิก (กลับมาไม่ได้กำหนดและองค์ประกอบร่างกายของเอกสารตามลำดับ) PS ฉันไม่อยากจะเชื่อว่ากระทู้นี้มีอายุ 2 ปีและยังมีปัญหาการถดถอยบน webkit พร้อมกับลิงค์ข้ามไม่ทำงาน คิดว่าฉันอาจกลับไปแนะนำ Firefox กับครอบครัวและเพื่อนของฉัน
รุ่งอรุณ

^. document.activeElement นั้นดีเมื่อคุณคลิกเพื่อโฟกัสที่พื้นที่ข้อความหรืออินพุตอื่น ๆ หากเป็นลิงก์จะไม่เน้นเมื่อคลิก (ในหน้าหรืออย่างอื่น)
markyzm

84

หากคุณสามารถใช้ jQuery ได้ตอนนี้รองรับ: โฟกัสให้แน่ใจว่าคุณใช้เวอร์ชัน 1.6+

คำสั่งนี้จะทำให้คุณได้รับองค์ประกอบที่มุ่งเน้นในขณะนี้

$(":focus")

จาก: วิธีการเลือกองค์ประกอบที่เน้นด้วย jQuery


4
นี่เป็นสิ่งที่ดี แต่ jQuery ทำได้อย่างไร document.activeElement? ฉันพบสิ่งนี้: return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
Harry Pehkonen

46

document.activeElementตอนนี้เป็นส่วนหนึ่งของข้อกำหนดร่างแบบ HTML5 ที่ใช้งานได้ แต่อาจยังไม่รองรับในเบราว์เซอร์ที่ไม่ใช่เบราว์เซอร์ / มือถือ / รุ่นเก่า คุณสามารถถอยกลับไปที่querySelector(หากได้รับการสนับสนุน) นอกจากนี้ยังเป็นมูลค่าการกล่าวขวัญว่าdocument.activeElementจะกลับมาdocument.bodyหากไม่มีองค์ประกอบเน้น - แม้ว่าหน้าต่างเบราว์เซอร์ไม่ได้มุ่งเน้น

รหัสต่อไปนี้จะแก้ไขปัญหานี้และถอยกลับเพื่อquerySelectorให้การสนับสนุนที่ดีขึ้นเล็กน้อย

var focused = document.activeElement;
if (!focused || focused == document.body)
    focused = null;
else if (document.querySelector)
    focused = document.querySelector(":focus");

สิ่งที่ควรทราบเพิ่มเติมคือความแตกต่างของประสิทธิภาพระหว่างสองวิธีนี้ การสืบค้นเอกสารด้วยตัวเลือกจะช้ากว่าการเข้าถึงactiveElementคุณสมบัติ ดูการทดสอบ jsperf.comนี้


21

ด้วยตัวเองdocument.activeElementยังคงสามารถคืนองค์ประกอบหากเอกสารไม่ได้รับการมุ่งเน้น (และไม่มีสิ่งใดในเอกสารที่มุ่งเน้น!)

คุณอาจต้องการพฤติกรรมนั้นหรืออาจไม่สำคัญ (เช่นภายในkeydownเหตุการณ์) แต่ถ้าคุณจำเป็นต้องรู้ว่ามีบางสิ่งที่ให้ความสำคัญจริง ๆ คุณสามารถตรวจสอบเพิ่มเติมdocument.hasFocus()ได้

nullต่อไปนี้จะทำให้คุณมีองค์ประกอบเน้นหากมีหนึ่งหรืออื่น ๆ

var focused_element = null;
if (
    document.hasFocus() &&
    document.activeElement !== document.body &&
    document.activeElement !== document.documentElement
) {
    focused_element = document.activeElement;
}

ในการตรวจสอบว่าองค์ประกอบเฉพาะมีโฟกัสหรือไม่มันง่ายกว่า:

var input_focused = document.activeElement === input && document.hasFocus();

หากต้องการตรวจสอบว่ามีอะไรโฟกัสหรือไม่มันซับซ้อนกว่าอีกครั้ง:

var anything_is_focused = (
    document.hasFocus() &&
    document.activeElement !== null &&
    document.activeElement !== document.body &&
    document.activeElement !== document.documentElement
);

ความทนทานหมายเหตุ : ในโค้ดที่ใช้ตรวจสอบdocument.bodyและdocument.documentElementเป็นเพราะเบราว์เซอร์บางตัวส่งคืนหนึ่งหรือnullเมื่อไม่มีสิ่งใดมุ่งเน้น

มันไม่บัญชีสำหรับถ้า<body>(หรืออาจ<html>) มีtabIndexแอตทริบิวต์และทำให้จริงอาจจะเน้น หากคุณกำลังเขียนห้องสมุดหรือบางสิ่งบางอย่างและต้องการให้มันมีประสิทธิภาพคุณควรจัดการกับสิ่งนั้น


ต่อไปนี้เป็น ( หนัก airquotes) "หนึ่งซับ" รุ่นได้รับองค์ประกอบที่มุ่งเน้นซึ่งเป็นแนวคิดที่ซับซ้อนมากขึ้นเพราะคุณมีความรู้เกี่ยวกับการลัดวงจรและ y รู้มันเห็นได้ชัดว่าไม่พอดีในหนึ่งบรรทัดสมมติว่าคุณ ต้องการให้สามารถอ่านได้
ฉันจะไม่แนะนำอันนี้ แต่ถ้าคุณเป็น 1337 hax0r, idk ... มันอยู่ตรงนั้น
คุณสามารถถอดชิ้น|| nullส่วนออกได้ถ้าคุณไม่สนใจที่จะรับfalseในบางกรณี (คุณยังสามารถได้รับnullถ้าdocument.activeElementเป็นnull):

var focused_element = (
    document.hasFocus() &&
    document.activeElement !== document.body &&
    document.activeElement !== document.documentElement &&
    document.activeElement
) || null;

สำหรับการตรวจสอบว่าองค์ประกอบเฉพาะเจาะจงหรือคุณสามารถใช้เหตุการณ์ได้ แต่วิธีนี้ต้องมีการตั้งค่า (และอาจทำให้เกิดการฉีกขาด) และที่สำคัญถือว่าสถานะเริ่มต้น :

var input_focused = false;
input.addEventListener("focus", function() {
    input_focused = true;
});
input.addEventListener("blur", function() {
    input_focused = false;
});

คุณสามารถแก้ไขข้อสมมติสถานะเริ่มต้นได้โดยใช้วิธีที่ไม่มีเหตุการณ์ แต่คุณอาจใช้วิธีนั้นแทนก็ได้


15

document.activeElementอาจใช้ค่าเริ่มต้นเป็น<body>องค์ประกอบหากไม่มีองค์ประกอบที่สามารถโฟกัสได้อยู่ในโฟกัส นอกจากนี้หากองค์ประกอบมุ่งเน้นและเบราว์เซอร์หน้าต่างเบลอactiveElementจะยังคงองค์ประกอบที่มุ่งเน้น

หากทั้งสองพฤติกรรมทั้งสองไม่ได้เป็นที่น่าพอใจให้พิจารณาวิธี document.querySelector( ':focus' )CSS-based:


เจ๋งใช่ในกรณีของฉันวิธีการของคุณมีเหตุผลอย่างสมบูรณ์ ฉันสามารถตั้งค่าองค์ประกอบที่สามารถโฟกัสได้ด้วย 'tabindex = "- 1"' หากไม่มีสิ่งใดที่โฟกัส (สมมติว่ามีข้อความหรือรูปภาพที่ฉันไม่สนใจ) document.querySelector (': focus') จะกลับมา โมฆะ
Manfred

ดูคำตอบของฉันเพื่อหลีกเลี่ยงการใช้querySelector: stackoverflow.com/a/40873560/2624876
1j01

10

ผมชอบวิธีการที่ใช้โดยโจเอล S document.activeElementแต่ฉันยังรักความเรียบง่ายของ ฉันใช้ jQuery และรวมสองอย่างเข้าด้วยกัน เบราว์เซอร์รุ่นเก่าที่ไม่รองรับdocument.activeElementจะใช้jQuery.data()เพื่อจัดเก็บค่าของ 'hasFocus' document.activeElementเบราว์เซอร์ใหม่กว่าจะใช้ ฉันคิดว่ามันdocument.activeElementจะมีประสิทธิภาพที่ดีขึ้น

(function($) {
var settings;
$.fn.focusTracker = function(options) {
    settings = $.extend({}, $.focusTracker.defaults, options);

    if (!document.activeElement) {
        this.each(function() {
            var $this = $(this).data('hasFocus', false);

            $this.focus(function(event) {
                $this.data('hasFocus', true);
            });
            $this.blur(function(event) {
                $this.data('hasFocus', false);
            });
        });
    }
    return this;
};

$.fn.hasFocus = function() {
    if (this.length === 0) { return false; }
    if (document.activeElement) {
        return this.get(0) === document.activeElement;
    }
    return this.data('hasFocus');
};

$.focusTracker = {
    defaults: {
        context: 'body'
    },
    focusedElement: function(context) {
        var focused;
        if (!context) { context = settings.context; }
        if (document.activeElement) {
            if ($(document.activeElement).closest(context).length > 0) {
                focused = document.activeElement;
            }
        } else {
            $(':visible:enabled', context).each(function() {
                if ($(this).data('hasFocus')) {
                    focused = this;
                    return false;
                }
            });
        }
        return $(focused);
    }
};
})(jQuery);

3
อาจถูกแทนที่ด้วย @William Denniss $("*:focus")หรือไม่
Pylinux

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

10

ผู้ช่วยตัวเล็ก ๆ ที่ฉันใช้เพื่อวัตถุประสงค์เหล่านี้ใน Mootools:

FocusTracker = {
    startFocusTracking: function() {
       this.store('hasFocus', false);
       this.addEvent('focus', function() { this.store('hasFocus', true); });
       this.addEvent('blur', function() { this.store('hasFocus', false); });
    },

    hasFocus: function() {
       return this.retrieve('hasFocus');
    }
}

Element.implement(FocusTracker);

วิธีนี้คุณสามารถตรวจสอบว่าองค์ประกอบมีโฟกัสพร้อมที่el.hasFocus()ให้ซึ่งstartFocusTracking()เรียกใช้กับองค์ประกอบที่กำหนดหรือไม่


7

JQuery สนับสนุน:focuspseudo-class ณ ปัจจุบัน หากคุณกำลังมองหามันในเอกสาร JQuery ตรวจสอบภายใต้ "Selectors" ที่ชี้คุณไปยังเอกสาร W3C CSS ฉันทดสอบด้วย Chrome, FF และ IE 7+ แล้ว โปรดทราบว่ามันจะทำงานใน IE <!DOCTYPE...ต้องมีอยู่ในหน้า html นี่คือตัวอย่างสมมติว่าคุณได้กำหนด ID ให้กับองค์ประกอบที่มีโฟกัส:

$(":focus").each(function() {
  alert($(this).attr("id") + " has focus!");
});

1
คุณควร (เสมอ?) ใช้this.idแทน$(this).attr('id')หรืออย่างน้อย (เมื่อคุณ allready มีวัตถุ jQuery $(this)[0].idของคุณ) Javascript ดั้งเดิมในระดับนี้เป็นวิธีที่เร็วขึ้นและมีประสิทธิภาพยิ่งขึ้น ไม่ควรสังเกตในกรณีนี้ แต่ทั้งระบบคุณจะสังเกตเห็นความแตกต่าง
Martijn

7

หากคุณต้องการที่จะได้รับวัตถุที่เป็นตัวอย่างของElementคุณต้องใช้document.activeElementแต่ถ้าคุณต้องการที่จะได้รับวัตถุที่เป็นตัวอย่างของคุณต้องใช้Textdocument.getSelection().focusNode

ฉันหวังว่าจะช่วย


ดีกว่าในทางใด?
1j01

เปิดตัวตรวจสอบเบราว์เซอร์ของคุณคลิกที่ตำแหน่งใด ๆ ของหน้าผ่านมาdocument.getSelection().focusNode.parentElementแล้วแตะ Enter หลังจากนั้นdocument.activeElementทำอะไรซักอย่างแล้ว ;)
rplaurindo

เมื่อเน้นช่องแสดงความคิดเห็นนี้document.activeElementจะให้<textarea>ส่วนที่document.getSelection().focusNodeให้<td>ที่มี<textarea>(และdocument.getSelection().focusNode.parentElementให้การ<tr>บรรจุ<td>)
1j01

ขอโทษด้วยที่ฉันขอโทษ ฉันไม่ได้อธิบายได้ดี หากคุณต้องการที่จะได้รับวัตถุที่เป็นตัวอย่างของElementคุณต้องใช้document.activeElementแต่ถ้าคุณต้องการที่จะได้รับวัตถุที่เป็นตัวอย่างของคุณต้องใช้Text document.getSelection().focusNodeกรุณาทดสอบอีกครั้ง ฉันหวังว่าฉันช่วย
rplaurindo

2
คำถามกำลังถามว่าองค์ประกอบใดมีโฟกัสในขณะนี้ และfocusNodeไม่รับประกันว่าจะเป็นโหนดข้อความเช่นกัน
1j01

6

มีปัญหาที่อาจเกิดขึ้นกับการใช้ document.activeElement พิจารณา:

<div contentEditable="true">
  <div>Some text</div>
  <div>Some text</div>
  <div>Some text</div>
</div>

หากผู้ใช้มุ่งเน้นไปที่ inner-div ดังนั้น document.activeElement ยังคงอ้างอิง div ภายนอก คุณไม่สามารถใช้ document.activeElement เพื่อตรวจสอบว่า div ภายในของมีโฟกัส

ฟังก์ชันต่อไปนี้จะได้รับสิ่งนี้และส่งคืนโหนดที่โฟกัส:

function active_node(){
  return window.getSelection().anchorNode;
}

หากคุณต้องการได้รับองค์ประกอบที่เน้นใช้:

function active_element(){
  var anchor = window.getSelection().anchorNode;
  if(anchor.nodeType == 3){
        return anchor.parentNode;
  }else if(anchor.nodeType == 1){
        return anchor;
  }
}

3
นั่นไม่ใช่ปัญหาจริง ๆdocument.activeElement: <div>องค์ประกอบภายในไม่สามารถรับโฟกัสได้เนื่องจากคุณสามารถมองเห็นได้ด้วยการตั้ง:focusคลาสเทียมเป็นสิ่งที่มองเห็นได้ (ตัวอย่าง: jsfiddle.net/4gasa1t2/1 ) สิ่งที่คุณกำลังพูดถึงคือสิ่งที่อยู่ภายใน<div>ประกอบด้วยการเลือกหรือเครื่องหมายรูปหมวกซึ่งเป็นปัญหาที่แยกต่างหาก
Tim Down

6

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

setInterval(function() { console.log(document.querySelector(":focus")); }, 1000);

อย่าลังเลที่จะปรับเปลี่ยนconsole.logเพื่อออกจากระบบสิ่งที่แตกต่างเพื่อช่วยให้คุณระบุองค์ประกอบที่แน่นอนหากการพิมพ์องค์ประกอบทั้งหมดไม่ได้ช่วยให้คุณระบุองค์ประกอบได้


5

อ่านคำตอบอื่น ๆ และลองด้วยตัวเองดูเหมือนว่าdocument.activeElementจะให้องค์ประกอบที่คุณต้องการในเบราว์เซอร์ส่วนใหญ่

หากคุณมีเบราว์เซอร์ที่ไม่รองรับ document.activeElement หากคุณมี jQuery อยู่แล้วคุณควรจะสามารถใส่มันลงในเหตุการณ์โฟกัสทั้งหมดด้วยสิ่งที่ง่ายมากเช่นนี้ (ยังไม่ทดลองเพราะฉันไม่มีเบราว์เซอร์ที่ตรงกับเกณฑ์เหล่านั้น ):

if (typeof document.activeElement === 'undefined') { // Check browser doesn't do it anyway
  $('*').live('focus', function () { // Attach to all focus events using .live()
    document.activeElement = this; // Set activeElement to the element that has been focussed
  });
}

5

หากคุณกำลังใช้ jQuery คุณสามารถใช้สิ่งนี้เพื่อตรวจสอบว่าองค์ประกอบใช้งานอยู่หรือไม่:

$("input#id").is(":active");


3

เพียงวางที่นี่เพื่อให้ทางออกฉันในที่สุดก็มาด้วย

ฉันสร้างคุณสมบัติที่เรียกว่า document.activeInputArea และใช้ AddK ของ HotKeys ของ jQuery เพื่อดักจับเหตุการณ์แป้นพิมพ์สำหรับแป้นลูกศรแท็บและป้อนและฉันสร้างตัวจัดการเหตุการณ์สำหรับการคลิกเข้าไปในองค์ประกอบการป้อนข้อมูล

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.