2012-05-18 138 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(); 
    } 
});