วิธีรับองค์ประกอบตามชื่อคลาสหรือรหัส


125

ฉันกำลังพยายามค้นหาองค์ประกอบใน html โดย angularjs

นี่คือ html:

<button class="btn btn-primary multi-files" type="button">
   <span>Choose multiple files</span>
</button>
<br/><br/>
<input ng-file-select type="file" multiple  style="display: none"/><br/>

ฉันพยายามรับองค์ประกอบปุ่มตามชื่อคลาสหลายไฟล์จากนั้นฉันก็ลอง

var multibutton = angular.element(element.getElementsByClassName(".multi-files"));

แต่ไม่ได้ผลและพยายามelement.findแล้ว แต่ใช้ได้กับแท็กเท่านั้น

มีฟังก์ชันใดบ้างที่สามารถรับองค์ประกอบตาม id หรือ classname ใน angularjs ได้หรือไม่?


บางทีนี่อาจช่วยได้: stackoverflow.com/questions/20801843/…
Wim Deblauwe

คุณไม่จำเป็นต้องสร้างคำสั่งด้วยซ้ำ .. คุณสามารถเพิ่มตัวจัดการเช่น ng-click ในกรณีที่แย่ที่สุดถ้าคุณต้องการรับองค์ประกอบจริงๆคุณสามารถใช้ jQuery syntax ได้ตลอดเวลา
Lucas Holt

คำตอบ:


187

getElementsByClassNameเป็นฟังก์ชันบนเอกสาร DOM ไม่ใช่ทั้ง jQuery หรือฟังก์ชัน jqLite

อย่าใส่ช่วงเวลาก่อนชื่อชั้นเรียนเมื่อใช้:

var result = document.getElementsByClassName("multi-files");

ห่อไว้ใน jqLite (หรือ jQuery ถ้า jQuery ถูกโหลดก่อน Angular):

var wrappedResult = angular.element(result);

หากคุณต้องการเลือกจากelementฟังก์ชันลิงก์ในคำสั่งคุณต้องเข้าถึงการอ้างอิง DOM แทนการอ้างอิง jqLite - element[0]แทนที่จะเป็นelement:

link: function (scope, element, attrs) {

  var elementResult = element[0].getElementsByClassName('multi-files');
}

หรือคุณสามารถใช้document.querySelectorฟังก์ชันนี้ได้ (ต้องการจุดที่นี่หากเลือกตามคลาส):

var queryResult = element[0].querySelector('.multi-files');
var wrappedQueryResult = angular.element(queryResult);

การสาธิต: http://plnkr.co/edit/AOvO47ebEvrtpXeIzYOH?p=preview


1
อาจเป็นที่น่าสังเกตว่าภายในฟังก์ชันลิงก์ element.childElementCount อาจเป็น 0 เนื่องจากเชิงมุมยังไม่มีโอกาสสร้างองค์ประกอบดังนั้นคุณควรเตรียมพร้อมที่จะจัดการโดยไม่มีผลลัพธ์สำหรับ element [0] .getElement .. .
Dylanthepiguy

27

คุณไม่จำเป็นต้องเพิ่ม.ในgetElementsByClassNameเช่น

var multibutton = angular.element(element.getElementsByClassName("multi-files"));

อย่างไรก็ตามเมื่อใช้angular.elementคุณต้องใช้ตัวเลือกสไตล์ jquery:

angular.element('.multi-files');

ควรทำเคล็ดลับ

นอกจากนี้จากเอกสารนี้ "หากมี jQuery ให้ใช้ angular.element เป็นนามแฝงสำหรับฟังก์ชัน jQuery หากไม่มี jQuery angular.element จะมอบสิทธิ์ให้กับ jQuery ในตัวของ Angular ซึ่งเรียกว่า" jQuery lite "หรือ" jqLite ""


สวัสดีขอบคุณสำหรับการตอบกลับฉันลองแล้ว แต่ข้อผิดพลาดบอกว่าฟังก์ชันไม่ได้กำหนด
จัสติน

มันอาจจะใช้งานได้หรือไม่ได้ โปรดตรวจสอบคำตอบของฉันตอนนี้ (ทำการแก้ไข) แล้วคุณจะรู้ว่าต้องทำอย่างไร
Ashesh

หากไม่ได้กำหนดฟังก์ชันคุณอาจไม่ได้โหลด jquery jqlite (ซึ่งใช้หากคุณไม่ได้โหลด jquery ตามที่ @Ashesh กล่าวถึง) ไม่มีฟังก์ชันทั้งหมดที่ jquery มีและ getElementsByClassName เป็นหนึ่งในนั้น
haimlit

5
angular.element ( 'หลายไฟล์'); จะไม่ทำงาน คุณต้องมีช่วงเวลา
Philippe Gioseffi

var multibutton = angular.element (document.getElementsByClassName ("หลายไฟล์"));
Salman Lone

20

คำตอบของ @ tasseKATT ดีมาก แต่ถ้าคุณไม่ต้องการสร้างคำสั่งทำไมไม่ใช้$document?

.controller('ExampleController', ['$scope', '$document', function($scope, $document) {
  var dumb = function (id) {
  var queryResult = $document[0].getElementById(id)
  var wrappedID = angular.element(queryResult);
  return wrappedID;
};

PLUNKR


2
angular.element('#Your element id')ทำงานเดียวกัน
gabbler

3
มันให้ข้อผิดพลาดนี้เป็นเชิงมุม 1.5.8 "การค้นหาองค์ประกอบผ่านตัวเลือกไม่รองรับโดย jqLite"
SP Singh

-4

หากคุณต้องการค้นหาปุ่มตามชื่อคลาสและใช้ jQLite เท่านั้นคุณสามารถทำได้ดังนี้:

var myListButton = $document.find('button').filter(function() {
    return angular.element(this).hasClass('multi-files');
});

หวังว่านี่จะช่วยได้ :)


1
สิ่งนี้ไม่ได้ใช้เชิงมุมและ jquery รวมถึงสถิติที่ไม่ถูกต้องคุณสามารถใช้ jquery เพื่อแทนที่ jqlite ได้ นี่เป็นวิธีที่ถูกต้องในการทำสิ่งนี้ในสภาพแวดล้อมเชิงมุมโดยไม่ต้องลงไปที่องค์ประกอบจาวาสคริปต์วานิลลา ($ document [0])
Dennis Bartlett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.