Kružne reference na DOM objekte na HTML stranici izazivaju osipanje memorije

Izjava o odricanju odgovornosti za sadržaj o otpisanom proizvodu u bazi znanja

Ovaj je članak napisan o proizvodu za koji Microsoft više ne pruža podršku. Članak će stoga ostati nepromijenjen i više se neće ažurirati.

S I M P T O M I

Osipanje memorije događa se pri osvježavanju HTML stranice koja koristi Microsoft JScript kod s kružnim referencama na objekte u dokumentnom objektnom modelu (DOM-u) programa Microsoft Internet Explorer.

U Z R O K

Do tog osipanja memorije dolazi jer DOM objekti nisu JScript objekti. DOM objekti nisu u shemi zbirke smeća za označivanje i brisanje u JScriptu. Stoga se kružne reference između DOM objekata i rukovatelja JScriptom neće prekinuti dok preglednik potpuno ne prebriše stranicu. To osipanje memorije dogodit će se ako preglednik otvori novu web-stranicu ili ako se zatvori prozor preglednika.

R J EŠ E N J E

Da biste riješili taj problem, u Jscript kodu izbjegavajte kružne reference na DOM objekte programa Internet Explorer. Da biste zaobišli taj problem u primjeru koda pridodanom ovome članku u odjeljku "Dodatne informacije", unesite ovu promjenu:
function hookup(element)
{
element.attachEvent( "onmouseover", mouse);
}
function mouse ()
{
}
Uz tu promjenu funkcija mouse nije objekt zatvaranja koji vodi do kružne reference.

S T A T U S

Microsoft je potvrdio da se ta programska pogreška pojavljuje u Microsoftovim proizvodima navedenima u odjeljku "Odnosi se na".

D O D A T N E I N F O R M A C I J E

Koraci za ponavljanje postupka koji je doveo do problema

  1. Zalijepite sljedeći kod u program Notepad (Blok za pisanje), a zatim spremite datoteku kao Test.htm:
    <HTML>
    <HEAD>
    <script language="javascript">
    function initpage()
    {
    window.setTimeout("window.location.reload()", 500, "javascript");
    }
    </script>
    </HEAD>
    <body onload="initpage()" >
    <div class='menu' id='menu'></div>
    <script language='javascript'>
    hookup(document.getElementById('menu'));
    function hookup(element)
    {
    element.attachEvent( "onmouseover", mouse);
    function mouse ()
    {
    }
    }
    </script>
    </body>
    </HTML>
    U tom kodu rukovatelj (funkcija mouse) ugniježđen je u poveznicu (funkcija hookup). Tim se rasporedom označava da se rukovatelj zatvara u djelokrugu pozivatelja (taj se raspored naziva i "zatvaranje"). Rukovatelj zadržava referencu na varijabilni element. U tom je slučaju varijabilni element HTML element div s parametrom ID koji je postavljen na menu. No element div poziva se na rukovatelj. Ta je referenca kružna.
  2. U programu Internet Explorer otvorite Test.htm.

    Obratite pozornost na to da se iskorištenost memorije u programu Windows Task Manager (Windows upravitelj zadataka) povećava svaki put kada se stranica osvježi.

R E F E R E N C E

Dodatne informacije o primjerima osipanja memorije u programu Internet Explorer potražite na web-mjestu mreže Microsoft Developer Network (MSDN):
Svojstva

ID članka: 830555 - posljednja izmjena: 23. tra 2007. - verzija: 1

Povratne informacije