469,936 Members | 2,463 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,936 developers. It's quick & easy.

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

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"+he x[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?
Aug 30 '05 #1
3 1461
Robi wrote:
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...

[...]

--
Rob
Aug 30 '05 #2
RobG wrote:
Robi wrote:
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(''));
}
--
Rob
Aug 30 '05 #3
RobG wrote:
RobG wrote:
Robi wrote:
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.

[...] 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


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!

--
Robi
Aug 30 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

reply views Thread by Michael Brame | last post: by
1 post views Thread by sling blade | last post: by
reply views Thread by Curtiss | last post: by
8 posts views Thread by Taras_96 | last post: by
2 posts views Thread by Jonathan Crawford | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.