2017-04-20 37 views
1

我有一個特定的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對象,而不是對原始的引用?

+1

當你用jQuery 1.18+解決問題時,你爲什麼要堅持使用jQuery 1.12? – trincot

+0

沒有jQuery 1.18。 jQuery 3.2.1(最新版本)展示了問題中描述的相同問題。 –

+0

我無法用jQuery 3.2.1重現此操作:https://jsfiddle.net/bmdhq4f2/ – trincot

回答

0

雖然沒有人能知道這不具有完整的源代碼,有一個在功能的語句錯誤發生之前:

var selector = contentContainer.find("[TabId='EditProp']"); 
 
if (selector.length = 1 && selector.attr('PanelStatus') != '' && selector.attr('PanelStatus') != 'NewProp') 
 
{ 
 
    propEditObj.PropNameData = foo($(selector)); 
 
}

這是t上的selector.length屬性的賦值他jQuery對象(選擇器= 1,而不是選擇器== 1),這在jQuery 1.8.3中是可以接受的,但是在1.12.4+中導致了奇怪的破壞。

0

我不認爲返回一個克隆,它應該返回包含指針的對象。 你的第一個代碼應該與一個小的改變一起工作。 這裏是我如何寫它的例子。

function foo(selector) 
 
{ 
 
    var i = 0; // no needed, use .push() instead 
 
    var items = new Array(); 
 
    $(selector).each(function(){ // loop throw each object 
 
    $(this).find('.myClass').each(function() // now try to find myClass, $(this) will always contain only one object 
 
    { 
 
     items.push($(this).val()); 
 
    } 
 
    }); 
 
    return items; 
 
}

+0

感謝您的回答。我認爲這會起作用,但問題並不在於爲這一特定功能找到解決方案,因爲我可能必須在不同的地方應用該解決方案數百次(並且我不可避免地在嘗試將它們全部轉換時出錯)。我想知道這個一攬子解決方案是否可以接受。 但是如果我必須走艱難的道路,我會牢記這一點。 –

+0

我認爲它可以像你這樣做,但我會覆蓋jquary的查找功能和擴展。它應該是一個沒有任何風險的好解決方案。 –