【问题标题】:Ionic find if a child was clicked through parents click event离子查找是否通过父母点击事件点击了孩子
【发布时间】:2019-01-02 09:18:27
【问题描述】:

我有一个带有标签的复选框,即使标签被点击,Ionic 也会触发复选框事件。

我将动态 HTML 绑定到这样的标签:

<ion-label [innerHTML]="htmlString"></ion-label>

并且 htmlString 可以包含 &lt;a&gt; 元素。当用户点击这些元素时,必须发生某种动作。我正在尝试在不手动将事件处理程序绑定到 &lt;a&gt; 元素的情况下执行此操作:

checkBoxEvent(e){
     if ((e.target as HTMLElement).tagName === 'A') {
      alert('link found')
    }
  }

但它没有找到链接。有什么建议吗?

这是一个工作/可编辑的示例: https://stackblitz.com/edit/ionic-kdzcwt?file=pages%2Fhome%2Fhome.ts

编辑:抱歉,如果不清楚,但我只需要在单击链接时显示警报。单击标签的其他部分时,不应显示警报。

【问题讨论】:

    标签: javascript angular ionic-framework ionic3 dom-events


    【解决方案1】:

    在您的示例链接中,eundefined,因为您没有将 $event 作为 checkBoxEvent() 函数的参数传递。在html模板文件中,你应该将&lt;ion-checkbox (click)="checkBoxEvent()" &gt;&lt;/ion-checkbox&gt;替换为&lt;ion-checkbox (click)="checkBoxEvent($event)" &gt;&lt;/ion-checkbox&gt;

    另外,(e.target as HTMLElement).tagName 不是'A' 而是'BUTTON'。我认为这是由ion-checkbox 的实施引起的。所以你也应该用if ((e.target as HTMLElement).tagName === 'BUTTON')替换if ((e.target as HTMLElement).tagName === 'A')来得到你想要的。


    更新

    下面的元素覆盖了你的innerHTML,所以点击事件被拦截了。

    <button class="item-cover item-cover-md item-cover-default item-cover-default-md" ...> ...</button>
    

    所以一种方法是将z-index 添加到ion-label 并为a 标签元素添加事件监听器。但是如果你想让复选框正常工作,你应该添加比下面更多的代码。

    .html

    <ion-label style="z-index:100;" #ref ></ion-label>
    <ion-checkbox></ion-checkbox>
    

    .ts

    @ViewChild('ref') ref: ElementRef;
    ngAfterViewInit() {
        this.ref.nativeElement.innerHTML = "This is a test label to test <a>link</a> click events";
        this.render.listen(this.ref.nativeElement.getElementsByTagName('a')[0],'click',()=>{alert('link found')})
    }
    

    另一种方式是使用经典的checkboxlabel,正如@Duannx所说。这种方式给你更优雅的代码,但让你编写更多的样式代码。

    【讨论】:

    • 你是对的。但是你的建议是不正确的。我认为 OP 应该使用 html 标签和复选框而不是 Ionic 组件
    • 有几种方法可以实现 OP 想要的。我的方式只是其中之一。以我的方式,OP 可以通过其父元素访问a 元素,而无需大量更改源代码。当然,你的方法也行。
    • 但我只需要在按下 标签时显示警报。
    • 哦,那我的方法不对。我会修改anwser。
    【解决方案2】:

    使用 ViewChild 引用 ion-label 组件

     <ion-label #ref ></ion-label>
    

    如果你想在链接前和链接后添加动态数据,你需要像这样使用三个元素

      <span #ref></span>
      <a #anchor (click)="onClick()" ></a>
      <span #las></span>
    

    我正在使用模板引用到离子复选框,以便在单击链接时可以切换

      <ion-checkbox  #checkbox> </ion-checkbox>
    

    component.ts

      onClick(){
             this.checkbox.checked=!this.checkbox.checked;
      }
      ngAfterViewInit(){
              this.ref.nativeElement.innerHTML=`This is a test label to test`;
              this.anchor.nativeElement.innerHTML=`link`;
              this.las.nativeElement.innerHTML=`click events`;
      }    
    

    例如:https://stackblitz.com/edit/ionic-tmizxm

    【讨论】:

    • 我已更改答案检查答案! stackblitz.com/edit/ionic-tmizxm
    • 抱歉,不太明白你的意思,stackblitz 没有显示出想要的结果。
    • 如果您单击要选中复选框的链接,我已经更新了答案检查如果您单击链接,它将自动选中复选框
    • 不,我希望仅在单击链接时显示警报。没有将事件处理程序附加到链接。通过复选框事件。单击链接时不应选中复选框。如果单击标签的任何其他部分(不是链接),则 ckeckbox 应该检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2012-12-07
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多