|
|
|
| Привет всем!
Последняя надежда на помощь и идею о спасении...
Работаю с server GoAhead, ASP-JavaScript, на стороне клиента Tree-Menu in IE6. Основа меню во вложенном XML, построение JavaScript.
В меню вложено 3000 item. Динамически.
Загружается достаточно быстро. Использую Precaching of Image.
Но если только делаю Reload -труба - вижу 5 минут как загружаются 6000 image.
Ничего уже не могу понять.
Кто может пояснить, что происходит при перезагрузке фреймов и ихображений. Я вижу, что кеширование падает второй раз.
Ниже тексты
<HTML>
<HEAD>
<TITLE>Select Frame</TITLE>
<META http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT">
<META http-equiv="Pragma" content="no-cache">
<META HTTP-EQUIV=\"Cache-Control\" content=\"no-store, no-cache, must-revalidate\">
<SCRIPT LANGUAGE="JavaScript" SRC="../start/js/select.js"></SCRIPT>
</HEAD>
<BODY onLoad="init('outlineXML')">
<XML ID="outlineXML">
<opml version="1.0">
<head>
<title>A Modern Outline</title>
</head>
<body>
<out text="Device" uri="../start/welcome.htm">
<out text="Server" uri="../apl/ied.asp" index="setidx(0);">
<out text="RRRR" uri="../apl/ldevice.asp" index="setidx(3);">
<out text="LL" uri="../apl/ln.asp" index="setidx(4);">
<out text="Mod.ST.stVal" uri="../apl/c2.asp" index="setidx(6);"/>
<out text="Beh.ST.stVal" uri="../apl/c2.asp" index="setidx(8);"/>
<out text="Health.ST.stVal" uri="../apl/c2.asp" index="setidx(10);"/>
</out>
<out text="LPHD" uri="../apl/ln.asp" index="setidx(11);">
<out text="PhyHealth.ST.stVal" uri="../apl/c2.asp" index="setidx(13);"/>
<out text="Proxy.ST.stVal" uri="../apl/c2.asp" index="setidx(15);"/>
</out>
<out text="GGIO" uri="../apl/ln.asp" index="setidx(16);">
<out text="Mod.ST.stVal" uri="../apl/c2.asp" index="setidx(18);"/>
<out text="Beh.ST.stVal" uri="../apl/c2.asp" index="setidx(20);"/>
<out text="Health.ST.stVal" uri="../apl/c2.asp" index="setidx(22);"/>
<out text="Ind1.ST.stVal" uri="../apl/c2.asp" index="setidx(24);"/>
....
<out text="VrtCmd15.Oper.CO.ctlVal" uri="../apl/c3.asp" index="setidx(2684);"/>
</out>
</out>
</out>
</body>
</opml>
</XML>
<DIV ID="content"></DIV>
</BODY>
</HTML>
//////////////////////////////
// select.js
var cimage = [];
collapsedWidget = 0;
collapsedWidgetStart = 1;
collapsedWidgetEnd = 2;
expandedWidget = 3;
expandedWidgetStart = 4;
expandedWidgetEnd = 5;
nodeWidget = 6;
nodeWidgetEnd = 7;
emptySpace = 8;
chainSpace = 9;
// counters for reflexive calls to makeHTML()
//var currID = 0
var currID = 10000
var blockID = 0
var widgetWidth = "20";
var widgetHeight = "16";
var currState = "";
var displayTarget = "view";
// initialize first time
function init(outlineID)
{
var pathprefix = "../graphics/";
var imageWidth = 20;
var imageHeight = 16;
var image_name = new Array(10);
image_name[collapsedWidget] = 'oplus.gif';
image_name[collapsedWidgetStart]= 'oplusstart.gif';
image_name[collapsedWidgetEnd] = 'oplusend.gif';
image_name[expandedWidget] = 'ominus.gif';
image_name[expandedWidgetStart] = 'ominusstart.gif';
image_name[expandedWidgetEnd] = 'ominusend.gif';
image_name[nodeWidget] = 'onode.gif';
image_name[nodeWidgetEnd] = 'onodeend.gif';
image_name[emptySpace] = 'oempty.gif';
image_name[chainSpace] = 'ochain.gif';
// Precaching of the images
cimage = [];
for (var i = 0; i < 10; i++)
{
var o_icon = new Image(imageWidth, imageHeight);
cimage[i] = o_icon;
o_icon.src = pathprefix + image_name[i];
}
if(supportVerified(outlineID))
{
// demo how to get outline head elements
var hdr = document.getElementById(outlineID).getElementsByTagName("head")[0]
// get outline body elements for iteration and conversion to HTML
var ol = document.getElementById(outlineID).getElementsByTagName("body")[0]
// wrap whole outline HTML in a span
var olHTML = "<SPAN ID='renderedOL'>" + makeHTML(outlineID, ol) + "</SPAN>"
// throw HTML into 'content' DIV for display
document.getElementById("content").innerHTML = olHTML
// Expand all
initExpand(outlineID)
}
}
// toggle an outline mother entry, storing new state value;
// invoked by onClick event handlers of widget image elements
function toggle(img, blockNum)
{
var newString = ""
var expanded, n
// modify state string based on parameters from IMG
expanded = currState.charAt(blockNum)
currState = swapState(currState, expanded, blockNum)
// dynamically change display style
if("0" == expanded)
{
document.getElementById("OLBlock" + blockNum).style.display = "block"
img.src = getExpandedWidgetState(img.src)
}
else
{
document.getElementById("OLBlock" + blockNum).style.display = "none"
img.src = getCollapsedWidgetState(img.src)
}
}
// invert state
function swapState(currState, currVal, n)
{
var newState = currState.substring(0,n)
newState += currVal ^ 1 // Bitwise XOR item n
newState += currState.substring(n + 1, currState.length)
return newState
}
// retrieve matching version of 'minus' images
function getExpandedWidgetState(imgURL)
{
if(-1 != imgURL.indexOf("Start"))
{
return cimage[expandedWidgetStart].src
}
if(-1 != imgURL.indexOf("End"))
{
return cimage[expandedWidgetEnd].src
}
return cimage[expandedWidget].src
}
// retrieve matching version of 'plus' images
function getCollapsedWidgetState(imgURL)
{
if(-1 != imgURL.indexOf("Start"))
{
return cimage[collapsedWidgetStart].src
}
if(-1 != imgURL.indexOf("End"))
{
return cimage[collapsedWidgetEnd].src
}
return cimage[collapsedWidget].src
}
/*********************************
OUTLINE HTML GENERATION
**********************************/
// apply default expansion state from outline's header
// info to the expanded state for one element to help
// initialize currState variable
function calcBlockState(outlineID, n)
{
var ol = document.getElementById(outlineID).getElementsByTagName("body")[0]
var outlineLen = ol.getElementsByTagName("out").length
// get OPML expansionState data
var expandElem = document.getElementById(outlineID).getElementsByTagName("expansionState")[0]
var expandedData = (expandElem.childNodes.length) ? expandElem.firstChild.nodeValue.split(",") : null
if(expandedData)
{
for(var j = 0; j < expandedData.length; j++)
{
if(n == expandedData[j] - 1)
{
return "1"
}
}
}
return "0"
}
// expand items set in expansionState XML tag, if any
function initExpand(outlineID)
{
for(var i = 0; i < currState.length; i++)
{
if(-1 == currState.charAt(i))
{
document.getElementById("OLBlock" + i).style.display = "block"
}
}
}
// generate HTML for outline
function makeHTML(outlineID, ol, prefix)
{
var output = ""
var nestCount, link, nestPrefix, MouseDown, sIndex, Click
prefix = (prefix) ? prefix : ""
for(var i = 0; i < ol.childNodes.length ; i++)
{
nestCount = ol.childNodes[i].childNodes.length
output += "<DIV CLASS='row' ID='line" + currID++ + "'>\n"
sIndex = (ol.childNodes[i].getAttribute("index")) ? ol.childNodes[i].getAttribute("index") : ""
if(sIndex){
MouseDown = " onMouseDown='" + sIndex + "' ";
Click = " onClick='" + sIndex + "' ";
}
else
{
MouseDown = " ";
Click = " ";
}
if(nestCount > 0)
{
output += prefix
output += "<IMG ID='widget" + (currID-1) + "' SRC='" + ((i== ol.childNodes.length-1) ? cimage[collapsedWidgetEnd].src : (blockID==0) ? cimage[collapsedWidgetStart].src : cimage[collapsedWidget].src)
output += "' HEIGHT=" + widgetHeight + " WIDTH=" + widgetWidth
output += " TITLE='Click to expand/collapse nested items.' onClick='toggle(this," + blockID + ")'>"
link = (ol.childNodes[i].getAttribute("uri")) ? ol.childNodes[i].getAttribute("uri") : ""
if(link)
{
output += " <A HREF='" + link + "' CLASS='itemTitle' TARGET='" + displayTarget + "'"+MouseDown+">"
}
else
{
output += " <A CLASS='itemTitle' " + MouseDown+">"
}
output += " " + ol.childNodes[i].getAttribute("text") + "</A>"
currState += calcBlockState(outlineID, currID-1)
output += "<SPAN CLASS='OLBlock' BLOCKNUM='" + blockID + "' ID='OLBlock" + blockID++ + "'>"
nestPrefix = prefix
nestPrefix += (i == ol.childNodes.length - 1) ?
"<IMG SRC='" + cimage[emptySpace].src + "' HEIGHT=16 WIDTH=20>" :
"<IMG SRC='" + cimage[chainSpace].src + "' HEIGHT=16 WIDTH=20>"
output += makeHTML(outlineID, ol.childNodes[i], nestPrefix)
output += "</SPAN></DIV>\n"
}
else
{
output += prefix
output += "<IMG ID='widget" + (currID-1) + "' SRC='" + ((i == ol.childNodes.length - 1) ? cimage[nodeWidgetEnd].src : cimage[nodeWidget].src)
output += "' HEIGHT=" + widgetHeight + " WIDTH=" + widgetWidth + ">"
link = (ol.childNodes[i].getAttribute("uri")) ? ol.childNodes[i].getAttribute("uri") : ""
if(link)
{
output += " <A HREF='" + link + "' CLASS='itemTitle' TARGET='" + displayTarget + "'"+Click+">"
}
else
{
output += " <A CLASS='itemTitle' " + Click + ">"
}
output += ol.childNodes[i].getAttribute("text") + "</A>"
output += "</DIV>\n"
}
}
return output
}
// verify that browser supports XML islands
function supportVerified(testID)
{
if(document.getElementById && document.getElementById(testID)
&& document.getElementById(testID).XMLDocument)
{
return true
}
else
{
var reply = confirm("This example requires a browser with XML data island support, such as IE5+/Windows. Go back to previous page?")
if(reply)
{
history.back()
}
else
{
return false
}
}
return false
}
function setidx(idx)
{
top.document.frames['view'].document.cookie = "idx_Menu=" + idx;
document.cookie = "idx_Menu=" + idx;
if(top.document.frames['view'].document.forms['Message61850'])
{
top.document.frames['view'].document.forms['Message61850'].elements['cork']=idx;
top.document.frames['view'].document.forms['Message61850'].submit();
}
} | |
|
|
|
|
|
|
|
для: Alex_CVC
(31.10.2005 в 14:50)
| | Надежда умрёт, запутавшись в массе кода, никто не под дулом пистолета его не будет смотреть : ). Ограничимся общими рассуждениями. Здесь стоит <META http-equiv="Pragma" content="no-cache">, очевидно, чтобы не брать изображения из кеша, и это зачем-то надо. При перезагрузке все изображения, в том числе в невидимых слоях, перезагружаются, и правильно - nocache. Чтобы этого не было, а nocache сохранился, предлагаю сделать следующее: если страница обнаружит перезагрузку, вызывать _другую_ страницу, с отличающимся URL. Возможно, это спасёт. Хотя Нетскейп раньше упорно брал и в этом случае картинки из кеша, но тогда в нём слоёв таких, как сейчас, не было.
Вызвать другой УРЛ можно, приписывая текущему УРЛу случайное число (перезагрузить страницу по location=location.toString()+'?'+случ_чис; ).
Основной вопрос - как ловить Reload. В IE есть onReload , но не знаю, насколько уверенно он работает. Помнится, приходилось его дублировать, потому что не всегда срабатывал. Дублирование - интересный вопрос. Единственный способ обнаружить релоад без события - это проверить значение поля формы - оно при релоаде сохраняется, когда все другие переменные сбрасываются. Итак, если обнаруживается релоад, идёт переадресация на УРЛ с той же страницей, но новым значением самого УРЛа. Дерзайте, успехов, сообщите о результатах : ). | |
|
|
|
|