2012-12-20 34 views
4

我正在使用AnythingSlider jQuery插件,它動態讀取URL中的哈希值並通過jQuery選擇頁面上的項目。問題是最終用戶可以打破插件,如果他們得到http://mydomain.com/#!demos/slider如何測試選擇器是否在jQuery中有效

有沒有一種方法來測試選擇器是否有效,而不是讓jQuery崩潰(內置函數或正則表達式)?請參閱試圖做$此的jsfiddle例子,它崩潰( '#演示/滑塊!'):http://jsfiddle.net/PvY2b/

$('#!demos/slider') <= Uncaught Error: Syntax error, unrecognized expression: #!demo/slider 
+0

難道你不能親自捕捉錯誤並向用戶顯示相應的錯誤信息嗎? –

+0

我做了一次嘗試/趕上,但似乎像一個懶惰的黑客。 jQuery中有沒有內置的函數,或者在讓它崩潰之前進行測試?也許RegEx? – TruMan1

+2

我第一次看到一個被稱爲「懶惰黑客」的try/catch –

回答

5

ID和名稱標記必須以字母開頭([A-ZA-Z])可能是 後跟任意數量的字母,數字([0-9]),連字符(「 - 」),下劃線(「_」),冒號(「:」)和句點(「。」)。

來源:Basic HTML data types

因此這樣的事情可能工作:

if (/^[A-Za-z][A-Za-z0-9\-_:\.]*$/.test(selector)) { 
    // $('#' + selector)... 
} 

或者乾脆逃跑吧:

selector = selector.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1'); 
1

它可能會更容易來包裝這一塊投入試穿-catch,如下:

try { 
    $('#!demo/pages') 
} catch(e) { 
    alert('Your selector is invalid'); 
} 

這不是一個懶惰的黑客:當處理一些你無法直接控制的外部組件時,這是一種常見的方法。

0

正如在前面的回答中發現:How do I extend jQuery's selector engine to warn me when a selector is not found?

你必須擴展到jQuery的初始化:

var oldInit = $.fn.init; // cache it 

$.fn.init = function(selector, context, rootjQuery) { 

    var result = new oldInit(selector, context, rootjQuery); 

    if (result.length === 0) 
     console.info("jQuery call has no elements!", arguments); 
    return result; 
}; 

它仍然會拋出錯誤syntaxed選擇錯誤,但可以說你有一個正確的一個$('#test') ,如果#test不存在,它至少會警告你。很好的發展,以幫助錯別字等

我已經做了.on()和其他事情,這是非常強大的。

相關問題