2012-05-18 220 views
2

我试图两次运行一个函数。一旦加载页面,然后再次点击。不知道我做错了什么。这里是我的代码:jQuery:调用函数两次

$('div').each(function truncate() { 
    $(this).addClass('closed').children().slice(0,2).show().find('.truncate').show(); 
}); 

$('.truncate').click(function() { 

    if ($(this).parent().hasClass('closed')) { 
     $(this).parent().removeClass('closed').addClass('open').children().show(); 
    } 

    else if ($(this).parent().hasClass('open')) { 
     $(this).parent().removeClass('open').addClass('closed'); 
     $('div').truncate(); 
     $(this).show(); 
    } 

}); 

的问题是在第13行,我叫truncate();功能的第二次。任何想法为什么它不工作?

编辑的jsfiddle这里:http://jsfiddle.net/g6PLu/

+0

请将您的html添加到jsFiddle中 – jacktheripper

+0

您在另一个中定义了函数。当你在第13行调用它时,它不能“看到”那个函数。在两个jquery块外定义这个函数,并从每个块中调用它。 –

回答

4

这是一个名为函数文本。

该名称仅在该函数的范围内可见。
因此,truncate不存在处理程序外部。

相反,建立一个正常功能,并把它传递给each()

function truncate() { ...} 

$('div').each(truncate); 
+0

另外他需要修复这里的调用>>'$('div')。truncate();'只是'truncate()' –

+0

嗯。试过(http://jsfiddle.net/g6PLu/1/),但它似乎并没有工作。也许我还有其他错误,但我希望能够通过再次点击'.truncate'来隐藏内容。 – colindunn

+0

@colindunnn:'truncate()'没有'this'。您需要编写'$(...)。(截断)' – SLaks

0

什么错误信息,你得到什么?

您应该创建函数,然后把它按规定

定义功能

function truncate(){ 
    $('div').each(function(){ 

    }); 
} 

然后调用函数

truncate(); 
+0

如果您从截断处理的点击处理程序中调用了此选项,则会截断所有部分,而不仅仅是点击部分 –

0

另一种方法是建立,然后触发,一自定义事件:

$('div').on('truncate', function() { 
    $(this).......; 
}).trigger('truncate'); 

然后,无论你在哪里需要相同的动作,再次触发事件。

要截断所有div:

$('div').trigger('truncate'); 

同样可以截断只是一个特定的div:

$('div#myDiv').trigger('truncate'); 

唯一的前提是,自定义事件处理程序已经连接,所以...

$('p').trigger('truncate'); 

不会做任何事情,因为截断处理程序尚未建立为p元素。

+0

这似乎更适合插件OP可以按照他们的意图调用'$('div')。truncate()'。 –

+0

这当然是胡安的另一种方法 - 更灵活(可应用于任意任意选择的元素),但更难编写(插件很难正确编写)。 –

0

我知道这里已经有一个可以接受的答案,但我认为最好的解决方案是插件http://jsfiddle.net/g6PLu/13/它似乎符合OP想要的东西(能够拨打$('div').truncate)的精神。并使代码更清洁

(function($) { 
    $.fn.truncate = function() { 
     this.addClass('closed').children(":not('.truncate')").hide().slice(0,2).show(); 
    }; 
    $.fn.untruncate = function() { 
     this.removeClass('closed').children().show(); 
    };     
})(jQuery); 

$('div').truncate(); 

$('.truncate').click(function() { 
    var $parent = $(this).parent(); 
    if ($parent.hasClass('closed')) { 
    $parent.untruncate(); 
    } else { 
    $parent.truncate(); 
    } 
});