Tengo una extensión de Chrome que se basa en la detección de eventos de clic en la barra de búsqueda de Netflix. El div ([data-uia=timeline-bar]) se agrega dinámicamente a dom una vez que el usuario pasa el mouse sobre el reproductor de video, así que traté de usar el burbujeo de eventos para escuchar el evento.
//after injecting jquery on page $('body').on('click','[data-uia=timeline-bar]',function(e){ console.log('click detected'); })No funcionó, así que traté de agregar un oyente en la fase de captura. Se detectan todos los eventos de clic, excepto el clic de la barra de búsqueda.
document.addEventListener('click', (e) => {console.log('click detected during capture phase')} ,true);¿Hay alguna forma de escuchar el evento de clic en ([data-uia=timeline-bar])?
¿Agregar un MutationObserver al elemento principal del elemento [data-uia=timeline-bar] que observa cuando sus hijos cambian, por ejemplo, se agrega la barra de línea de tiempo? y en la devolución de llamada, adjunta un oyente una vez que se agrega el elemento de barra de línea de tiempo?
// The timeline-bar's parent's data-uia is "timeline" in the Netflix player DOM. let parent = document.querySelector("[data-uia=timeline]"), options = { childList: true }, observer = new MutationObserver(mCallback); observer.observe(parent, options); function mCallback (mutations) { for (let mutation of mutations) { if (mutation.type === 'childList') { for(let node of mutation.addedNodes){ if(node.getAttribute("data-uia") === "timeline-bar"){ node.addEventListener('click', () => { alert("clicked"); // Do click stuff... }); } } } } } // To test the observer btnAttr.addEventListener('click', function () { let el = document.createElement("div"); el.setAttribute("data-uia", "timeline-bar"); el.innerText = "A TIMELINE-BAR"; parent.appendChild(el); }, false);codepen aquí: https://codepen.io/freedruk/pen/powaKBy
De hecho, su objetivo necesita trabajo duro, ya que los elementos dom se crean y eliminan de forma permanente. El único enfoque que puedo proponer ciertamente puede considerarse sucio, pero al menos puedes intentarlo;)
$("[data-uia='player']").on("DOMSubtreeModified", function(){ const ref = "div[data-uia='timeline-knob']"; if($(ref)){ $(ref).off("mouseover").on("mouseover", function(event){ const that = $(this); const previousSibling = event.target.previousSibling; if(previousSibling.style.left){ console.log("Click presumed"); } else { console.log("released"); } }); }; });El truco consiste en observar el objeto de la perilla de la línea de tiempo y analizar la situación en el div hermano anterior, porque se producen algunos repintados cuando el mouse está sobre la línea de tiempo.
Es solo una solución, espero que esto pueda ayudarte :) ¡Que tengas un buen día!
[EDITAR 1]
Una forma más elegante:
const ref = "div[data-uia='timeline'].active"; const onclick = (e) => { console.log("clicked on", e); }; const prepare = (obj, e) => { $(e.target).css("pointer-events","auto").css("border", "0.1px solid rgba(255,255,255,0)"); $(obj).off("click.test").on("click.test", (clickevent) => {onclick(clickevent.target);}); }; $("[data-uia='player']").on("DOMSubtreeModified", function(modevent){ $(ref).each(() => { prepare(ref,modevent); }); });Tuve que enfrentar varias dificultades:
Probé este código varias veces y parece funcionar bien ;)