Weboldal keresés

javascript - Hogyan lehet "Element" típusú értéket kapni a "Element.parentNode"-ból a "Node & ParentNode" helyett?


Az esemény delegálásának receptje a http://youmightnotneedjquery.com/ oldalról:

document.addEventListener(eventName, function(e) {
    // loop parent nodes from the target to the delegation node
    for (var target = e.target; target && target != this; target = target.parentNode) {
        if (target.matches(elementSelector)) {
            handler.call(target, e);
            break;
        }
    }
}, false);

Megpróbálom biztonságosan típusosan átírni TypeScript-re (jelenleg kattintási eseményhez):

export default function delegateClickEventHandling(
    {
      clickTargetSelector,
      container = document
    }: {
      clickTargetSelector: string;
      container: HTMLElement | Document;
    },
    handler: (event: MouseEvent) => void
): void {

  container.addEventListener("click", (event: Event): void => {

    if (!(event instanceof MouseEvent)) {
      return;
    }

    for (
        let targetParentNode: Element | null = event.target as Element;
        isNotNull(targetParentNode) && targetParentNode !== event.currentTarget;
        targetParentNode = targetParentNode.parentNode
    ) {

      if (targetParentNode.matches(clickTargetSelector)) {
        handler(event);
      }
    }
  }, false);
}

A TypeScript fordító ezt mondja nekem:

TS2322: Type '(Node & ParentNode) | null' is not assignable to type 'Element | null'.
Type 'Node & ParentNode' is not assignable to type 'Element | null'.
Type 'Node & ParentNode' is missing the following properties from type 'Element':
 assignedSlot, attributes, classList, className, and 64 more.

A .matches() a Element metódusa - nem tudom meghívni Node & ParentNode-ból). Mit tegyek?

Ha a targetParentNode=targetParentNode.parentNode as Element teljesen rendben van, kérlek magyarázd el, miért.

Utóirat: Kérjük, vegye figyelembe, hogy a any, object és a típusannotáció kihagyása nem megengedett.

Válasz #1

Csak annyi a dolgod, hogy a targetParentNode.parentNode-t Element-re alakítod.

Tehát a for ciklus így nézhet ki:

for (
    let targetParentNode: Element = event.target as Element;
    targetParentNode !== event.currentTarget;
    targetParentNode = targetParentNode.parentNode as Element
) {

  if (targetParentNode.matches(clickTargetSelector)) {
    handler(event);
  }
}

PlaygrounLink

Kapcsolódó cikkek