2012-11-12 59 views
0

基本上標題說明了這個問題,但情況是這樣的(很難用jsbin或其他任何東西複製,所以我會試着解決而不這樣做)。有沒有一種方法可以創建一個函數,可以是一個單擊事件或一個onload事件,具體取決於正文的類別?

我有一個被點擊的按鈕被調用的函數。點擊事件會告訴輸出將使用什麼字體。但是,在某些頁面上,我希望字體由body元素的類聲明,而不是單擊按鈕。

我遇到了兩個問題。

  1. 當我嘗試傳遞參數並接收參數時,該參數是一個事件,而不是我想傳遞的任何內容。
  2. 如果我將第一個參數作爲第一個參數傳遞給我的字體,並且我想將其作爲第二個參數的字體,那麼我的字體變量就會變成undefined,而且該函數不起作用。

任何幫助使功能靈活的這種方式將幫助我很多。

編輯:這是什麼,我已經得到了

function fontSelection(font) { 

var self = $(this), 
    inputOne = $('li:eq(0) input').val(), 
    inputTwo = $('li:eq(1) input').val(), 
    inputThree = $('li:eq(2) input').val(), 
    resultOne = $('div:eq(0)'), 
    resultTwo = $('div:eq(1)'), 
    resultThree = $('div:eq(2)'); 
    font = font || $('div.font').attr('title').toLowerCase(); 

resultOne.removeClass().addClass(inputOne + ' someclass ' + font); 
resultTwo.removeClass().addClass(inputTwo + ' someclass ' + font); 
resultThree.removeClass().addClass(inputThree + ' someclass ' + font); 

} 
+0

向我們展示你已經嘗試過的東西(你如何定義函數,如何將它作爲處理程序附加到...) –

+0

這看起來像是一件簡單的事情,但我不確定我確切地得到了這個問題(太多的話,沒有足夠的代碼)......無論如何,你可以很容易地測試JavaScript中的參數類型(jQuery經常使用這個技巧)。知道參數的大小也很容易。 –

+0

像Jan Dvorak說的那樣,粘貼你試過的任何東西,這樣我們就可以幫你解決問題。 – technophobia

回答

2

而不是直接將您的函數傳遞給事件註冊,您傳遞一個匿名函數,然後調用您的函數與所需的參數。

所以,與其這樣:

$("#myButton").click(callMyFunction); 

您可以使用此,它允許你指定你想要的確切參數:

$("#myButton").click(function(e) { 
    callMyFunction(myParam1, myParam2); 
}); 

如果你想保留的this值在功能,那麼你需要使用這樣的.call()明確地在你的函數中設置它:

$("#myButton").click(function(e) { 
    fontSelection.call(this, myParam1, myParam2); 
}); 

或者,只是把它作爲一個參數,並在你的函數,而不是this使用參數:

$("#myButton").click(function(e) { 
    fontSelection(this, myParam1, myParam2); 
}); 
+0

我試過了,但它不工作。在我的函數體中,我將字體設置爲tihs:font = font || $(ELEM).attr( '標題')。toLowerCase()。當使用該類的主體時,該函數仍然想要將其定義爲undefined – laserface

+0

@ user1798630的LowerCase - 您可能在'fontSelection'函數中丟失了'this'的值。請參閱我在答案末尾添加的部分,以使'this'在您的函數中正確設置或作爲參數傳入。 – jfriend00

+0

這工作...非常感謝你的幫助! – laserface

0

簡化版本試試這個關於大小:要使用的,如果有一個參數,設置字體的功能。如果參數未設置,則讀取字體的主體標籤。

0
$(function() { 
    if ($('body').hasClass('your class for onload change')) { 
     // change font 
    } else { 
     $('button').click(your_function); 
    } 
}); 

編輯:

如果你想在你的函數使用this,並希望它在第一種情況下引用身體,在第二種情況下引用另一種dom元素,可以使用callapply

$(function() { 
    if ($('body').hasClass('your class for onload change')) { 
     fontSelection.apply($('body').get(0), [font]); 
    } else { 
     $('button').click(function() { 
      fontSelection.apply(this, [font]); 
     }); 
    } 
}); 
+0

我在上面添加了我的功能。當我嘗試這個時,我得不到未定的...(這隻有在你看到我的功能時纔有意義) – laserface

+0

@ user1798630,編輯 –

相關問題