2014-05-02 19 views
0

我有一段代碼,導致某種內存泄漏。經過數小時的測試後,我設法將其追蹤到elem2.is(":visible");減慢javaScript。錯誤。 jQuery.is(「:visible」)

我如何跟蹤它 - >我的代碼在延遲1秒後自行循環。我將這個延遲設置爲0,並保存了10次迭代所需的平均時間。我結束了一個整數列表,如下所示。

這裏是我的「速度測試」沒有任何memoryLeaks等:

"4128 , 3964 , 4054 , 3994 , 3946 , 4011 , 4117 , 4044 , 4036 , 3945 , 4031 , 3859 , 4015 , 4019" 

我只包括第一位的查看結果。但你可以看到平均需要4000毫秒才能完成十次循環。當我包括elem2.is(":visible");

5128 , 4967 , 4975 , 5085 , 5127 , 5261 , 5550 , 5804 , 6160 , 6395 , 6617 , 7056 , 7658 , 8191 , 8492 , 9038 , 9364 , 10242 , 10893 

正如你可以看到做循環增加「X」量成倍所花費的時間

下一頁這裏的值。

下面是代碼:

function foo() { 
    var elem1 = $("#A"), 
     elem2 = $("#B"); 

    if(elem1.length && elem2.length && elem2.is(":visible")) { 
     // Do stuff 
    } 
} 

有誰知道任何知道這個功能的問題?無論如何,以避免它放慢我的功能? (我最想知道爲什麼它也這樣做)。

感謝

+0

注意:我設法消除了這個錯誤。使用'elem2.css(「隱藏」)!==「無」來檢查。仍然非常好奇爲什麼會出現這個錯誤。 – User2

+0

注意:我應該提到這個錯誤只會發生,如果你喜歡'for(var i = 0; i <1000; i ++){foo();}'。 – User2

+0

注意:最後我使用了'elem [0] .offsetHeight && elem [0] .offsetWidth'。如果其中任一個是'0',則elem被隱藏。做完這個改變後,無論我跑了多久,我的'SpeedTest'都能得到穩定/一致的結果。 – User2

回答

1

此頁面上的第一個答案概括起來很好 Performance of jquery visible

要快速彙總。當使用jquery:visible屬性時,你實際上正在檢查多個屬性。關於你的速度檢查,這可能會增加檢查。我確定這些速度會因瀏覽器而異。

+0

謝謝。現在閱讀。 – User2

0

我不認爲這是內存泄漏。 JavaScript不是多線程的,每次只能執行一項功能,問題在於elem2.is("visible")的過程在您的下一個超時/設置間隔被觸發之前花費的時間超過了0秒,因此它被排隊,因此對您的時間造成累積影響。

+0

我只在foo()後調用timeout/setinterval;叫做。由於javaScript不是多線程的(不包括工作者),因此在elem2.is(「visible」)之前調用下一個循環是不可能的。叫做。 – User2

+0

恐怕你會得到-1。 – User2