2013-08-01 98 views
1

在我正在處理的應用程序中,我使用原型的$$函數來獲取頁面上的所有A HREF元素並通過javascript更改它們的鏈接。只要網頁上存在合理數量的鏈接,此功能就可以正常工作。

在一些罕見的使用情況下,$$函數返回5K +命中(aweful :))有什麼辦法來優化它的行爲,或者爲了更高性能而完全擺脫它?

編輯 —從註釋

重要的細節

具體的代碼是:

$$('a:not([href="#"])').each(function(item){}); 

我使用prototypejs 1.7.1

+0

那麼,如果真的有在5000''標籤該頁面,要做什麼? – Pointy

+0

另外,如果您使用的是庫的最新版本,則使用非常高效的選擇器引擎來完成這項工作。你真的注意到一些速度緩慢嗎?你的選擇器是什麼樣的? – Pointy

+0

它是$$('a:not([href =「#」])')。each(function(item){}); ...我正在使用prototypejs 1.7.1 ... – clops

回答

2

如果你的選擇是有點慢,這可能:not()就是這樣做的。您可以過濾掉那些具有明確的代碼,從所有<a>元素的列表開始:

var anchors = $$('a').reject(function(a) { return a.href === '#'; }); 

(我的原型是相當生疏:)這對於使用灒任何現代化的圖書館也是如此。像:not那樣的僞選擇器運算符效率不高;當情況不涉及大規模因素時,它們作爲速記是有用的,但在像您這樣的情況下不是一個好主意。查找文檔中的所有<a>元素是確實是快,然後遍歷該列表的速度也應該相當快。

+0

當然,當然,':not'被使用的事實是忍者在問題評論 – Esailija

+1

@Esailija是,嘆息無聲地評論。我想我預計這個問題本身會被更新;也許我現在會這樣做。 – Pointy

2

你可以用完全不同的方式去解決這個問題。

就拿你有5000條記錄

<table id="recordtable"> 
<tr> 
    <td>Record 1</td> 
    <td><a href="#link1">click here</a></td> 
</tr> 
......//snip 
<tr> 
    <td>Record 100</td> 
    <td><a href="#link100">click here</a></td> 
</tr> 
.......//snip 
</table> 

現在的表把一個觀察者放在桌上觀看的點擊的鏈接

$('recordtable').on('click','a:not([href="#"])',function(e){ 
    //FYI 'this' points to the table element 
    //e is the event object passed in-------------------^^^ 
    //use e.findElement() to get the element that the click originated on 
    var el = e.findElement(); 
    if(el.readAttribute('href') != "something") 
    { 
     window.location.href = 'some other link'; 
    } 
    //most importantly stop the event so that the link doesn't fire 
    e.stop(); 
}); 
+1

請注意,他的代碼涉及Prototype,而不是jQuery,但是您是對的。 – Pointy

+2

This is prototypes http://api.prototypejs.org/dom/Element/prototype/on/ –

+0

哇,我忘記了更多的原型比我想象的我!抱歉。 – Pointy