2015-04-04 47 views
2

我試圖修改.offset(),以便它永遠不會返回undefined,即不可見/隱藏元素。如何在擴展jQuery方法時傳遞參數?

我遇到的問題是,我不知道如何正確地將this傳遞給原始方法。斷點調試表明,當它應該是所討論的元素時,我總是得到Window。下面是我的了:

(function($){ 
    var original = $.fn.offset; 

    $.fn.offset = function(elem, coordinates, pass) { 
    console.log('step 1'); // successful. 
    console.log(this);  // element confirmation. 
    var o = original(elem, coordinates, pass); // triggers an exception. 
    console.log('step 2'); // is never reached. 

    if (o === undefined) { 
     console.log('step 3a'); 
     return {}; 
    } 
    else { 
     console.log('step 3b'); 
     return o; 
    } 
    } 
}(jQuery)); 

[…] 

$('#element').offset(); // method call. 

而這裏的例外:

Error in event handler for (unknown): TypeError: undefined is not a function 
    at jQuery.fn.extend.offset (chrome-extension://…/js/jquery-1.11.0.js:10109:10) 
    at $.fn.offset (chrome-extension://…/js/jquery-modifications.js:35:11) 

我已經嘗試了不同的變化 - original(arguments)this.original()original(this, …) - 但沒有奏效。在this question之後,在另外三個參數旁邊使用了名爲elem的參數 - 但我不確定原因。是否因爲API提到attributeName,value和一個回調函數?如果是這樣,那麼我的嘗試應該工作,類似於.offset() API。看看如何jQuery定義這些功能並沒有幫助,因爲.fn.attr甚至不顯示像.fn.offset那樣。

回答

4

至於你說:

說我與遇到的問題是,我不知道如何正確地把它傳遞給原來的方法,要誠實。

爲了改變功能範圍(本)有兩個函數原型的方法,稱爲call()apply()

引用這兩種方法的文檔:

Function.prototype.call()

Function.prototype.apply()

所以,你的代碼應該看起來像這樣:

var original = $.fn.offset; 

$.fn.offset = function() { 
    var o = original.apply(this, arguments); 
    return typeof o === 'undefined' ? {} : o; 
}; 

return typeof o === 'undefined' ? {} : o; 

它只是一個更好的(IMO)較短的版本:

if (typeof o === 'undefined') { 
    return {}; 
} else { 
    return o; 
} 
+6

這是正確的,但你應該解釋爲什麼** **和** *如何* 有用。 – 2015-04-04 12:20:31

+0

「這只是一個更好的(IMO)更短的版本[」]「我知道,我只是分裂了控制檯日誌的界限。 – WoodrowShigeru 2015-04-15 16:37:13

相關問題