ฉันจะรับตัวเลือกจากวัตถุ jQuery ได้อย่างไร


112
$("*").click(function(){
    $(this); // how can I get selector from $(this) ?
});

มีวิธีง่ายๆในการรับตัวเลือก$(this)หรือไม่? มีวิธีการเลือกองค์ประกอบโดยตัวเลือก แต่สิ่งที่เกี่ยวกับการเลือกจากองค์ประกอบ ?


แค่อยากรู้ว่าทำไมสิ่งนี้ถึงมีประโยชน์? สิ่งที่คุณกำลังพูดที่นี่ (เชิงความหมาย) มีไว้สำหรับทุกองค์ประกอบที่อ้างถึงเป็น $ (สิ่งนี้) ... องค์ประกอบนั้นคือ $ (สิ่งนี้) ดังนั้นจึงไม่จำเป็นต้องใช้ตัวเลือก คุณมีวัตถุ ...
BenAlabaster

1
คุณทราบหรือไม่ว่าการคลิกที่มีองค์ประกอบซ้อนกันจะส่งกลับมากกว่าหนึ่งรายการ div ในร่างกาย ฯลฯ หรือฉันเหนื่อยเกินไปในช่วงหัวเลี้ยวหัวต่อนี้?
Mark Schultheiss

2
จะเป็นประโยชน์หากคุณสามารถอธิบาย 'เป้าหมายสุดท้าย' ของสิ่งที่คุณพยายามทำให้สำเร็จ คุณอาจได้รับความช่วยเหลือที่ดีขึ้นด้วยวิธีนั้น
jessegavin

3
องค์ประกอบสามารถเลือกได้หลายวิธี นอกจากนี้ตัวเลือก! == เส้นทาง คุณคาดหวังว่าจะทำอย่างไรกับข้อมูลนี้
หลอกลวง

2
สิ่งนี้จะมีประโยชน์หากคุณพบองค์ประกอบ JQuery แล้วและกำลังใช้รูทีนย่อยปลั๊กอิน / โมดูล / ที่ต้องใช้ตัวเลือกในการทำงาน (อาจอยู่นอกเหนือการควบคุมของคุณ)
Andy

คำตอบ:


57

ตกลงดังนั้นในความคิดเห็นด้านบนผู้ถามถามFidilipว่าสิ่งที่เขา / เธอตามหลังคือการได้รับเส้นทางไปยังองค์ประกอบปัจจุบัน

นี่คือสคริปต์ที่จะ "ปีน" โครงสร้างบรรพบุรุษ DOM จากนั้นสร้างตัวเลือกที่ค่อนข้างเฉพาะเจาะจงรวมถึงคุณสมบัติidหรือclassแอตทริบิวต์ใด ๆในรายการที่คลิก

ดูการทำงานบน jsFiddle: http://jsfiddle.net/Jkj2n/209/

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
    $(function() {
        $("*").on("click", function(e) {
          e.preventDefault();
          var selector = $(this)
            .parents()
            .map(function() { return this.tagName; })
            .get()
            .reverse()
            .concat([this.nodeName])
            .join(">");

          var id = $(this).attr("id");
          if (id) { 
            selector += "#"+ id;
          }

          var classNames = $(this).attr("class");
          if (classNames) {
            selector += "." + $.trim(classNames).replace(/\s/gi, ".");
          }

          alert(selector);
      });
    });
    </script>
</head>
<body>
<h1><span>I love</span> jQuery</h1>
<div>
  <p>It's the <strong>BEST THING</strong> ever</p>
  <button id="myButton">Button test</button>
</div>
<ul>
  <li>Item one
    <ul>
      <li id="sub2" >Sub one</li>
      <li id="sub2" class="subitem otherclass">Sub two</li>
    </ul>
  </li>
</ul>
</body>
</html>

ตัวอย่างเช่นหากคุณต้องคลิกรายการที่ 2 ในรายการที่ซ้อนกันใน HTML ด้านล่างคุณจะได้รับผลลัพธ์ดังต่อไปนี้:

HTML>BODY>UL>LI>UL>LI#sub2.subitem.otherclass


2
ขอบคุณ! ฉันจะใช้รหัสของคุณกับการแก้ไขหนึ่งครั้งในการเข้าร่วม ... join(" > ");จะทำให้ฉันได้ลูกทันทีและด้วยเหตุนี้เส้นทางที่เข้มงวดยิ่งขึ้น
nonsensickle

FANTASTIC ... ฉันจะใช้มันสำหรับส่วนขยาย Chrome ของฉัน มีเพียงสิ่งเดียวบางครั้ง id ใช้กับโคลอน ':' นำหน้าซึ่งเราสามารถแทนที่ด้วย '\\:'
Savaratkar

โทรดี @nonsensickle ฉันอัปเดตตัวอย่างของฉันและลบคำสั่ง if ด้วย
jessegavin

ส่วนโค้ดด้านบนไม่ส่งคืนคลาสสำหรับออบเจ็กต์ SVG นี่คือ jsFiddle ที่ทำงานสำหรับ SVG: http://jsfiddle.net/mikemsq/vbykja4x/7/
mikemsq

32

:: คำเตือน ::. ตัว
เลือกถูกเลิกใช้งานในเวอร์ชัน 1.7 และถูกลบออกเมื่อ 1.9

วัตถุ jQuery มีคุณสมบัติตัวเลือกที่ฉันเห็นเมื่อขุดโค้ดเมื่อวานนี้ ไม่รู้ว่าที่กำหนดไว้ในเอกสารนั้นมีความน่าเชื่อถือเพียงใด (สำหรับการพิสูจน์ในอนาคต) แต่ได้ผล!

$('*').selector // returns *

แก้ไข : หากคุณต้องการค้นหาตัวเลือกภายในเหตุการณ์ข้อมูลนั้นควรเป็นส่วนหนึ่งของเหตุการณ์ไม่ใช่องค์ประกอบเนื่องจากองค์ประกอบอาจมีเหตุการณ์การคลิกหลายเหตุการณ์ที่กำหนดผ่านตัวเลือกต่างๆ วิธีการแก้ปัญหาจะใช้ห่อหุ้มประมาณbind(), click()ฯลฯ เพื่อเพิ่มกิจกรรมแทนการเพิ่มโดยตรง

jQuery.fn.addEvent = function(type, handler) {
    this.bind(type, {'selector': this.selector}, handler);
};

selectorตัวเลือกจะถูกส่งผ่านเป็นคุณสมบัติของวัตถุที่มีชื่อว่า เข้าถึงเป็นevent.data.selector.

ลองใช้มาร์กอัป ( http://jsfiddle.net/DFh7z/ ):

<p class='info'>some text and <a>a link</a></p>​

$('p a').addEvent('click', function(event) {
    alert(event.data.selector); // p a
});

ข้อจำกัดความรับผิดชอบ : โปรดจำไว้ว่าเช่นเดียวกับlive()เหตุการณ์คุณสมบัติตัวเลือกอาจไม่ถูกต้องหากใช้วิธีการข้ามผ่าน DOM

<div><a>a link</a></div>

รหัสด้านล่างจะใช้ไม่ได้เนื่องจากliveขึ้นอยู่กับคุณสมบัติตัวเลือกซึ่งในกรณีนี้คือa.parent()- ตัวเลือกที่ไม่ถูกต้อง

$('a').parent().live(function() { alert('something'); });

addEventวิธีการของเราจะเริ่มทำงาน แต่คุณก็จะเห็นตัวเลือกที่ไม่ถูกต้องa.parent()เช่นกัน-


ฉันคิดว่านี่เป็นสิ่งที่ดีที่สุดที่เราได้รับจาก jquery =) บางทีฉันจะหาวิธีแก้ปัญหาทั้งหมดในภายหลัง อย่างไรก็ตามสิ่งนี้มีประโยชน์จริงๆขอบคุณ! =)
Fidilip

@MarkoDumic: ต้องเลิกใช้แล้ว ตอนนี้ลิงค์ตายแล้วและต่อไปนี้บอกเราเท่านั้น:No Such jQuery Method Exists
hippietrail

12
@ เลวิติคอนคุณกำลังลดคำตอบจริงๆอายุสามขวบเพราะตอนนี้เลิกใช้แล้ว?! คุณควรแก้ไขคำตอบและใส่คำเตือน
อ. วูล์ฟ

22

ด้วยความร่วมมือกับ @drzaus เราได้สร้างปลั๊กอิน jQuery ต่อไปนี้

jQuery.getSelector

!(function ($, undefined) {
    /// adapted http://jsfiddle.net/drzaus/Hgjfh/5/

    var get_selector = function (element) {
        var pieces = [];

        for (; element && element.tagName !== undefined; element = element.parentNode) {
            if (element.className) {
                var classes = element.className.split(' ');
                for (var i in classes) {
                    if (classes.hasOwnProperty(i) && classes[i]) {
                        pieces.unshift(classes[i]);
                        pieces.unshift('.');
                    }
                }
            }
            if (element.id && !/\s/.test(element.id)) {
                pieces.unshift(element.id);
                pieces.unshift('#');
            }
            pieces.unshift(element.tagName);
            pieces.unshift(' > ');
        }

        return pieces.slice(1).join('');
    };

    $.fn.getSelector = function (only_one) {
        if (true === only_one) {
            return get_selector(this[0]);
        } else {
            return $.map(this, function (el) {
                return get_selector(el);
            });
        }
    };

})(window.jQuery);

Minified Javascript

// http://stackoverflow.com/questions/2420970/how-can-i-get-selector-from-jquery-object/15623322#15623322
!function(e,t){var n=function(e){var n=[];for(;e&&e.tagName!==t;e=e.parentNode){if(e.className){var r=e.className.split(" ");for(var i in r){if(r.hasOwnProperty(i)&&r[i]){n.unshift(r[i]);n.unshift(".")}}}if(e.id&&!/\s/.test(e.id)){n.unshift(e.id);n.unshift("#")}n.unshift(e.tagName);n.unshift(" > ")}return n.slice(1).join("")};e.fn.getSelector=function(t){if(true===t){return n(this[0])}else{return e.map(this,function(e){return n(e)})}}}(window.jQuery)

การใช้งานและ Gotchas

<html>
    <head>...</head>
    <body>
        <div id="sidebar">
            <ul>
                <li>
                    <a href="/" id="home">Home</a>
                </li>
            </ul>
        </div>
        <div id="main">
            <h1 id="title">Welcome</h1>
        </div>

        <script type="text/javascript">

            // Simple use case
            $('#main').getSelector();           // => 'HTML > BODY > DIV#main'

            // If there are multiple matches then an array will be returned
            $('body > div').getSelector();      // => ['HTML > BODY > DIV#main', 'HTML > BODY > DIV#sidebar']

            // Passing true to the method will cause it to return the selector for the first match
            $('body > div').getSelector(true);  // => 'HTML > BODY > DIV#main'

        </script>
    </body>
</html>

การทดสอบซอด้วย QUnit

http://jsfiddle.net/CALY5/5/


ฉันชอบที่ที่คุณกำลังจะไปดังนั้นฉันจึงทำการแก้ไข / เปลี่ยนแปลงบางอย่าง: * ปลั๊กอิน jQuery ใช้ประโยชน์จากยูทิลิตี้ jQuery $.map* ตัวคั่นที่เป็นทางเลือก (จำเป็นต้องถอด tagNames แปลก ๆ ออก) * คุณไม่จำเป็นต้องตรวจสอบhasOwnPropertyในforeachลูปเพื่อความปลอดภัยหรือ?
drzaus

ขอบคุณสำหรับความคิดเห็นฉันจะตั้งชุดทดสอบที่เหมาะสมในสุดสัปดาห์นี้และพยายามรวบรวมคำแนะนำของคุณ
Will

1
@drzaus ฉันอัปเดตคำถามแล้ว ฉันตัดสินใจที่จะไม่ใช้ตัวคั่นแบบกำหนดเองที่คุณเพิ่มไว้เนื่องจากตัวคั่นใด ๆ ที่ไม่ใช่' > 'จะทำให้มันไม่ส่งคืนตัวเลือกขององค์ประกอบ
จะ

เจ๋งดีงานดี; ไม่เคยเห็น qunit มาก่อน ฉันคิดว่าตัวคั่นเป็นเพียงการนำเสนอ แต่ตอนนี้ฉันเข้าใจแล้วว่ามันเป็นส่วนหนึ่งของเส้นทางตัวเลือกตามตัวอักษร
drzaus

5

ลองทำดูไหม

 $("*").click(function(){
    $(this).attr("id"); 
 });

3
พยายามอย่าใช้*ตัวเลือกมันช้ามาก!
Ben Carey

3
สิ่งนี้จะใช้ได้เฉพาะในกรณีที่องค์ประกอบมี ID ซึ่งไม่ค่อยดีนัก
Glen

2

ฉันได้เปิดตัวปลั๊กอิน jQuery: jQuery Selectoratorคุณจะได้รับตัวเลือกเช่นนี้

$("*").on("click", function(){
  alert($(this).getSelector().join("\n"));
  return false;
});

นี่เป็นวิธีเดียวที่เกี่ยวข้องกับพี่น้องโคลนขอบคุณ!
Bruno Peres


2

เพียงเพิ่มเลเยอร์บนฟังก์ชัน $ ด้วยวิธีนี้:

$ = (function(jQ) { 
	return (function() { 
		var fnc = jQ.apply(this,arguments);
		fnc.selector = (arguments.length>0)?arguments[0]:null;
		return fnc; 
	});
})($);

ตอนนี้คุณสามารถทำสิ่งต่างๆเช่น

$ ("a"). ตัวเลือก
และจะคืนค่า "a" แม้ในเวอร์ชัน jQuery ที่ใหม่กว่า


นี่เป็นสิ่งที่ฉันต้องการ มันทำงานได้ดีอย่างน่าสงสัยเมื่อฉันมองหาสิ่งนี้มานานแค่ไหน! ขอบคุณอัลเบิร์ต
Mark Notton

1

http://www.selectorgadget.com/เป็น bookmarklet ที่ออกแบบมาอย่างชัดเจนสำหรับกรณีการใช้งานนี้

ที่กล่าวว่าฉันเห็นด้วยกับคนอื่น ๆ ส่วนใหญ่ที่คุณควรเรียนรู้ตัวเลือก CSS ด้วยตัวเองการพยายามสร้างด้วยโค้ดนั้นไม่ยั่งยืน :)


1

ฉันได้เพิ่มการแก้ไขบางอย่างในการแก้ไขของ @jessegavin

สิ่งนี้จะกลับมาทันทีหากมี ID บนองค์ประกอบ ฉันยังเพิ่มการตรวจสอบแอตทริบิวต์ชื่อและตัวเลือกลูกที่ n ในกรณีที่องค์ประกอบไม่มี id คลาสหรือชื่อ

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

function getSelector(el){
    var $el = $(el);

    var id = $el.attr("id");
    if (id) { //"should" only be one of these if theres an ID
        return "#"+ id;
    }

    var selector = $el.parents()
                .map(function() { return this.tagName; })
                .get().reverse().join(" ");

    if (selector) {
        selector += " "+ $el[0].nodeName;
    }

    var classNames = $el.attr("class");
    if (classNames) {
        selector += "." + $.trim(classNames).replace(/\s/gi, ".");
    }

    var name = $el.attr('name');
    if (name) {
        selector += "[name='" + name + "']";
    }
    if (!name){
        var index = $el.index();
        if (index) {
            index = index + 1;
            selector += ":nth-child(" + index + ")";
        }
    }
    return selector;
}

1

ฉันได้รับองค์ประกอบหลายอย่างแม้ว่าจะได้รับโซลูชันข้างต้นแล้วดังนั้นฉันจึงขยายงาน dds1024 สำหรับองค์ประกอบโดมที่ชี้หมุดมากยิ่งขึ้น

เช่น DIV: nth-child (1) DIV: nth-child (3) DIV: nth-child (1) ARTICLE: ที่ n-child (1) DIV: nth-child (1) DIV: nth-child (8) DIV : nth-child (2) DIV: ที่ n-child (1) DIV: ที่ n-child (2) DIV: ที่ n-child (1) H4: ที่ n-child (2)

รหัส:

function getSelector(el)
{
    var $el = jQuery(el);

    var selector = $el.parents(":not(html,body)")
                .map(function() { 
                                    var i = jQuery(this).index(); 
                                    i_str = ''; 

                                    if (typeof i != 'undefined') 
                                    {
                                        i = i + 1;
                                        i_str += ":nth-child(" + i + ")";
                                    }

                                    return this.tagName + i_str; 
                                })
                .get().reverse().join(" ");

    if (selector) {
        selector += " "+ $el[0].nodeName;
    }

    var index = $el.index();
    if (typeof index != 'undefined')  {
        index = index + 1;
        selector += ":nth-child(" + index + ")";
    }

    return selector;
}

1

สิ่งนี้จะช่วยให้คุณเลือกเส้นทางขององค์ประกอบ HTML ที่คลิก -

 $("*").on("click", function() {

    let selectorPath = $(this).parents().map(function () {return this.tagName;}).get().reverse().join("->");

    alert(selectorPath);

    return false;

});

1

ฉันเขียนปลั๊กอิน jQuery ง่ายๆนี้

การดำเนินการนี้จะตรวจสอบรหัสหรือชื่อคลาสและพยายามระบุตัวเลือกที่แน่นอนให้มากที่สุด

jQuery.fn.getSelector = function() {

    if ($(this).attr('id')) {
        return '#' + $(this).attr('id');
    }

    if ($(this).prop("tagName").toLowerCase() == 'body')    return 'body';

    var myOwn = $(this).attr('class');
    if (!myOwn) {
        myOwn = '>' + $(this).prop("tagName");
    } else {
        myOwn = '.' + myOwn.split(' ').join('.');
    }

    return $(this).parent().getSelector() + ' ' + myOwn;
}

0

คุณพยายามหาชื่อแท็กปัจจุบันที่ถูกคลิกหรือไม่

ถ้าเป็นเช่นนั้นให้ทำ ..

$("*").click(function(){
    alert($(this)[0].nodeName);
});

คุณไม่สามารถจริงๆได้รับ "เลือก" ที่ "ตัวเลือก" *ในกรณีของคุณคือ


ฉันไม่ต้องการชื่อแท็ก ฉันต้องการเพียงแค่เส้นทางไปยังองค์ประกอบที่ฉันคลิก
Fidilip

1
AH การเริ่มต้นจะมี "เส้นทางไปยังองค์ประกอบ" ที่ไหนสักแห่งนั้นแตกต่างจาก "ตัวเลือก" มาก ดังนั้นคุณต้องการองค์ประกอบและชื่อโหนดพ่อแม่ทั้งหมดหรือไม่?
Mark Schultheiss

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

0

รหัส Javascript เหมือนกันในกรณีที่มีคนต้องการตามที่ฉันต้องการ นี่เป็นเพียงการแปลเฉพาะคำตอบที่เลือกข้างต้น

    <script type="text/javascript">

function getAllParents(element){
    var a = element;
    var els = [];
    while (a && a.nodeName != "#document") {
        els.unshift(a.nodeName);
        a = a.parentNode;
    }
    return els.join(" ");
}

function getJquerySelector(element){

    var selector = getAllParents(element);
    /* if(selector){
        selector += " " + element.nodeName;
    } */
    var id = element.getAttribute("id");
    if(id){
        selector += "#" + id;
    }
    var classNames = element.getAttribute("class");
    if(classNames){
        selector += "." + classNames.replace(/^\s+|\s+$/g, '').replace(/\s/gi, ".");
    }
    console.log(selector);
    alert(selector);
    return selector;
}
</script>

0

โดยคำนึงถึงคำตอบบางส่วนอ่านที่นี่ฉันต้องการเสนอสิ่งนี้:

function getSelectorFromElement($el) {
  if (!$el || !$el.length) {
    return ;
  }

  function _getChildSelector(index) {
    if (typeof index === 'undefined') {
      return '';
    }

    index = index + 1;
    return ':nth-child(' + index + ')';
  }

  function _getIdAndClassNames($el) {
    var selector = '';

    // attach id if exists
    var elId = $el.attr('id');
    if(elId){
      selector += '#' + elId;
    }

    // attach class names if exists
    var classNames = $el.attr('class');
    if(classNames){
      selector += '.' + classNames.replace(/^\s+|\s+$/g, '').replace(/\s/gi, '.');
    }

    return selector;
  }

  // get all parents siblings index and element's tag name,
  // except html and body elements
  var selector = $el.parents(':not(html,body)')
    .map(function() {
      var parentIndex = $(this).index();

      return this.tagName + _getChildSelector(parentIndex);
    })
    .get()
    .reverse()
    .join(' ');

  if (selector) {
    // get node name from the element itself
    selector += ' ' + $el[0].nodeName +
      // get child selector from element ifself
      _getChildSelector($el.index());
  }

  selector += _getIdAndClassNames($el);

  return selector;
}

อาจมีประโยชน์ในการสร้างปลั๊กอิน jQuery?


0

ขอบคุณ p1nox!

ปัญหาของฉันคือการให้ความสำคัญกับการโทร ajax ที่กำลังแก้ไขส่วนหนึ่งของแบบฟอร์ม

$.ajax({  url : "ajax_invite_load.php",
        async : true,
         type : 'POST',
         data : ...
     dataType : 'html',
      success : function(html, statut) {
                    var focus = $(document.activeElement).getSelector();
                    $td_left.html(html);
                    $(focus).focus();
                }
});

ฉันแค่ต้องการห่อหุ้มฟังก์ชันของคุณในปลั๊กอิน jQuery:

    !(function ($, undefined) {

    $.fn.getSelector = function () {
      if (!this || !this.length) {
        return ;
      }

      function _getChildSelector(index) {
        if (typeof index === 'undefined') {
          return '';
        }

        index = index + 1;
        return ':nth-child(' + index + ')';
      }

      function _getIdAndClassNames($el) {
        var selector = '';

        // attach id if exists
        var elId = $el.attr('id');
        if(elId){
          selector += '#' + elId;
        }

        // attach class names if exists
        var classNames = $el.attr('class');
        if(classNames){
          selector += '.' + classNames.replace(/^\s+|\s+$/g, '').replace(/\s/gi, '.');
        }

        return selector;
      }

      // get all parents siblings index and element's tag name,
      // except html and body elements
      var selector = this.parents(':not(html,body)')
        .map(function() {
          var parentIndex = $(this).index();

          return this.tagName + _getChildSelector(parentIndex);
        })
        .get()
        .reverse()
        .join(' ');

      if (selector) {
        // get node name from the element itself
        selector += ' ' + this[0].nodeName +
          // get child selector from element ifself
          _getChildSelector(this.index());
      }

      selector += _getIdAndClassNames(this);

      return selector;
    }

})(window.jQuery);

-1

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

$('.mybtn').click( function(event){
    console.log("%s", this);    // output: "button.mybtn"
});

https://developer.chrome.com/devtools/docs/console-api#consolelogobject-object


-3

เกี่ยวกับ:

var selector = "*"
$(selector).click(function() {
    alert(selector);
});

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

$("div").find("a").click(function() {
    // what would expect the 'selector' to be here?
});

jQuery ภายในสร้างตัวเลือกคือ$('div').find('a').selector div aหากเหตุการณ์ไม่ได้สร้างขึ้นผ่านฟังก์ชัน jQuery แต่เป็น wrapper แทนฉันเชื่อว่าตัวเลือกสามารถส่งผ่านเป็นอาร์กิวเมนต์ข้อมูลไปยังตัวจัดการเหตุการณ์ได้
Anurag

1
นี่เป็นคำตอบที่จริงจังหรือไม่?
Glen

-5

คำตอบที่ดีที่สุดคือ

var selector = '#something';

$(selector).anything(function(){
  console.log(selector);
});

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