【问题标题】:How can I loop variables with Jquery如何使用 Jquery 循环变量
【发布时间】:2020-03-24 11:53:30
【问题描述】:

我是 Javascript 和 Jquery 新手,遇到了一个小问题。

我正在尝试确保如果给定链接存在,将鼠标悬停在此链接上会弹出一个带有 fadeToggle() 的弹出窗口。

所以我写了这段代码:

  if ($('.link-1')) {
    $('.link-1').mouseover(function () {
      $('.popup-1').fadeToggle();
    })
      .mouseout(function () {
        $('.popup-1').fadeToggle();
      })
  }

但是,我不想重复十次,而是想写一个循环,如下所示:

  var number = 0;
  while (number < 10) {
    var popup = '.popup-' + number;
    var link = '.link-' + number;
    if ($(link)) {
      $(link).mouseover(function () {
        $(popup).fadeToggle();
      })
        .mouseout(function () {
          $(popup).fadeToggle();
        })
    }
    number++;
  }

但它不起作用。你能帮我吗?

提前谢谢你!

【问题讨论】:

  • 你到底想做什么十次?
  • 我正在尝试重复此操作 10 次(当用户将我的 div 悬停在 ".link-1" 类时,用 ".popup-1" 类显示我的 div,对于 ".link -2" 和 ".popup-2" 等...)
  • 这似乎可行,但行不通。这是否适用于最后一个元素,即当 number9 时?
  • 最终目标是制作工具提示吗?如果是这样,jquery 有一些烘焙,只需为每个锚标记添加一个标题属性,(即 Tool tip)并添加 $(document).tooltip( ) 在您的脚本中。如果您希望在将鼠标悬停在每个链接上时启动自定义弹出窗口,您最好使用链接上的数据属性并将它们绑定到各自的弹出窗口,然后在通用类名上启动事件(例如“.hasPopUp ”)。您是静态生成链接还是动态生成链接?
  • @JoshSchindele 不是。我想显示一个图像,位于相对于文章的 div .popup-"..." 中。链接是通过在 PHP 代码中增加变量 $number 动态生成的(我使用 wordpress)。我这样使用这个变量:link- and popup- 这样文章的链接和我的图片是匹配的。您有关于“数据属性”的这种使用的任何文档吗?

标签: javascript jquery loops variables


【解决方案1】:

欢迎来到网络社区 :-)

我的 jQuery 技能有点生疏,但我记得有一个 Attribute Contains Selector,你可以像这样将它与 .each() 结合使用:

$('[class*="link-"]').each(function (index, link) {
  $('[class="popup-"' + index + '"]').each(function (_, popup) {
    $(link)
      .mouseover(function () {
        $(popup).fadeToggle();
      })
      .mouseout(function () {
        $(popup).fadeToggle();
      })
  }
}

第二个索引并不有趣,这就是我将参数命名为“_”的原因。 让我知道它是否仍然有效

【讨论】:

  • 它不起作用:-(我已经用你的代码替换了我的代码,但它给了我一个错误:未捕获的错误:语法错误,无法识别的表达式:[class="popup-"0"] .除此之外,代码似乎照顾 .popup-0 但我的链接以 1 开头。
  • 啊,好吧。现在我看到了我的错误。对不起! $('[class="popup-' + index + '"]') 将使语法错误消失(注意popup- 之后删除的双引号)。如果将"popup-' + index 替换为popup-' + (index + 1)(包括圆括号),popup- 也应该以 1 开头。
【解决方案2】:

根据您的 cmets,我推荐这种方法。

为每个与您要触发的弹出窗口对应的链接添加一个数据属性。这看起来像这样:

<a href='#' class='link-1' data-popup='popup-1'> Link </a>

然后将悬停事件添加到所有链接,如果它具有数据类型,则执行操作:

//hover event on all links(assumes anchor tags)   
    $('a').mouseover(function () {
      if ($(this).attr('data-popup')) {
     let popup = '.' + $(this).attr('data-popup');
        $(`${popup}`).fadeToggle();
    }})
      .mouseout(function () {
        if ($(this).attr('data-popup')) {
        let popup = '.' + $(this).attr('data-popup');
        $(`${popup}`).fadeToggle();
      }})

如果适合您的用例,您也可以使用 .hover 而不是 .mouseover 和 .mouseout 将其设为单行函数

**此处添加重构过程:

//start with the original function

$('a').hover(function () {
  if ($(this).attr('data-popup')) {
  let popup = '.' + $(this).attr('data-popup');
    $(`${popup}`).fadeToggle();
}})

//consolidate the enter and exit events using .hover()

$('a').hover(function () {
  if ($(this).attr('data-popup')) {
  let popup = '.' + $(this).attr('data-popup');
    $(`${popup}`).fadeToggle();
}})

//remove the if statement, because the function firing without a pop up won't result in any effect

$('a').hover(function () {
  let popup = '.' + $(this).attr('data-popup');
    $(`${popup}`).fadeToggle();
})

//substitute the variable directly into the jquery tag

$('a').hover(function () {
    $(`'.${$(this).attr('data-popup')}`).fadeToggle();
})

// use an ES6 arrow function to make this a one line function

$('a').hover(() =>  $(`.${$(this).attr('data-popup')}`).fadeToggle())

//as is, this function won't work, because the arrow function binds the "this" keyword differently. 
//Event handlers have an optional parameter that is an event JSON object, so we pass that into the function.
//Because it is a parameter, and is used as a variable we can call event "e" for short
//target is a property of the JSON object 'event' that indicates what specific element is triggering the event
// You can console log "e" to see what other values are baked into the event 


$('a').hover((e) => $(`.${$(e.target).attr('data-popup')}`).fadeToggle())

//lastly, because we are using an anonymous arrow function with only one parameter, we can omit the parenthesis around the paremeter

$('a').hover(e => $(`.${$(e.target).attr('data-popup')}`).fadeToggle())


最终的结果是下面的一条线!

$('a').hover(e => $(`.${$(e.target).attr('data-popup')}`).fadeToggle())

可以在此处找到有关数据属性的其他信息:

https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes

【讨论】:

  • 嗨,看起来好多了,但还是不行。然而它似乎非常接近!日志返回给我:“未捕获的错误:语法错误,无法识别的表达式:“.popup-3””例如当 .link-3 被触发时。同样,使用 "(".link-1").attr('data-popup')" 给了我相应的弹出类 (.popup-1) 事实上,我不知道使用 data 属性和看起来很简单,更适合我想做的事情:-)
  • @innocent-musica 我已经修改了示例以构建类,然后使用模板文字注入它,这应该会为您解决!如果您不复制和粘贴并且不熟悉模板文字,请确保您在 jquery 选择器中使用反引号“`”
  • 最简单的最好的!单行就像一个魅力,尽管你给我的第一个解决方案不起作用!你能向我解释一下这条线是如何工作的吗? (不明白“e”和“e.target”的用法……谢谢!!
  • @innocent-musica 当然可以。解释太长,无法添加为评论,所以我将在上面添加重构作为编辑
【解决方案3】:

如果你的对象是从link-1到link-10的顺序,你可以试试这个方法

  1. 使用每个函数的具有类“link-[number]”的循环对象
  2. 使用索引+1保存号码
  3. 对悬停的对象执行操作

所以代码会是这样的:

$('[class*="link-"]').each(function (index) {
    var number = index + 1; //index start from 0, so it need to add + 1
    $(this)
        .mouseover(function () {
            $('[class="popup-' + number+ '"]').fadeToggle();
        })
        .mouseout(function () {
            $('[class="popup-' + number+ '"]').fadeToggle();
        })
});

但是如果您的对象不是从链接 1 到链接 10 的顺序,我建议在您的 HTML 代码中使用自定义数据属性。 示例:

<a class="link-1" data-number="1">test 1</a>
<div class="popup-1" style="display:none">
test 1 popup
</div>

然后将数字变量更改为以下代码:

var number = $(this).attr("data-number");

这样会更省钱。 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2013-12-03
    • 2019-05-04
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多