The content of this article is about the influence between the href default behavior of the parent element a tag and the response of the click event bound to the child element. It has certain reference value. Friends in need can refer to it. , hope it helps you.

Encountered a problem during the development process, simply write a demo The running environment is Chrome 68

Describe this problem, when there is nesting inside the a tag, the href default behavior of the parent element a tag There is an impact on the response to the click event bound to the child element. Page structure:

nbsp;html>



    <meta>
    <meta>
    <meta>
    <title>a标签内部点击事件失效</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .father {
            display: block;
            width: 500px;
            height: 200px;
            background-color: rgb(210, 111, 30);
        }

        .child-one {
            display: block;
            width: 200px;
            height: 50px;
            background-color: rgb(174, 43, 226);
        }

        .child-two {
            display: block;
            width: 200px;
            height: 50px;
            background-color: rgb(43, 226, 67);
        }

        .child-three {
            display: block;
            width: 200px;
            height: 50px;
            background-color: rgb(43, 137, 226);
        }
    </style>



    <a>父标签
        <span>
            子标签1
        </span>
        <object>
            <a>
                子标签2
            </a>
        </object>
        <object>
            <a>
                子标签3
            </a>
        </object>
    </a>
    <script>    
        let father = document.querySelector(&#39;.father&#39;);
        let ele1 = document.querySelector(&#39;.child-one&#39;);
        let ele2 = document.querySelector(&#39;.child-two&#39;);
        let ele3 = document.querySelector(&#39;.child-three&#39;);

        ele1.addEventListener(&#39;click&#39;, function (e) {
            e.stopPropagation();
            // e.preventDefault();
            alert(&#39;click child-one&#39;)
            window.location.href = &#39;child-one&#39;
        }, false)

        ele2.addEventListener(&#39;click&#39;, function (e) {
            e.stopPropagation();
            alert(&#39;click child-two&#39;)
            // window.location.href=&#39;child-two&#39;
        }, false)

        ele3.addEventListener(&#39;click&#39;, function (e) {
            alert(&#39;click child-three&#39;)
            window.location.href = &#39;child-three&#39;
        }, false)

        father.addEventListener(&#39;click&#39;, function (e) {
            alert(&#39;click father&#39;)
            window.location.href = &#39;father&#39;
        }, false)

    </script>


The example is as shown below (if the a tag is nested, the browser will parse it incorrectly, so it is wrapped with an object tag).

The default behavior of the parent element <a> tag and the interaction between click events

Perform the operation:

  1. When the parent tag is clicked, 111 will pop up first, and then jump to the parent The href link of the tag.
    Explanation that onclick is executed before href

  2. When child-one is clicked, the click event bound to the element is executed, and alert will pop up, but the location still jumps to father.
    After preventing bubbling, the execution results still do not meet expectations. After adding preventDefault, the child element's own jump is performed.

  3. When child-two is clicked, a response message will pop up, and the href link will jump.

  4. When child-three is clicked, click child-three pops up first, and then href child-three, indicating that the click event precedes href execution.

The above four operations are all easy to understand except 2. In 2, why is the parent element still executed after preventing the event from bubbling? href jump.

Thinking:

First of all, it is certain that event bubbling is indeed blocked because the onclick of the parent element is not executed.
So I guess, the default behavior of the
tag cannot be prevented by canceling bubbling. Even if the event does not bubble up to the parent element, the child element is inside the parent element <a></a> , the <a></a> tag default behavior will still be performed.

Solution:

Add e.preventDefault() in the child elementPrevent default behavior

The parent element does not use<a> tag, use other tags to bind click events and child elements to prevent bubbling </a>

The parent element does not use the href attribute, directly in <a></a> Binding the click event on the label

Recommended related articles:

linkWhat is the difference between label link CSS and @import loading?

HTML tag: Summary of usage of img tag

The above is the detailed content of The default behavior of the parent element tag and the interaction between click events. For more information, please follow other related articles on the PHP Chinese website!