JavaScript-添加ID和类

时间:2018-11-15 22:44:52

标签: javascript jquery html css

我有一些用作移动导航的弹出式移动浏览器的JS代码(链接弹出,可以单击以放置地方等)

但是,使用外部按钮(带有更多JS代码)在英语和中文之间翻译页面不会翻译移动导航文本。我相信这是因为此JS代码没有将唯一的ID和'tr'类从主HTML文件导入到移动导航。

要完成此导入,我该怎么办?

在此处查看移动导航JS代码:

/**
 * Generate an indented list of links from a nav. Meant for use with panel().
 * @return {jQuery} jQuery object.
 */
$.fn.navList = function() {

  var $this = $(this);
  $a = $this.find('a'),
    b = [];

  $a.each(function() {

    var $this = $(this),
      indent = Math.max(0, $this.parents('li').length - 1),
      href = $this.attr('href'),
      target = $this.attr('target');


    b.push(
      '<a ' +
      'class="link depth tr-' + indent + '"' +
      ((typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') +
      ((typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') +
      '>' +
      '<span class="indent tr-' + indent + '"></span>' +
      $this.text() +
      '</a>'
    );

  });

  return b.join('');

};

/**
 * Panel-ify an element.
 * @param {object} userConfig User config.
 * @return {jQuery} jQuery object.
 */
$.fn.panel = function(userConfig) {

  // No elements?
  if (this.length == 0)
    return $this;

  // Multiple elements?
  if (this.length > 1) {

    for (var i = 0; i < this.length; i++)
      $(this[i]).panel(userConfig);

    return $this;

  }

  // Vars.
  var $this = $(this),
    $body = $('body'),
    $window = $(window),
    id = $this.attr('id'),
    config;

  // Config.
  config = $.extend({

    // Delay.
    delay: 0,

    // Hide panel on link click.
    hideOnClick: false,

    // Hide panel on escape keypress.
    hideOnEscape: false,

    // Hide panel on swipe.
    hideOnSwipe: false,

    // Reset scroll position on hide.
    resetScroll: false,

    // Reset forms on hide.
    resetForms: false,

    // Side of viewport the panel will appear.
    side: null,

    // Target element for "class".
    target: $this,

    // Class to toggle.
    visibleClass: 'visible'

  }, userConfig);

  // Expand "target" if it's not a jQuery object already.
  if (typeof config.target != 'jQuery')
    config.target = $(config.target);

  // Panel.

  // Methods.
  $this._hide = function(event) {

    // Already hidden? Bail.
    if (!config.target.hasClass(config.visibleClass))
      return;

    // If an event was provided, cancel it.
    if (event) {

      event.preventDefault();
      event.stopPropagation();

    }

    // Hide.
    config.target.removeClass(config.visibleClass);

    // Post-hide stuff.
    window.setTimeout(function() {

      // Reset scroll position.
      if (config.resetScroll)
        $this.scrollTop(0);

      // Reset forms.
      if (config.resetForms)
        $this.find('form').each(function() {
          this.reset();
        });

    }, config.delay);

  };



  // Vendor fixes.
  $this
    .css('-ms-overflow-style', '-ms-autohiding-scrollbar')
    .css('-webkit-overflow-scrolling', 'touch');

  // Hide on click.
  if (config.hideOnClick) {

    $this.find('a')
      .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');

    $this
      .on('click', 'a', function(event) {

        var $a = $(this),
          href = $a.attr('href'),
          target = $a.attr('target');


        if (!href || href == '#' || href == '' || href == '#' + id)
          return;

        // Cancel original event.
        event.preventDefault();
        event.stopPropagation();

        // Hide panel.
        $this._hide();

        // Redirect to href.
        window.setTimeout(function() {

          if (target == '_blank')
            window.open(href);
          else
            window.location.href = href;

        }, config.delay + 10);

      });

  }

  // Event: Touch stuff.
  $this.on('touchstart', function(event) {

    $this.touchPosX = event.originalEvent.touches[0].pageX;
    $this.touchPosY = event.originalEvent.touches[0].pageY;

  })

  $this.on('touchmove', function(event) {

    if ($this.touchPosX === null ||
      $this.touchPosY === null)
      return;

    var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX,
      diffY = $this.touchPosY - event.originalEvent.touches[0].pageY,
      th = $this.outerHeight(),
      ts = ($this.get(0).scrollHeight - $this.scrollTop());

    // Hide on swipe?
    if (config.hideOnSwipe) {

      var result = false,
        boundary = 20,
        delta = 50;

      switch (config.side) {

        case 'left':
          result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta);
          break;

        case 'right':
          result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta));
          break;

        case 'top':
          result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta);
          break;

        case 'bottom':
          result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta));
          break;

        default:
          break;

      }

      if (result) {

        $this.touchPosX = null;
        $this.touchPosY = null;
        $this._hide();

        return false;

      }

    }

    // Prevent vertical scrolling past the top or bottom.
    if (($this.scrollTop() < 0 && diffY < 0) ||
      (ts > (th - 2) && ts < (th + 2) && diffY > 0)) {

      event.preventDefault();
      event.stopPropagation();

    }

  });

  // Event: Prevent certain events inside the panel from bubbling.
  $this.on('click touchend touchstart touchmove', function(event) {
    event.stopPropagation();
  });

  // Event: Hide panel if a child anchor tag pointing to its ID is clicked.
  $this.on('click', 'a[href="#' + id + '"]', function(event) {

    event.preventDefault();
    event.stopPropagation();

    config.target.removeClass(config.visibleClass);

  });

  // Body.

  // Event: Hide panel on body click/tap.
  $body.on('click touchend', function(event) {
    $this._hide(event);
  });

  // Event: Toggle.
  $body.on('click', 'a[href="#' + id + '"]', function(event) {

    event.preventDefault();
    event.stopPropagation();

    config.target.toggleClass(config.visibleClass);

  });

  // Window.

  // Event: Hide on ESC.
  if (config.hideOnEscape)
    $window.on('keydown', function(event) {

      if (event.keyCode == 27)
        $this._hide(event);

    });

  return $this;

};

这是带有'tr'类和唯一ID的HTML代码:

<!-- Header -->
<header id="header" class="trans">
  <h1>
    <a href="index.html"> <img src="images/Artboard%201.png" alt="logo" class="logo"> </a>
  </h1>
  <button id="en" class="zonetime2 lang"> English </button>
  <button id="ch" class="zonetime lang"> 中文 </button>
  <nav id="nav">
    <ul class="tr">
      <li><a href="index.html" key="home" class="link depth-0 tr">Home</a></li>
      <li><a href="AboutUs.html" key="about" class="tr">About Us</a></li>
      <li>
        <a href="#" class="submenu fa-angle-down tr" key="serv">Services</a>
        <ul>
          <li><a href="SEM.html" key="sem" class="tr">Search Engine Marketing</a></li>
          <li><a href="WebDev.html" key="webdev" class="tr">Website Development </a></li>
          <li><a href="AppDev.html" key="app" class="tr">App Development</a></li>
          <li><a href="Automation.html" key="tbd" class="tr">Technical Business Development</a></li>
        </ul>
      </li>
      <li><a href="ourteam.html" key="ourteam" class="tr">Our Team</a></li>
      <li><a href="#contact" class="button tr" key="contactus">Contact Us</a></li>
    </ul>



  </nav>

</header>

以下是翻译后的JS代码供参考:

// onclick behavior
$('.lang').click('touchstart', function() {
  var lang = $(this).attr('id'); // obtain language id

  // translate all translatable elements
  $('.tr').each(function(i) {
    $(this).text(aLangKeys[lang][$(this).attr('key')]);
  });

});

// preparing language file
var aLangKeys = new Array();
aLangKeys['en'] = new Array();
aLangKeys['ch'] = new Array();

aLangKeys['en']['home'] = 'Home';
aLangKeys['en']['about'] = 'About Us';
aLangKeys['en']['serv'] = 'Services';
aLangKeys['en']['sem'] = 'Search Engine Marketing';
aLangKeys['en']['webdev'] = 'Website Development';
aLangKeys['en']['app'] = 'Mobile App Development';
aLangKeys['en']['tbd'] = 'Technical Business Development';
aLangKeys['en']['ourteam'] = 'Our Team';
aLangKeys['en']['contactus'] = 'Contact Us';
aLangKeys['en']['submit'] = 'Send Message';
aLangKeys['en']['reset'] = 'Reset';


aLangKeys['ch']['home'] = '首页';
aLangKeys['ch']['about'] = '关于我们';
aLangKeys['ch']['serv'] = '服务';
aLangKeys['ch']['sem'] = '谷歌与雅虎推广';
aLangKeys['ch']['webdev'] = '品牌网站建设';
aLangKeys['ch']['app'] = 'APP 开发';
aLangKeys['ch']['tbd'] = '加拿大工商业与市场拓展';
aLangKeys['ch']['ourteam'] = '我们的团队';
aLangKeys['ch']['contactus'] = '联络我们';
aLangKeys['ch']['submit'] = '发留言';
aLangKeys['ch']['reset'] = '重新';

谢谢!

1 个答案:

答案 0 :(得分:0)

您的翻译似乎正在使用key属性,因此请确保在克隆导航结构时将这些考虑在内。

/**
 * Generate an indented list of links from a nav. Meant for use with panel().
 * @return {jQuery} jQuery object.
 */
$.fn.navList = function() {

  var $this = $(this);
  $a = $this.find('a'),
    b = [];

  $a.each(function() {

    var $this = $(this),
      indent = Math.max(0, $this.parents('li').length - 1),
      href = $this.attr('href'),
      target = $this.attr('target'),
      key = $this.attr('key');


    b.push(
      '<a ' +
      'class="link depth tr-' + indent + '"' +
      ((typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') +
      ((typeof key !== 'undefined' && key != '') ? ' key="' + key + '"' : '') +
      ((typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') +
      '>' +
      '<span class="indent tr-' + indent + '"></span>' +
      $this.text() +
      '</a>'
    );

  });

  return b.join('');

};

/**
 * Panel-ify an element.
 * @param {object} userConfig User config.
 * @return {jQuery} jQuery object.
 */
$.fn.panel = function(userConfig) {

  // No elements?
  if (this.length == 0)
    return $this;

  // Multiple elements?
  if (this.length > 1) {

    for (var i = 0; i < this.length; i++)
      $(this[i]).panel(userConfig);

    return $this;

  }

  // Vars.
  var $this = $(this),
    $body = $('body'),
    $window = $(window),
    id = $this.attr('id'),
    config;

  // Config.
  config = $.extend({

    // Delay.
    delay: 0,

    // Hide panel on link click.
    hideOnClick: false,

    // Hide panel on escape keypress.
    hideOnEscape: false,

    // Hide panel on swipe.
    hideOnSwipe: false,

    // Reset scroll position on hide.
    resetScroll: false,

    // Reset forms on hide.
    resetForms: false,

    // Side of viewport the panel will appear.
    side: null,

    // Target element for "class".
    target: $this,

    // Class to toggle.
    visibleClass: 'visible'

  }, userConfig);

  // Expand "target" if it's not a jQuery object already.
  if (typeof config.target != 'jQuery')
    config.target = $(config.target);

  // Panel.

  // Methods.
  $this._hide = function(event) {

    // Already hidden? Bail.
    if (!config.target.hasClass(config.visibleClass))
      return;

    // If an event was provided, cancel it.
    if (event) {

      event.preventDefault();
      event.stopPropagation();

    }

    // Hide.
    config.target.removeClass(config.visibleClass);

    // Post-hide stuff.
    window.setTimeout(function() {

      // Reset scroll position.
      if (config.resetScroll)
        $this.scrollTop(0);

      // Reset forms.
      if (config.resetForms)
        $this.find('form').each(function() {
          this.reset();
        });

    }, config.delay);

  };



  // Vendor fixes.
  $this
    .css('-ms-overflow-style', '-ms-autohiding-scrollbar')
    .css('-webkit-overflow-scrolling', 'touch');

  // Hide on click.
  if (config.hideOnClick) {

    $this.find('a')
      .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');

    $this
      .on('click', 'a', function(event) {

        var $a = $(this),
          href = $a.attr('href'),
          target = $a.attr('target');


        if (!href || href == '#' || href == '' || href == '#' + id)
          return;

        // Cancel original event.
        event.preventDefault();
        event.stopPropagation();

        // Hide panel.
        $this._hide();

        // Redirect to href.
        window.setTimeout(function() {

          if (target == '_blank')
            window.open(href);
          else
            window.location.href = href;

        }, config.delay + 10);

      });

  }

  // Event: Touch stuff.
  $this.on('touchstart', function(event) {

    $this.touchPosX = event.originalEvent.touches[0].pageX;
    $this.touchPosY = event.originalEvent.touches[0].pageY;

  })

  $this.on('touchmove', function(event) {

    if ($this.touchPosX === null ||
      $this.touchPosY === null)
      return;

    var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX,
      diffY = $this.touchPosY - event.originalEvent.touches[0].pageY,
      th = $this.outerHeight(),
      ts = ($this.get(0).scrollHeight - $this.scrollTop());

    // Hide on swipe?
    if (config.hideOnSwipe) {

      var result = false,
        boundary = 20,
        delta = 50;

      switch (config.side) {

        case 'left':
          result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta);
          break;

        case 'right':
          result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta));
          break;

        case 'top':
          result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta);
          break;

        case 'bottom':
          result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta));
          break;

        default:
          break;

      }

      if (result) {

        $this.touchPosX = null;
        $this.touchPosY = null;
        $this._hide();

        return false;

      }

    }

    // Prevent vertical scrolling past the top or bottom.
    if (($this.scrollTop() < 0 && diffY < 0) ||
      (ts > (th - 2) && ts < (th + 2) && diffY > 0)) {

      event.preventDefault();
      event.stopPropagation();

    }

  });

  // Event: Prevent certain events inside the panel from bubbling.
  $this.on('click touchend touchstart touchmove', function(event) {
    event.stopPropagation();
  });

  // Event: Hide panel if a child anchor tag pointing to its ID is clicked.
  $this.on('click', 'a[href="#' + id + '"]', function(event) {

    event.preventDefault();
    event.stopPropagation();

    config.target.removeClass(config.visibleClass);

  });

  // Body.

  // Event: Hide panel on body click/tap.
  $body.on('click touchend', function(event) {
    $this._hide(event);
  });

  // Event: Toggle.
  $body.on('click', 'a[href="#' + id + '"]', function(event) {

    event.preventDefault();
    event.stopPropagation();

    config.target.toggleClass(config.visibleClass);

  });

  // Window.

  // Event: Hide on ESC.
  if (config.hideOnEscape)
    $window.on('keydown', function(event) {

      if (event.keyCode == 27)
        $this._hide(event);

    });

  return $this;

};

相关问题