www.webdeveloper.com
Results 1 to 4 of 4

Thread: IE crashes when calling parent function

  1. #1
    Join Date
    Jul 2012
    Posts
    9

    IE crashes when calling parent function

    Is it possible to move this to the javascript section of the website I don't want to cross post since it is usually frowned up on?

    So I had been doing some investigating and came up with a simple page to demonstrate my problem. This has no problems in firefox or chrome and seems to effect IE only.

    Below is code where javascript writes an iframe's content.
    works good till you click the button in the iframe 26 times then IE
    throws an error
    SCRIPT28: Could not complete the operation due to error 800a001c.
    At which point the iframe is blank if I press just the outside button it has no problems. Maybe it has to do that the function being called has no page to return to since it is overwritten. How should I go about fixing this?

    My current work around is as follows. I create a variable firstwrite then set it to true. In my write_page function if firstwrite is true I use the open write close method and set firstwrite equal to false then any other calls I set body.innerHTML to the output this seems to work but am I suppose to do anything special when calling a parents function that changes the current iframe?

    Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
    <title>IE Crasher</title>
    <script type='text/javascript'>
    var mycontentdocument=null;
    var count=0;
    
    //<!--
    // function to build html objects
    // expected arguments=tag,data,prefs
    //-->
    function h()
    {var tag="";
     var data="";
     var prefs="";
     for (var i = 0; i < arguments.length; i++)
     {if(i==0){tag=arguments[i];}
      if(i==1){data=arguments[i];}
      if(i==2){prefs=arguments[i];}
     }
     var retval="\<"+tag;
     if(prefs!=""){retval+=" "+prefs;}
     retval+="\>"+data+"\</"+tag+"\>";
     return retval;
    }
    
    function write_page(body)
    {var output='\<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"\>\n';
     var head='\n\<meta http-equiv="Content-type" content="text/html;charset=UTF-8"\>\n'+h("title")+'\n';
     output+=h("html","\n"+h("head",head)+"\n"+h("body","\n"+body)+"\n")
    // alert(output);
     mycontentdocument.open("text/html","replace");
     mycontentdocument.write(output);
     mycontentdocument.close();
    }
    
    function increment()
    {var body="<input type=button value='next' onclick='parent.increment()'>\n"+(count++);
     write_page(body);
    }
    
    function init()
    {mycontentdocument=document.getElementById('mycontent').contentDocument;
     if(!mycontentdocument){mycontentdocument=document.frames['mycontent'].document;}
     increment();
    }
    </script>
    </head>
    <body onload='init()'>
    <iframe id='mycontent' class='fullscreen'></iframe><br>
    <input type=button value='next' onclick='increment()'>
    </body>
    </html>
    Last edited by jeffsadowski; 09-04-2012 at 04:15 PM. Reason: moderator question

  2. #2
    Join Date
    Mar 2011
    Posts
    1,138
    My advice would be to start over from scratch. You're having the browser go to a lot of trouble to update the page because you're relying on an <iframe>. If you used a simple <div>, you could simply change it's contents by setting/resetting its .innerHTML property and not have to construct a complete HTML document for each cycle. Something like:
    Code:
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
    <script type="text/javascript">
    
    var count=0;
    
     function increment() {
        document.getElementById('mycontent').innerHTML = count++;
     } // end increment()
    
    </script>
    <style type="text/css">
     #mycontent { height:30px; background:#ffffd7; }
    </style>
    </head>
    <body>
    <div id="mycontent"></div>
    <input type="button" value="Next" onclick="increment(); return false;" />
    </body>
    </html>
    would do just as well.
    Rick Trethewey
    Rainbo Design

  3. #3
    Join Date
    Jul 2012
    Posts
    9
    Thank you rtrethewey you where very helpful.
    Quote Originally Posted by rtrethewey View Post
    My advice would be to start over from scratch.
    No way. The code above was just a small snippet to demonstrate the problem. however the write_page function could easily be adapted to write to a div using what you mentioned.
    Quote Originally Posted by rtrethewey View Post
    You're having the browser go to a lot of trouble to update the page because you're relying on an <iframe>. If you used a simple <div>, you could simply change it's contents by setting/resetting its .innerHTML property and not have to construct a complete HTML document for each cycle.
    iframe.body.innerHTML=body was my workaround. I didn't know div had that innerHTML property. div does work much better and I can remove parent. in all my calls. I still use the h function for writing tables and such to that div.

    The question still exists if setting innerHTML to a value is proper or should it be done via a method like open write close?
    Last edited by jeffsadowski; 09-05-2012 at 02:49 PM. Reason: Thought of question

  4. #4
    Join Date
    Mar 2011
    Posts
    1,138
    innerHTML is the better solution because, as I said, you don't have to reconstruct the entire document just to update one small section.
    Rick Trethewey
    Rainbo Design

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles