ClassList.toggle() не работает IE11 Angular 7 (недопустимый вызывающий объект)

Я только что тестировал свое приложение в IE11 и не могу понять, почему оно не работает.

У меня есть этот код, он состоит из трех элементов .hamburger-small, .hamburger-big и .menu

<div [class.shown] = "!chatbarFullscreen">
        <div [class.disabled] = "router.url.includes('home')">
            <img (click) = "closeChatbar(true, router.url.includes('home') ? true : false)" *ngIf = "chatbarFullscreen" src = "../assets/images/whole-app/arrow-right.svg" alt = "Arrow Right">
            <img (click) = "closeChatbar(false, router.url.includes('home') ? true : false)" *ngIf = "!chatbarFullscreen" src = "../assets/images/whole-app/arrow-left.svg" alt = "Arrow Left">
        </div>
        <img (click) = "goHome()" src = "../assets/images/chatbar/header-logo.svg" alt = "header logo">
        <div id = "small" (click) = "hamburgerClick()" class = "hamburger hamburger--slider hamburger-small">
            <div class = "hamburger-box">
              <div class = "hamburger-inner"></div>
            </div>
        </div>
    </div>
    <div id = "big" (click) = "hamburgerClick()" class = "hamburger hamburger--slider hamburger-big">
        <div class = "hamburger-box">
          <div class = "hamburger-inner"></div>
        </div>
    </div>
    <div class = "menu">
        <p (click) = "closeChatbar(false); hamburgerClick();" [routerLink] = "['/app/main/home']">Home</p>
    </div>
</div>

и когда вы нажимаете на нее, она вызывает эту функцию

hamburgerClick() {
    const small = <HTMLElement>document.querySelector('.hamburger-small');
    const big = <HTMLElement>document.querySelector('.hamburger-big');
    const menu = <HTMLElement>document.querySelector('.menu');
    small.classList.toggle('is-active');
    big.classList.toggle('is-active');
    menu.classList.toggle('show');
}

теперь он работает в любом другом браузере, Chrome, Firefox, Safari и Edge, но не в IE. Я видел похожие вопросы, но кажется, что это должно работать? Я также получаю эту ошибку в консоли, когда я нажимаю кнопку в первый раз, но в другой раз этого не происходит.

ClassList.toggle() не работает IE11 Angular 7 (недопустимый вызывающий объект)

любая помощь будет здорово..

РЕДАКТИРОВАТЬ

Я пытался использовать @ViewChild(), но он по-прежнему не работает, однако ошибка Invalid Calling Object больше не возникает.

@ViewChild('hamburgerBig') hamburgerBig: ElementRef;
@ViewChild('hamburgerSmall') hamburgerSmall: ElementRef;
@ViewChild('menu') menu: ElementRef;

hamburgerClick() {
    this.hamburgerBig.nativeElement.classList.toggle('is-active');
    this.hamburgerSmall.nativeElement.classList.toggle('is-active');
    this.menu.nativeElement.classList.toggle('show');
}

Спасибо!!

Вы пробовали ViewChild запросить элемент?

Chellappan வ 13.03.2019 06:41

@Chellappan не уверен, что ты имеешь в виду?

Smokey Dawson 13.03.2019 06:42

Вы можете запросить элемент в angular с помощью ViewChild. Проверьте этот документ: angular.io/api/core/ViewChild

Chellappan வ 13.03.2019 06:45
stackoverflow.com/questions/38944725/…
Chellappan வ 13.03.2019 06:47

не могли бы вы добавить HTML с классом «.hamburger-small» и «.menu», если это не определено на странице, это проблема

Bhavin Solanki 13.03.2019 06:50

@Chellappan с использованием @ViewChild не сработало

Smokey Dawson 13.03.2019 06:53

Если возможно, вы можете создать stackblitz?

Chellappan வ 13.03.2019 06:54

@BhavinSolanki Я добавил свой полный код, но он работает в любом другом браузере, не понимаю, как, если бы мне не хватало элементов, он работал бы где угодно еще

Smokey Dawson 13.03.2019 06:57

вам нужно поместить ссылку на шаблон на элемент при использовании ViewChild

Chellappan வ 13.03.2019 07:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
9
1 919
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте выполнить тест с приведенным ниже кодом, который может помочь вам решить вашу проблему.

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  public show:boolean = false;
  public buttonName:any = 'Show';

  ngOnInit () {  }

  toggle() {
    this.show = !this.show;

    // CHANGE THE NAME OF THE BUTTON.
    if (this.show)  
      this.buttonName = "Hide";
    else
      this.buttonName = "Show";
  }
}
.is-active{color:green;
}
<button (click) = "toggle()" id = "bt">
    Hide
</button>

<ng-container *ngIf = "show">
    <div style = "margin: 0 auto;text-align: left;">
        <div>
            <label>Name:</label>
            <div><input id = "tbname" name = "yourname" /></div>
        </div>
        <div>
            <label>Email Address:</label>
            <div><input name = "email" id = "email" /></div></div>
        <div>
            <label>Additional Information (optional):</label>
            <div><textarea rows = "5" cols = "46"></textarea></div>
        </div>
    </div>
</ng-container>

Кроме того, вы можете попробовать изменить код в соответствии с вашими требованиями.

Ответ принят как подходящий

попробуйте использовать Renderer2 для управления элементами dom вместе с ElementRef и ViewChild, как упоминалось ранее.

первый импорт ViewChild, ElementRef и Renderer2

import { Renderer2, ElementRef, ViewChild } from '@angular/core';

получить элемент, используя ViewChild типа ElementRef после того, как вы сделали ссылки на шаблоны в своей DOM, например

<div #hamburgerBig></div>
<div #hamburgerSmall></div>
<div #menu></div>

@ViewChild('hamburgerBig') hamburgerBig: ElementRef;
@ViewChild('hamburgerSmall') hamburgerSmall: ElementRef;
@ViewChild('menu') menu: ElementRef;

и делайте свои вещи с помощью функции hamburgerClick

hamburgerClick() {
    const hamBigIsActive = this.hamburgerBig.nativeElement.classList.contains('is-active');
    const hamSmallIsActive = this.hamburgerSmall.nativeElement.classList.contains('is-active');
    const menuShow = this.menu.nativeElement.classList.contains('show');

    if (hamBigIsActive) {
     this.renderer.removeClass(this.hamburgerBig.nativeElement, 'is-active');
    } else {
      this.renderer.addClass(this.hamburgerBig.nativeElement, 'is-active');
    }
    if (hamSmallIsActive) {
     this.renderer.removeClass(this.hamburgerSmall.nativeElement, 'is-active');
    } else {
      this.renderer.addClass(this.hamburgerSmall.nativeElement, 'is-active');
    }
    if (hamSmallIsActive) {
      this.renderer.removeClass(this.menu.nativeElement, 'show');
    } else {
      this.renderer.addClass(this.menu.nativeElement, 'show');
    }
}

или вы можете просто использовать [ngClass] (не знаю, почему вы не используете это вместо этого) надеюсь это поможет

также не забудьте добавить рендер в свой конструктор

contructor(private renderer: Renderer2){}

Обновлено: вот реализация [ngClass]

<div id = "small" 
(click) = "hamburgerClick()"
[ngClass] = "{'is-active' : hamClick}"
class = "hamburger hamburger-- 
slider hamburger-small">
        <div class = "hamburger-box">
          <div class = "hamburger-inner"></div>
        </div>
</div>
<div id = "big" 
(click) = "hamburgerClick()"
[ngClass] = "{'is-active' : hamClick}"
class = "hamburger hamburger--slider 
 hamburger-big">
    <div class = "hamburger-box">
      <div class = "hamburger-inner"></div>
    </div>
</div>
<div 
[ngClass] = "{'show' : hamClick}"
class = "menu">
    <p (click) = "closeChatbar(false); hamburgerClick();" [routerLink] = " 
    ['/app/main/home']">Home</p>
</div>

а затем просто используйте функцию для переключения

 hamClick: boolean

 hamburgerClick(){
   this.hamClick = !this.hamClick;
 }

ну вот

Привет! Я использовал [ngClass], и это сработало! Я даже не думал об этом, если вы отредактируете свой вопрос, чтобы включить решение с [ngClass], я отмечу его как правильное!

Smokey Dawson 13.03.2019 23:16

@SmokeyDawson, конечно, приятель.

Rogelio 14.03.2019 05:15

@SmokeyDawson добавил

Rogelio 14.03.2019 05:30

Здорово! Спасибо еще раз!

Smokey Dawson 14.03.2019 05:41

Другие вопросы по теме