我有一個特定的JavaScript函數,它將接受jQuery選擇器,普通對象或jQuery對象。無論哪種情況,函數的參數總是傳遞給jQuery。使用查找與克隆的jQuery對象?
function foo(selector)
{
var i = 0;
var items = new Array();
$(selector).find('.myClass').each(function()
{
items[i] = $(this).val();
i++;
}
return items;
}
功能將按預期在jQuery的1.8,但在jQuery的不工作1.12+(它永遠不會進入。每個)。這種風格的代碼存在於我正在使用的代碼庫中的許多地方(1880行匹配.find)。
根據jQuery網站,當jQuery對象傳遞給jQuery函數時,會返回該jQuery對象的克隆。我期望在功能上得到相同的對象,但在使用find時情況並非如此。 Find似乎期望原始jQuery對象或克隆對象的第0個元素,例如:$(「div」)。find(「。myclass」)和$($(「div」))[0] .find (「.myclass」)工作,但$($(「div」))。find(「。myclass」)不。
我想出的最簡單的解決方法是換行jQuery函數來處理這個問題,通過使其立即返回任何jQuery對象傳遞,而不是試圖jQuery的克隆:
(jQuery.fn.init = (function (init) {
return function (selector) {
if (selector instanceof jQuery) {
return selector;
}
return init.apply(this, arguments);
};
})(jQuery.fn.init)).prototype = jQuery.fn;
這很好,但是有什麼「陷阱」我應該擔心嗎?是否有強烈的理由,我應該想要一個克隆的jQuery對象,而不是對原始的引用?
當你用jQuery 1.18+解決問題時,你爲什麼要堅持使用jQuery 1.12? – trincot
沒有jQuery 1.18。 jQuery 3.2.1(最新版本)展示了問題中描述的相同問題。 –
我無法用jQuery 3.2.1重現此操作:https://jsfiddle.net/bmdhq4f2/ – trincot