UPDATE 當前的解決方案就住在這主旨的情況下,你需要這種類型的功能 https://gist.github.com/jdaly13/5581538#file-gistfile1-js壓倒一切的jQuery .END()方法來接受參數
我想一個小實驗,我」米試圖重寫jQuery的核心方法到底用我自己的方法,它本質上只是將功能添加到它
例如,如果你正在使用jQuery你可以做這樣的事情
$('h1.clickme').click(function() {
$(this).next('div').css("width", "+=200").parent().next().hide().end().end()
//this should traverse you back to the div after the h1 clicked
})
我希望通過添加添加一些參數 例如
.end(1)
會做同樣的
.end().end()
這裏的能力覆蓋了jQuery最終方法是我到目前爲止
(function(){
// Define overriding method.
jQuery.fn.end = function(no_of_times){
var prevObject = "prevObject";
if (!(arguments.length) || (typeof no_of_times !== "number")) {
return this.prevObject || this.constructor(null);
} else {
if (no_of_times == 1) {
return this.prevObject.prevObject || this.constructor(null)
} else if (no_of_times == 2) {
return this.prevObject.prevObject.prevObject || this.constructor(null)
} else if (no_of_times == 3) {
return this.prevObject.prevObject.prevObject.prevObject || this.constructor(null)
} else {
//too many times can't type anymore
return this.prevObject || this.constructor(null);
}
}
}
})()
所以我可以這樣打電話
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
但是,顯然我不認爲這是有效的寫出所有這些if語句 有沒有更簡單的方法來做到這一點?我敢肯定的表現是差不多的,但
我想基於參數「prevObject」字符串追加prevObject可變的,我這樣做更多的可讀性起見順利通過這樣的
if (!(arguments.length) || (typeof no_of_times !== "number")) {
return this.prevObject || this.constructor(null);
} else {
for (i=0; i <= no_of_times; i++) {
pObj += "prevObject."
}
var prevObject = pObj.slice(0, prevObject.length -1)
console.log(prevObject);
return this.prevObject
}
}
但代碼段以上沒有工作 任何幫助表示讚賞一如既往
小心......我很確定'.prevObject'不是一個記錄的功能。你爲什麼不用一個不同的名字緩存原始的'.end()'並且調用它?或者更好的是,爲您的自定義方法使用不同的名稱。 – 2013-05-14 21:50:05
同意 - 如果一個插件和一個新方法可以做,就沒有理由重寫'.end()'。 – Blazemonger
是的,你可能是正確的 - 我只是想我添加功能,並沒有真正覆蓋它,所以它仍然會以同樣的方式工作,無論你是否添加參數 –