jquery 脚本在存在表单标签时在 asp.net 母版页中不起作用,但当我删除它时脚本起作用。是什么原因造成的?

jquery script doesn't work in asp.net masterpage when form tag is present but script works when i remove it. What is causing this?

这是我的标记。简要说明 main-nav__list 在 handhleds 上隐藏并且脚本切换 class main-nav__list--当你 select 汉堡包图标时可见。如果我用 id=form1 和 runat server 取出下面的表单标签,一切正常。有了它,脚本会简要地滑动切换元素。如果我使用 toggleclass 或 slidetoggle,它的工作原理是一样的。它在切换 class 中工作了一瞬间,然后消失了。我试过将它放在页面的不同区域,表单标签的外部和内部以及外部,但如果表单标签在那里,它总是工作相同。我需要保持 runat 服务器表单标签我假设。说到 asp.net,我是个菜鸟。是什么原因造成的,我该怎么做才能解决这个问题?

    <form id="form1" runat="server"> 
<header role="banner" id="header">
    <nav role="navigation" class="main-nav grid-container">
        <a href="../Default.aspx" class="logo"></a>
        <ul class="main-nav__list">
            <li class="main-nav__list__item"><a></a></li>
            <li class="main-nav__list__item"><a></a></li>
            <li class="main-nav__list__item"><a></a></li>
            <li class="main-nav__list__item"><a></a></li>
        </ul>
    </nav>
    <button class="btn--hamburger-icon">
        <div></div>
        <div></div>
        <div></div>
    </button>
</header>
<div>
    <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
    </asp:ContentPlaceHolder>
</div>

</form>

这是脚本。我只把脚本放在页面底部,方便我测试。

  <script type="text/javascript" lang="javascript">
    $(document).ready(function () {
        $(".btn--hamburger-icon").on("click", function () {
            $(".main-nav__list").toggleclass("main-nav__list--is-visible");
        });
    });
</script>

这里是相关的 css.

     .main-nav__list--is-visible {
    display: flex !important;
    z-index: 9999 !important;
   }

       .logo {
      width: auto;
      height: rem-calc(50px);
      padding: rem-calc(0 10px);
      font-family: 'Metal Mania', cursive;
      font-size: 30px;
      text-align: center;
      line-height: rem-calc(50px);
      color: #ffffff;
      z-index: 9999;}

     .main-nav {
       position: relative;
       display: flex;
       flex-direction: row;
       flex-wrap: nowrap;
   @include respond-to(desktops) {
    position: static;
    justify-content: space-between;
      }
   }

  .main-nav__list {
      position: absolute;
      top: rem-calc(50px);
      left: 0;
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      width: 100%;
      height: rem-calc(200px);
      text-align: center;
      display: none;


@include respond-to(desktops) {
    position: static;
    top: auto;
    left: auto;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    width: auto;
    height: auto;
     }
   }

 .main-nav__list__item {
    display: flex;
    height: rem-calc(50px);
    background-color: $nav-background-color;
    width: 100%;
   @include respond-to(desktops) {
      width: auto;
         }
     a {
        color: #ffffff;
        line-height: rem-calc(50px);
        height: 50px;
        width: 100%;
     @include respond-to(desktops) {
        width: auto;
        padding: 0 14px 0 14px;
    }

    &:hover {
        background-color: $nav-hover-color;
         }
      }
  }
 .btn--hamburger-icon {
      display: block;
      position: absolute;
      top: rem-calc(5px);
      right: rem-calc(2px);
      width: rem-calc(39px);
      height: rem-calc(39px);
      padding: rem-calc(1px 4px);
      background: $nav-background-color;
      border: none;
      cursor: pointer;
      outline: none;
@include respond-to(desktops) {
    display: none;
}
& > div {
    width: rem-calc(17px);
    height: rem-calc(3px);
    background: #ffffff;
    margin: rem-calc(3px 0);
    text-align: center;
    }
 }

按钮提交表单。也就是说,在您的脚本执行后,表单的内容被发送到服务器并重新加载页面。

你不想这样,所以可能的解决方案是:

  1. 给按钮type="button"让它不再提交。 (按钮默认为type="submit"

    <button class="btn--hamburger-icon" type="button">
    
  2. return false 在点击处理函数的末尾,以防止按钮执行其默认操作

    $(".btn--hamburger-icon").on("click", function () {
        $(".main-nav__list").toggleclass("main-nav__list--is-visible");
        return false;
    });
    

顺便说一句,这个问题不是ASP.NET特有的;它也发生在计划 HTML/Javascript 环境中。