Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度菜单在IE和Firefox上不起作用_Javascript_Angular_Addeventlistener - Fatal编程技术网

Javascript 角度菜单在IE和Firefox上不起作用

Javascript 角度菜单在IE和Firefox上不起作用,javascript,angular,addeventlistener,Javascript,Angular,Addeventlistener,我正在使用Javascript菜单,在我的angular应用程序中加载onInit,它在Chrome上运行良好,但在IE Edge和Firefox上不起作用 我的typescript文件上的代码是: ngOnInit() { //getmenu items $(document).ready(function() { //addclasses to menu, etc.. }); 因此,在调试之后,我找到了解决方案,即添加一个事件侦听器,而不是document.ready 现在,如

我正在使用Javascript菜单,在我的angular应用程序中加载onInit,它在Chrome上运行良好,但在IE Edge和Firefox上不起作用

我的typescript文件上的代码是:

ngOnInit() {
   //getmenu items
$(document).ready(function() {
  //addclasses to menu, etc.. 
});
因此,在调试之后,我找到了解决方案,即添加一个事件侦听器,而不是document.ready

现在,如果我添加eventlistener,事情就会变得混乱:

ngOnInit() {
//getmenu items
window.addEventListener('load', function () {
//addclasses to menu, etc.. 
});
当我第一次加载应用程序登录页面->重定向菜单页面时,它不起作用,但如果我点击f5并在不登录的情况下重新加载页面,它只在firefox上起作用。。在我身上不起作用。但如果我改变:

 window.addEventListener('load', function () 

它在firefox和chrome上不起作用,但在IE上起作用,在刷新页面后,正如我第一次说的那样


所以,问题是,是否有任何类型的事件侦听器可以在每个浏览器上工作?或者,如果我登录,是否每次都必须刷新页面?我知道这个问题有点让人困惑。有人知道如何解决这个问题吗

addEventListener适用于大多数浏览器-请参阅

这可能是因为您太早启动了尝试以下方法:

ngAfterViewInit() {
  window.addEventListener('load', function () {
    //addclasses to menu, etc.. 
  });
}
编辑:

关于我们在评论中的讨论,如果您想进一步延迟执行:

ngAfterViewInit() {
  const interval = setInterval(() => {

    const condition = window.addEventListener
    if (condition) {
      // fire any code you want to when condition is met
      window.addEventListener('load', function () {
        //addclasses to menu, etc.. 
      });
      clearInterval(interval) // stop firing the code
    }
  }, 100) // fire the code every 100ms
}

不确定您想要实现什么,您的条件是什么,或者在满足条件时您想要执行什么代码,但是如果您知道条件是什么,这种延迟代码执行的模式很容易遵循。

您已经在使用OnInit生命周期挂钩。创建/更新/销毁组件时,Angular会调用不同的生命周期挂钩,并允许您对事件进行操作。Angular框架确保这些事件在所有主要浏览器中都能正常工作。对于您的用例,您不需要在ngOnInit方法中使用任何单独的事件侦听器,您可以使用ngOnInit或ngAfterViewInit方法来完成创建组件时所需的所有工作。有关Angular lifecycle hooks的更多信息,您可以阅读。

我知道hagner,我一直在使用onInit,而且效果很好,在这种情况下,我想我会提前启动init上的JS函数。 让我这样说:

当我登录时,我进入仪表板,这意味着;ip:端口/仪表板 现在我告诉你:如果我将页面重新加载到ip:port/ 为什么

如果我点击F5IP:port/仪表板,IE不工作,只有当我重新加载到ip:port时/

这是我的tipescript代码:它包含所有推送和生成菜单的代码,以及单击菜单、子菜单以及单击内部或外部等

menu.compontent.ts:


你检查过你的花粉粒了吗?所有东西都正确导入??我有核心js/es6/*东西,比如集合、地图、日期、符号等。。导入、core js/es6/reflect、core js/es7/reflect和zone.js/dist/ZoneChange为ngAfterViewInit后,问题依然存在,但现在我在任何浏览器上点击f5或crtl+f5,菜单开始工作。。你说得对,因为我很早就开始加载js了。。但是我怎么能延迟呢?你可以延迟JS的执行,但是在setInterval中包装JS,它会一直启动直到满足某些条件。我将在这篇文章中添加一个示例。我尝试了3秒的setInterval并执行JS代码,但问题仍然存在。。我不知道为什么会这样,也不知道会发生什么。如果我将页面重新加载到ip:port/或url/上,它会在每个浏览器上工作,就像菜单只在将页面重新加载到原始url后工作一样。。如果你愿意,我可以发布我的TS代码。。
ngAfterViewInit() {
  const interval = setInterval(() => {

    const condition = window.addEventListener
    if (condition) {
      // fire any code you want to when condition is met
      window.addEventListener('load', function () {
        //addclasses to menu, etc.. 
      });
      clearInterval(interval) // stop firing the code
    }
  }, 100) // fire the code every 100ms
}
export class MenuComponent implements OnInit {
    private sub: any;
    public menu;
    public arr;
    showMenu = '';

  constructor(private _menu: MenuService,
              private router: Router) {}
ngOnInit() {

      let times = 0;
      if( times === 0)
      {
this._menu.getMenu()
          .subscribe( res => {
              let data = res;

              console.log(data);
              this.arr = data;
              this.arr = (<any>Object).values(data);
              console.log(this.arr );
              //debugger;
              times ++; //only push json wich contains menu one time!!
          });
       }
window.addEventListener('load', function () {
"use strict";

          $('.menu > ul > li:has(ul)').addClass('menu-dropdown-icon');
          //Checks if li has sub (ul) and adds class for toggle icon - just an UI

          $('.menu > ul > li > ul:not(:has(ul))').addClass('normal-sub');
          //Checks if drodown menu's li elements have anothere level (ul), if not the dropdown is shown as regular dropdown, not a mega menu (thanks Luka Kladaric)

          $(".menu > nav > div > a").before("<a href=\"#\" class=\"menu-mobile\"><i class='icon-mod-mais fs1'></i></a>");
$(".menu > ul > li").click(function(e) {
              if ($(window).width() > 943) {
                  if ($(this).children('.menu-list').is(":visible")){
                      $(this).children('.menu-list').fadeToggle(15);
                      $(this).children('.menu-list').toggleClass('center');
                      e.preventDefault();
                  } else {
                      $('.menu-list').hide();
                      $('.menu-list').removeClass('center');
                      $(this).children('.menu-list').fadeToggle(15);
                      $(this).children('.menu-list').toggleClass('center');
                      e.preventDefault();
                  }
              }
          });

          $("body").click(function(e) {
              var target = e.target.className;
              if (target.indexOf("menu-button") == -1  ) {
                  $('.menu-list').hide();
                  $('.menu-list').removeClass('center');
                  return;
              }
          });
$(".menu > ul > li").click(function() {
              if ($(window).width() <= 943) {
                  $(this).children("ul").fadeToggle(100);
              }
          });
          //If width is less or equal to 943px dropdowns are displayed on click (thanks Aman Jain from stackoverflow)

          $(".menu-mobile").click(function(e) {
              $(".menu > ul").toggleClass('show-on-mobile');
              e.preventDefault();
          });
//If menu a clicked stay active
          $(".menu > ul > li > a").click(function() {
 if($( this ).hasClass( "active" )) {
                  $(this).removeClass("active");
              }else {
                  $(".menu > ul > li > a").removeClass("active");
                  $(this).addClass("active");
              }
          });
      });
  }
}