IE-Kontextmenu-Erweiterung Laufzeit- oder Überlaufprobleme
Raik
- javascript
Hallo!
mit einem registry-eintrag wird ein neuer menüpunkt im kontextmenü eingefügt:
---------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Clipper]
@="C:\PortableAppz\IEextensions\clipper.htm"
"contexts"=dword:00000010
---------------------------------------------
das script stellt sporadisch an unterschiedlichen stellen die arbeit ein. ich hatte es zuerst in einer heruntergeladenen seite entwickelt, in der es auch tadellos lief. die probleme treten erst jetzt auf, wenn ich es über das kontextmenü im kontext anderer seiten aufrufe.
die probleme sind in den kommentaren /* */ beschrieben.
*** clipper.htm ***
<script type="text/javascript" language="JavaScript" defer>
var path = 'C:\\PortableAppz\\IEextensions\\';
var win = external.menuArguments;
var parents = new Array();
var count = 1;
// parents bestimmen
var curElem = win.document.selection.createRange().parentElement();
parents[0] = curElem.style.border;
curElem.style.border = '1px solid red';
while (curElem.parentElement) {
parents[count] = curElem;
curElem = curElem.parentElement;
count += 1;
}
curElem = parents[1];
count = 1;
var oPopup = win.createPopup(); // aus msdn
var oPopBody = oPopup.document.body;
var closure = function () {
var dir = -1;
/* manchmal stellt das script die arbeit ein nach ein paar tastendrücken oder wenn ich mit der maus etwas mache. als ob der eventhandler onkeydown verloren geht. */
switch (win.event.keyCode) {
case 38: // up
dir = 1;
if(curElem.parentElement.nodeName == 'TD'){dir = +4}
case 40: // down
if(dir == -1 && curElem.nodeName == 'TABLE'){dir = -4}
if (count+dir<1 || count+dir>(parents.length - 1)){return false;}
count += dir;
curElem.style.border = parents[0];
curElem = parents[count];
curElem.style.border = '1px solid red';
oPopBody.style.backgroundColor = "lightyellow";
oPopBody.style.border = "solid black 1px";
oPopBody.innerHTML = '<pre>'+count+' '+curElem.nodeName+'</pre>';
oPopup.show(1, -18, 70, 18, curElem);
break;
case 46: // entfernen
curElem.parentElement.removeChild(curElem);
break;
case 13: // enter
curElem.style.border = parents[0];
/* das prompt wird vom popupblocker abgefangen, so dass ich es erst temoprär erlauben und die erweiterung über das kontextnemü nochmal starten muss */
var foldername = win.prompt('Ordnername?',win.document.title.replace(/[^a-zA-Z0-9]+/g,'_'));
if(typeof foldername=='object'){return false}
foldername = path+foldername;
/* ergibt keine warnung, da das script als vertrauenswürdig ausgeführt wird. */
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists(foldername)){fso.CreateFolder(foldername);}
// Bilder runterladen
var HTTP = new ActiveXObject("Microsoft.XMLHTTP");
var imgs = curElem.getElementsByTagName("img");
var img_count = imgs.length;
var imgname,file;
while(img_count){
img_count--;
HTTP.open("GET", imgs[img_count].src, false);
HTTP.send();
/* muss ich hier evtl. den readyState prüfen? kann es sein, dass sich das script beim download "verschluckt", wenn es zu schnell geht? oder der server zu langsam reagiert? */
datei = Download(HTTP.responseBody);
imgname = img_count+'.'+HTTP.getResponseHeader('Content-Type').split('/')[1];
file = fso.CreateTextFile(foldername+'\\'+imgname,true);
file.Write(datei);
file.Close();
imgs[img_count].src=imgname;
}
// HTML-Datei speichern
/* wenn ich das laden der bilder auskommentiere, wird das speichern des seitenausschnitts ausgeführt, ansonsten wird manchmal nur ein leeres dokument gespeichert, manchmal werden noch nicht mal alle bilder runtergeladen. */
var source = '<html><body>'+curElem.outerHTML+'</body></html>';
source = source.replace(/ style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"/g,'');
var html = fso.CreateTextFile(foldername+'\\index.htm', true);
html.Write(source);
html.Close();
case 27: // esc
curElem.style.border = parents[0];
win.document.body.onkeydown = null;
break;
}
return false;
};
win.document.body.onkeydown=closure;
/* ohne die verzögerung durch den alert wird anscheinend der eventhandler garnicht eingehängt */
alert('Clipper gestartet!');
</script>
<script language="VBScript">
Function Download(response)
For x = 0 to UBound(response)
/* diese umwandlung hab ich bisher in javascript nicht umgesetzt bekommen, deshalb das extra vbscript hier. */
binary = binary & ChrW(AscW(Chr(AscB(MidB(response,x+1,1)))))
Next
Download = binary
End Function
</script>
wenn jemand schon mal ähnliche erfahrungen gemacht hat, dass ein script ohne verzögerung durch zb. einen alert nicht läuft, oder an verschiedenen stellen die arbeit einstellt, würde ich mich über seine erkenntnisse und evtl. lösungswege freuen.
freundl. Grüsse aus Berlin, Raik