【问题标题】:Change jQuery code to JavaScript将 jQuery 代码更改为 JavaScript
【发布时间】:2017-12-11 10:01:02
【问题描述】:

我有jquery 函数来控制具有动态屏幕大小的页面菜单元素。但是这段代码需要jquery lib's。但这会影响我的加载性能。 我不能为jquery 使用async 加载属性,因为这个函数需要这个库。但是,如果我可以更改为纯JavaScript,那么加载性能将会很高。 (渐进式 Web 应用程序) 但是当我真的为这种转换而苦苦挣扎时。有谁知道如何转换成纯JavaScript

function calcWidth() {
  var navwidth = 0;
  var morewidth = $('#main .more').outerWidth(true);
  $('#main > li:not(.more)').each(function() {
      navwidth += $(this).outerWidth( true );
  });
  var availablespace = $('nav').outerWidth(true) - morewidth;

  if (navwidth > availablespace) {
    var lastItem = $('#main > li:not(.more)').last();
    lastItem.attr('data-width', lastItem.outerWidth(true));
    lastItem.prependTo($('#main .more ul'));
    calcWidth();
  } else {
    var firstMoreElement = $('#main li.more li').first();
    if (navwidth + firstMoreElement.data('width') < availablespace) {
      firstMoreElement.insertBefore($('#main .more'));
    }
  }

  if ($('.more li').length > 0) {
    $('.more').css('display','inline-block');
  } else {
    $('.more').css('display','none');
  }
}
$(window).on('resize load',function(){
  calcWidth();
});

【问题讨论】:

  • 把它分成小块。做研究。请记住,我们不是来为您翻译代码的。
  • 任何选择器,而不仅仅是 id 选择器,您可以开始查看 querySelectorAll,然后在标准循环中循环匹配,而不是 jQuery each 之类的东西 prependTo 我会直接做谷歌, jQuery PrependTo in pure Javascript 或查看免费提供的实际 jquery 源代码。
  • 请记住,jQuery 使您的代码“跨浏览器兼容”。当您编写纯 JS 代码时,您可能会遇到旧的 Web 浏览器兼容性问题。

标签: javascript jquery html progressive-web-apps


【解决方案1】:

试试这个:

function calcWidth() {
  var navwidth = 0;
  var morewidth = document.querySelectorAll('#main .more')[0].width;
  document.querySelectorAll('#main > li:not(.more)').forEach(function(item,index) {
      navwidth += item.width;
  });
  var availablespace = document.querySelectorAll('nav')[0].width - morewidth;

  if (navwidth > availablespace) {
    var arr = document.querySelectorAll('#main > li:not(.more)');
    var lastItem = arr[arr.length-1];
    lastItem.setAttribute('data-width', lastItem.width);
    document.querySelectorAll('#main .more ul')[0].appendChild(lastItem);
    lastItem.parentNode.removeChild(lastItem);
    calcWidth();
  } else {
    var firstMoreElement = document.querySelectorAll('#main li.more li')[0];
    if (navwidth + firstMoreElement.width < availablespace) {
              firstMoreElement.parentnode.insertBefore(firstMoreElement,document.querySelectorAll('#main .more')[0]);
      firstMoreElement.parentNode.removeChild(firstMoreElement);
    }
  }

 if (document.querySelectorAll('.more li').length > 0) {
      document.querySelectorAll('.more').forEach(function(item,index){item.style.display='inline-block';});
} else {document.querySelectorAll('.more').forEach(function(item,index){item.style.display='none';});
}
}

window.onload=calcWidth;
window.onresize=calcWidth;

如果有效,请回答:)

【讨论】:

  • 看起来不错,但是当您更改屏幕尺寸(宽度)时,菜单元素仍然可用(应该隐藏)
  • 我已经改过了。请再试一次
  • 还是一样,没有堆叠到下拉菜单中
  • 我又改了一次。你会试试吗?
  • 没有。不堆叠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多