【问题标题】:Jquery / Show/Hide / ToggleClass - Click behaviour on dynamically added elementsJquery / Show/Hide / ToggleClass - 动态添加元素的点击行为
【发布时间】:2013-06-12 09:34:18
【问题描述】:
<h2 class="yearGroupTitle"><a href="" title="">2013</a> <span class="instructions">Show more work from this year</span></h2>
<div class="yeargroup limited">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div

在上面的示例中,&lt;div class="yeargroup limited"&gt; 有多个实例,具有不同数量的子 div。如果&lt;div class="yeargroup limited"&gt; 有超过8 个子div,则动态添加&lt;span&gt; 并添加悬停和点击行为。

点击行为既可以切换类“受限”,也可以交换说明文本。 悬停行为既切换了类“.hover”,又添加了一个指针光标。

我得到了不稳定的结果。

  1. 悬停行为有效。
  2. 文本交换适用于某些 div
  3. 类“受限”的切换行为不适用于任何 div。

我想我快到了。提前为“不那么优雅”的代码道歉。非常感谢任何帮助。

jquery :-

$( "div.yeargroup" ).each(function(){

if ($(this).children().length > 8  ) {

var showMessage = 'Show more work from this year';
var hideMessage = 'Show less work from this year';
$( this ).prev('h2').append(' <span class="instructions">' + showMessage +'</span>');
var message = $( '.instructions' );

message.hover(
function() {
$( this ).addClass( 'hover' );
$( this ).css( 'cursor', 'pointer' );},
function() {
$( this ).removeClass( 'hover' );
});


message.on("click", function(event){
$(this).next('div').toggleClass("limited");    
var currMessage = ($(this).text() == hideMessage) ? showMessage : hideMessage;
$(this).text(currMessage);
});

};

});

【问题讨论】:

    标签: jquery toggle show-hide toggleclass


    【解决方案1】:

    这是因为你的选择器var message = $( '.instructions' );错了,你只需要选择当前迭代的yeargroup中的那些元素。

    所以试试

    var message = $(this).find( '.instructions' );
    

    【讨论】:

    • @naturelab 我的代码中有一个错误应该是$(this) 而我使用的是$this
    • 还是不行。那部分代码已经在工作了。它是 '$(this).next('div').toggleClass("limited"); ' 部分不起作用。
    • 在这种情况下,$(this).next 不存在,因为它是其父元素h2 中的最后一个元素。如果你想要下一个div.yeargroup,那么你需要说$(this).closest('h2').next('div.yeargroup')
    • 谢谢你 - 这是有道理的 - 现在它可以工作了。令人难以置信的是,有时一个所谓的“非常简单”的事情会引发如此多的问题!
    【解决方案2】:

    试试

    $(document).on("click",'.instructions', function(event,ele){
    $(this).next('div').toggleClass("limited");    
     var currMessage = (ele.text() == hideMessage) ? showMessage : hideMessage;
     ele.text(currMessage);
    });
    

    【讨论】:

    • 感谢@Baadshah 的快速回复。仅供参考 - 以上只是较大 jquery 文件的一小部分,它已经包含在 '$(document).ready(function() {'....'});' 中- 我实施了你的建议,它已经修复了文本交换(现在这一切都是一致的 - 即在所有 div 上)。但是,'$(this).next('div').toggleClass("limited")' 不起作用 - 我是否以某种方式定位错误?
    • 感谢@Baadshah 的快速回复。仍然无法正常工作,(实际上这也阻止了文本交换的工作)。我突然想到我正在使用( src="ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" )这会导致问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多