2010-01-29 3 views
4

Я охотился за ответ на этот вопрос, и хотя нашел связанные вопросы, я не мог найти точное соответствие для этого.jQuery load() метод утечка памяти?

У меня довольно большое приложение, которое должно загружать страницы в divs на другой странице с помощью метода jQuery.load(). Проблема заключается в том, что при повторной загрузке одной и той же страницы в один и тот же div я вижу, что память обозревателя существенно увеличивается (утечка памяти). Если я назову $ («*»). Unbind, я, конечно, не вижу утечки, но потом все было сброшено, так что это не исправление. В следующем примере кода воспроизводит эту проблему:

Test1.htm

<head> 
    <title></title> 
    <script type="text/javascript" language="javascript" src="Scripts/jquery-1.3.2.js"></script> 
     <script type="text/javascript" language="javascript"> 
     <!-- 
      var i = 0; 
     $(document).ready(function() { 
      $("#btn").click(
       function() { 
        i++; 
        $("#Test1").load("Test2.htm", null, function() { 
         //$(document).trigger("test"); 
        }) 
        $("#count").html(i); 
       }); 
     }); 
    //--> 
    </script> 
</head> 
<body> 
    <img id="btn" src="someimage.png" /> 
    <h3>We are loading Test2.htm into below div</h3> 
    <div> 
     Count loads =<span id="count">0</span> 
    </div> 
    <div id="Test1" style="border-style:solid">EMPTY</div> 
</body> 

Test2.htm = любой старый HTML страницы ..

При загрузке Test1.htm и нажмите кнопку mutliple раз, вы «Я заметила, что память браузера неуклонно растет. Я считаю, что проблема заключается в том, что загруженные элементы js и DOM никогда не устанавливаются для сбора мусора. В моей системе реального мира я попытался удалить (elem.remove() или .empty()) загруженные элементы, но это действительно не устраняет проблему. У меня также есть много js-файлов, загруженных с помощью «src», который я заменил на $ .getScript, похоже, это немного улучшилось. Все эти обходные решения были рассмотрены, и я хотел найти реальное решение этой проблемы. Есть идеи?

+0

У вас есть код JS в Test2.htm? Вы ссылаетесь на объекты, загруженные 'load()' в любую другую функцию? Если вы будете загружать данные с помощью простого '$ .ajax()' call is memory leak остается? – NilColor

ответ

4

Edit: обновление из-за дополнительной информации, предоставленной о Test2.htm (страница загружается)

Оригинальный ответ (для исторических целей): Я на самом деле не вижу каких-либо утечек в коде/разметке у вас есть при условии - возможно ли утечка в Test2.htm (который вы не указали для кода/разметки для)?

Новый ответ:

Я хотел бы предложить, что это, вероятно, из-за либо нескольких нагрузок JQuery или других сценариев у вас есть в Test2.htm.

Предполагая, что jQuery не протекает, просто создавая экземпляр, а затем сбрасывая jQuery и $, при загрузке несколько раз будет храниться как минимум 2 копии jQuery в памяти. При загрузке jQuery сохраняет резервную копию любых предыдущих версий $ и jQuery в _$ и _jQuery - так что вы будете иметь как минимум 2 копии jQuery, загружаемых при многократном использовании load().

выше предположение, скорее всего, не правильно, однако - есть все шансы, что Jquery имеет утечку, даже если вы «разгрузить», установив $, jQuery, _$ и _jQuery к null - это на самом деле не предназначены для загрузки несколько раз, как это (однако я уверен, что они позволяют это намеренно, поэтому вы можете использовать noConflict() для загрузки и использования двух разных версий jQuery, если это необходимо).

Вы можете добавить «селектор» в URL-адрес загрузки. Например:

$("#Test1").load("Test2.htm body", null, function() { 
    //callback does nothing 
}); 
//or 
$("#Test1").load("Test2.htm div#the_Div_I_Want", null, function() { 
    //callback does nothing 
}); 

Я предлагаю делать это, если вы не заинтересованы в каких-либо сценариев в результате Ajax, или в качестве альтернативы, если вы сделать хотите сценарии, вы должны выбрать селектор, чтобы отключить только определенные элементы/скрипты, например

/* load with selector "all elements except scripts whose 
    src attribute ends in 'jquery.js'" */ 
$("#Test1").load("Test2.htm :not(script[src$='jquery.js'])", null, function() { 
    //callback does nothing 
}); 

Следует также отметить, что если оставить в «данные» аргумент (у вас есть, как null), и обеспечивают функцию в качестве второго аргумента, JQuery будет правильно определить, что второй аргумент обратного вызова, так

$("#Test1").load("Test2.htm :not(script[src$='jquery.js'])", function() { 
    //callback does nothing 
}); 

является acceptible

+0

Я просто попробовал следующий код в Test2.htm:

TEST NOTHING
Это все еще вызывает утечку в IE8, но не в Firefox (или его слишком мало, чтобы заметить). Однако более сложный Test2.htm все еще вызывает утечки в Firefox. Просто дублируйте Test1.htm и удалите блок сценария и изображение, и проблема возникнет. Тем не менее, у меня есть ссылка на jquery lib на этой подстранице, если я удалю это, тогда утечка не будет рядом с чем-то примечательным. Кажется, что jquery lib кэшируется при загрузке Test2.htm, а затем никогда не очищается. –

+0

Отредактированный ответ на основе предоставленной вами информации - надеюсь, что это поможет – Graza

1

Хм, возможно, это как раз то, что на самом деле основной, но если я установить $ .ajaxSetup ({кэш ложь}); перед вызовами загрузки я, похоже, не получаю проблемы. Теперь, конечно, мой «настоящий» код имеет этот вызов, так почему я вижу проблему? Я полагаю, что расширение пользовательского интерфейса Tabs приводит к включению кэширования (я на самом деле не верю этому, но вызываю вызов ложного кеша, прежде чем каждый из них, похоже, исправит его !!)

+0

отправить отчет об ошибке, если вы подтвердили это. Они будут вам благодарны за это. –

0

Хорошо, поэтому я, наконец, нашел проблему и это не утечка вообще (что я подозревал), это просто результат присоединения нескольких очень сложных обработчиков к одному и тому же триггеру/событию. Я поднял этот вопрос, относящийся к тому, что:

JQuery event model and preventing duplicate handlers

Смежные вопросы