2015-06-04 22 views
3

考慮下面的jQuery代碼:jQuery有沒有「發現或失敗響亮」方法?

$('.child').closest('.parent').find('.sibling').hide(); 

每走一步,如果沒有找到,jQuery將靜默失敗(例如,如果沒有.parent)。

有時候這很有道理,但通常意味着代碼不會執行任何操作,您必須排除原因。我想要做類似的選擇:

$('.child').closest!('.parent')... 

含義「如果您沒有找到該設備,則會大聲地失敗」。 (如果這隻能在開發時啓用,則爲獎勵)。

在jQuery中是否有類似的東西?

+1

我希望...我不*認爲* jQuery有類似的東西。我很想成爲錯誤的人 – tymeJV

+0

@DenysSéguret根本沒有時間去嘗試。另外,我通常會等待一段時間才能接受答案,以便其他人可以投票或提供替代方案。 –

回答

3

有沒有,但你可以使它很容易:

Object.keys($.fn).forEach(function(k){ 
    var f = $.fn[k]; 
    if (typeof f !=='function') return; 
    $.fn['_'+k] = function(){ 
    var o = f.apply(this, arguments); 
    if (o && 'length' in o && !o.length) throw "LOUD"; 
    return o; 
    } 
}) 

$("body")._find("unexisting"); // throws LOUD 

或者,你可以在調試模式下時,替換現有的功能:如jQuery的原型暴露

if (DEBUG_MODE) { 
    // let's be more cautious with an explicit list this time 
    ['find','closest]'].forEach(function(k){ 
     var f = $.fn[k]; 
     $.fn[k] = function(){ 
     var o = f.apply(this, arguments); 
     if (o && 'length' in o && !o.length) { 
      throw "LOUD"; // you shall make it a more interesting error 
     } 
     return o; 
     }; 
    }); 
} 

可能性是無窮的。

現在......事實上,jQuery並沒有在空集合上失敗,這通常是非常有用的。當然,你可以決定只爲debug/dev會話集成這些代碼。

+1

Bravo!這很好地工作,也顯示了一些我不知道的技巧。我發現Object.keys()[在MDN文檔中](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)。你介意解釋一下,如果(o &&!'長度'在o &&!o.length)'? –

+1

這將檢查是否存在'o'(返回的值),它具有一個名爲'length'的屬性([in in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in)),並且這個長度不是虛的。我可以簡單地使用'if(o && o.length> 0)',但'in'更清晰一些。 –

相關問題