small script --> huge load --> error message

R

Robi

Ok, I'm sure everybody who works with javascript has seen this
or similar messages depending on their agent:

A script on this page is causing mozilla to run slowly.
If it continues to run, your computer may become unresponsive.
Do you want to abort the script?
[ OK ] [Cancel]

besides the very confusing OK/Cancel buttons in FireFox, is there a
way to tell a javascript to give control back to the agent interface
for a few moments?

I am trying to list "all" the characters in tables (from #x0000-#xffff)
yeah, that's 65K characters...

the function is defined in the <head> section and goes:

<script type="text/javascript">

function createlist()
{
var hex="0123456789abcdef";
hex=hex.split("");
var fourth, third, second, first, spezial;
var oBody=document.getElementsByTagName("body").item(0);
var oTable, oTHead, oTBody, oTFoot, oCaption;
var oRow, oCell, oHell, oDiv;

for (first=0;first<=15;first++)
{
for (second=0;second<=15;second++)
{
oTable = document.createElement("table");
oTHead = document.createElement("thead");
oTBody = document.createElement("tbody");
oTFoot = document.createElement("tfoot");
oCaption = document.createElement("caption");

oTable.appendChild(oCaption);
oTable.appendChild(oTHead);
oTable.appendChild(oTBody);
oTable.appendChild(oTFoot);
oTable.border=1;

oRow=document.createElement("tr");
oTHead.appendChild(oRow);
oCell = document.createElement("th");
oCell.appendChild(document.createTextNode("Hex"));
oRow.appendChild(oCell);
oBody.appendChild(oTable);
for (oHell=0;oHell<16;oHell++){
oCell = document.createElement("th");
oCell.appendChild(document.createTextNode(hex[oHell]));
oRow.appendChild(oCell);
}
oTBody = document.createElement("tbody");
oTable.appendChild(oTBody);

for (third=0;third<=15;third++)
{
oRow=document.createElement("tr");
oTBody.appendChild(oRow);
oCell=document.createElement("td");
oCell.appendChild(document.createTextNode("&#x"+hex[first]+hex[second]+"n"+hex[third]+";"));
oRow.appendChild(oCell);
for (fourth=0;fourth<=15;fourth++)
{
oCell=document.createElement("td");
oCell.innerHTML="&#x"+hex[first]+hex[second]+hex[fourth]+hex[third]+";";
oRow.appendChild(oCell);
}
}
}
}
}

</script>


and then in the body I call

<script type="text/javascript">
createlist();
</script>

plain and simple, well, except for the load it creates iterating through 16^4
characters creating 16^2 tables and 16^4+16^2 cells and 16^3+16^2 rows
(rough calculations off the top of my head ;-)

Is there a way to diffuse the load and still getting all the tables created?
 
R

RobG

Robi said:
Ok, I'm sure everybody who works with javascript has seen this
or similar messages depending on their agent:

A script on this page is causing mozilla to run slowly.
If it continues to run, your computer may become unresponsive.
Do you want to abort the script?
[ OK ] [Cancel]

besides the very confusing OK/Cancel buttons in FireFox, is there a
way to tell a javascript to give control back to the agent interface
for a few moments?

You may find this enlightening (and sympathetic too):

<URL:http://www.fourmilab.ch/fourmilog/archives/2005-08/000568.html>

The short answer is:

1. Type "about:config" in the address bar

2. Scroll down to "dom.max_script_run_time"

3. Double-click it and set it to however many seconds you'd like Firefox
to wait before presenting the confirm dialog.
I am trying to list "all" the characters in tables (from #x0000-#xffff)
yeah, that's 65K characters...

the function is defined in the <head> section and goes:

<script type="text/javascript">

Using DOM is commendable, but for this task I think you will find that
good 'ol non-standard 'DOM 0' document.write is hugely faster.

Excuse me for not testing it! I'll have a go and post back later...

[...]
 
R

RobG

RobG said:
Robi said:
Ok, I'm sure everybody who works with javascript has seen this
or similar messages depending on their agent:

A script on this page is causing mozilla to run slowly.
If it continues to run, your computer may become unresponsive.
Do you want to abort the script?
[ OK ] [Cancel]

besides the very confusing OK/Cancel buttons in FireFox, is there a
way to tell a javascript to give control back to the agent interface
for a few moments?


You may find this enlightening (and sympathetic too):

<URL:http://www.fourmilab.ch/fourmilog/archives/2005-08/000568.html>

The short answer is:

1. Type "about:config" in the address bar

2. Scroll down to "dom.max_script_run_time"

3. Double-click it and set it to however many seconds you'd like Firefox
to wait before presenting the confirm dialog.
I am trying to list "all" the characters in tables (from #x0000-#xffff)
yeah, that's 65K characters...

the function is defined in the <head> section and goes:

<script type="text/javascript">


Using DOM is commendable, but for this task I think you will find that
good 'ol non-standard 'DOM 0' document.write is hugely faster.

Excuse me for not testing it! I'll have a go and post back later...

Try this one:
- closing tags for tr & td omitted
- unused head, foot and caption elements omitted
- unneccessary (in this case) tbody omitted


function createlist() {
var hex="0123456789abcdef";
hex=hex.split("");
var n = hex.length;
var fourth, third, second, first, spezial;
var oBody = document.body;
var txt=[];

for ( first=0; first<n; first++ ) {
for (second=0;second<n;second++) {
txt.push('<table border="1"><tr><th>Hex<');

for ( oHell=0; oHell<n; oHell++){
txt.push('<th>' + hex[oHell]);
}

for ( third=0; third<n; third++) {
txt.push('<tr><td>' + '&#x' + hex[first]
+ hex[second] + 'n' + hex[third] + ';');

for ( fourth=0; fourth<n; fourth++) {
txt.push('<td>' + '&#x' + hex[first]
+ hex[second] + hex[fourth] + hex[third] + ';');
}
}
txt.push('</table>');
}
}
document.write(txt.join(''));
}
 
R

Robi

RobG said:
RobG said:
Robi said:
Ok, I'm sure everybody who works with javascript has seen this
or similar messages depending on their agent:

A script on this page is causing mozilla to run slowly.
If it continues to run, your computer may become unresponsive.
Do you want to abort the script?
[ OK ] [Cancel]

besides the very confusing OK/Cancel buttons in FireFox, is there a
way to tell a javascript to give control back to the agent interface
for a few moments?

You may find this enlightening (and sympathetic too):

<URL:http://www.fourmilab.ch/fourmilog/archives/2005-08/000568.html>

I did run across this page while trying to figure out what I could do,
but decided it to be a "hack" approach and try a different way because
if someone else wants to use the script (as perversely as it sounds)
that or those someones would need to adjust their agents and that wouldn't
necessarily have to be FF alone, and since I didn't find any "other"
obvious possibility I decided to post my question here.

[...]
Try this one:
- closing tags for tr & td omitted
- unused head, foot and caption elements omitted
- unneccessary (in this case) tbody omitted

I understand the last two :) but I didn't know tr/th/td end tags were optional until now
(probably until I or someone else change the document to xhtml...)

cool, thanks, now that's slim jim ;-)
function createlist() {
var hex="0123456789abcdef";
hex=hex.split("");
var n = hex.length;
var fourth, third, second, first, spezial;
var oBody = document.body;
var txt=[];

for ( first=0; first<n; first++ ) {
for (second=0;second<n;second++) {
txt.push('<table border="1"><tr><th>Hex<');

for ( oHell=0; oHell<n; oHell++){
txt.push('<th>' + hex[oHell]);
}

for ( third=0; third<n; third++) {
txt.push('<tr><td>' + '&#x' + hex[first]
+ hex[second] + 'n' + hex[third] + ';');

for ( fourth=0; fourth<n; fourth++) {
txt.push('<td>' + '&#x' + hex[first]
+ hex[second] + hex[fourth] + hex[third] + ';');
}
}
txt.push('</table>');
}
}
document.write(txt.join(''));
}

and the message didn't appear! :-D
oh, I tried to make "smaller" write() "blocks", moving the document.write()
into the "for(first" block, in the hope I would see the page grow, but all
I got was the message again, so I scraped that.
Thinking about it now, and after having read the fourmilab.ch article, it's
clearer to me, because wanting to run the script /and/ wanting to display
the data as it grows, uses all of FFs graphical/script resources.

Rob, thanks alot for the tip with the write('html')
instead of DOM createElement. Works great!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,905
Latest member
Kristy_Poole

Latest Threads

Top