ตรวจจับเหตุการณ์เมื่อคุณสมบัติ css เปลี่ยนโดยใช้ Jquery


91

มีวิธีตรวจสอบว่าคุณสมบัติ css "display" ขององค์ประกอบมีการเปลี่ยนแปลงหรือไม่ (ไม่ว่าจะไม่มีหรือบล็อกหรือบล็อกแบบอินไลน์ ... ) ถ้าไม่มีปลั๊กอินใด ๆ ขอบคุณ

คำตอบ:


93

บันทึก

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

ใช่คุณสามารถ. DOM L2 โมดูลกิจกรรมกำหนดเหตุการณ์การกลายพันธุ์ ; หนึ่งในนั้น - DOMAttrModifiedคือสิ่งที่คุณต้องการ จริงอยู่สิ่งเหล่านี้ไม่ได้ถูกนำไปใช้อย่างกว้างขวาง แต่ได้รับการสนับสนุนอย่างน้อยในเบราว์เซอร์ Gecko และ Opera

ลองทำตามบรรทัดเหล่านี้:

document.documentElement.addEventListener('DOMAttrModified', function(e){
  if (e.attrName === 'style') {
    console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue);
  }
}, false);

document.documentElement.style.display = 'block';

นอกจากนี้คุณยังสามารถลองใช้IE ของ "propertychange" เหตุการณ์DOMAttrModifiedแทนไป ควรอนุญาตให้ตรวจจับstyleการเปลี่ยนแปลงได้อย่างน่าเชื่อถือ


ขอบคุณ. จะรองรับ Firefox หรือไม่?
HP.

7
@Boldewyn: จริง แต่การเปลี่ยนclassแอตทริบิวต์ (หรือแอตทริบิวต์อื่น ๆ หากมีตัวเลือกแอตทริบิวต์อยู่ใน CSS) ของบรรพบุรุษขององค์ประกอบอาจเปลี่ยนองค์ประกอบได้ดังนั้นคุณต้องจัดการDOMAttrModifiedเหตุการณ์ทั้งหมดในองค์ประกอบรากของเอกสาร มั่นใจในการจับทุกอย่าง
Tim Down

12
เหตุการณ์นั้นเลิกใช้แล้วใน w3c มันต้องมีวิธีอื่น
ccsakuweb

8
เหตุการณ์การกลายพันธุ์ถูกทำเครื่องหมายว่าเลิกใช้แล้วในข้อกำหนดของเหตุการณ์ DOM เนื่องจากการออกแบบของ API มีข้อบกพร่อง Mutation Observers คือสิ่งทดแทนที่เสนอ นี่คือลิงค์ [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf

1
Anmol - ลิงก์ MDN สำหรับเหตุการณ์การกลายพันธุ์ควรเป็น: developer.mozilla.org/en-US/docs/Web/Guide/Events/…
groovecoder

19

คุณสามารถใช้attrchange jQuery ปลั๊กอิน หน้าที่หลักของปลั๊กอินคือการผูกฟังก์ชั่น Listener กับการเปลี่ยนแปลงคุณสมบัติขององค์ประกอบ HTML

ตัวอย่างโค้ด:

$("#myDiv").attrchange({
    trackValues: true, // set to true so that the event object is updated with old & new values
    callback: function(evnt) {
        if(evnt.attributeName == "display") { // which attribute you want to watch for changes
            if(evnt.newValue.search(/inline/i) == -1) {

                // your code to execute goes here...
            }
        }
    }
});

โปรดทราบว่าสำหรับปลั๊กอินบางตัวที่แก้ไข CSS evnt.attributeName คือ 'style' ไม่ใช่ 'display'
jerrygarciuh

ใช้งานได้ดี แต่เร็วกว่าการใช้การค้นหา regex และคุณไม่จำเป็นต้องใช้สิ่งแรก if (evnt.attributeName ... ): if (evnt.newValue.indexOf ('display: inline-block')> -1) {. .. ; return;}
Dan Randolph

4

คุณสามารถใช้cssฟังก์ชันของ jQuery เพื่อทดสอบคุณสมบัติ CSS เช่น if ($('node').css('display') == 'block').

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

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

ไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหาหรือไม่


3

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

$(".observed-element").on("webkitTransitionEnd transitionend", function(e) {
  console.log("end", e);
  alert("z-index changed");
});

$(".changeButton").on("click", function() {
  console.log("click");
  document.querySelector(".observed-element").style.zIndex = (Math.random() * 1000) | 0;
});
.observed-element {
  transition: z-index 1ms;
  -webkit-transition: z-index 1ms;
}
div {
  width: 100px;
  height: 100px;
  border: 1px solid;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="changeButton">change z-index</button>
<div class="observed-element"></div>


-17

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


1
ฉันมีหลายเหตุการณ์ที่สามารถทำให้กล่องปรากฏขึ้นหรือไม่ และฉันมีองค์ประกอบอีกอย่างที่ขึ้นอยู่กับลักษณะของกล่องนั้นในการทำสิ่งต่างๆ ตอนนี้ฉันไม่ต้องการทำโค้ดซ้ำและเชื่อมโยงกับเหตุการณ์อื่น ๆ ทั้งหมดที่ปรากฏในกล่องแม้ว่านั่นจะเป็นวิธีหนึ่งในการทำก็ตาม ซ้ำซ้อน!
HP.

มันซ้ำซ้อนบางทีการใช้ระบบตามกฎจะได้ผล? กล่าวคือ JSON บางอย่างเช่นโครงสร้างที่กำหนดสิ่งที่ควรเกิดขึ้นกับการควบคุมบางอย่างเมื่อการควบคุมอื่นเปลี่ยนแปลง? ด้วยวิธีนี้คุณจะต้องสร้าง 1 ฟังก์ชันโดยใช้อ็อบเจกต์กฎและบางทีการควบคุมปัจจุบัน (id) เป็นพารามิเตอร์?
Colin

3
เหตุใดจึงลดลง การกำหนดคลาสสำหรับพาเรนต์ของทั้งสององค์ประกอบและการเปลี่ยนสไตล์เป็นวิธีเดียวที่เหมาะสมสำหรับสิ่งนี้
Ilia G

11
โหวตให้ "ฉันนึกเหตุผลไม่ออกว่าทำไมคุณถึงอยากให้เหตุการณ์เปลี่ยนรูปแบบ" - ถ้าคุณนึกเหตุผลไม่ออกก็ไม่ได้หมายความว่าไม่มีเหตุผลที่เป็นไปได้และสำหรับ "Why ไม่เพิ่มตรรกะพิเศษที่นั่น? " - เนื่องจากคุณไม่สามารถแก้ไขสคริปต์ได้ตลอดเวลา
Andrei Cojea

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