views:

253

answers:

1

Hi, I have an ASP page that contains an iframe. I'll call it the main page. I need to set a hidden field's value in the main page once the iframe has finished loading. The iframe is an ASP page that has a hidden field that is set during its page_load. It then needs to pass this value into a hidden field on the main page.

I have an onLoad hander in the iframe page calling a javascript method in the main frame. I had to put a delay in the function where it addresses some telerik controls because it couldn't find them otherwise. Seems that the page hasn't finished initializing.

Questions: Is there a better way to do this? Is there a "page is ready" event? Is there a way to get these pages synched up so I don't need time delays?

Thansks, Brian

In the iframe page I do

  window.onload = doLoad;

  function doLoad() {
      window.parent.SetHitCount(document.getElementById("<%=hdnHitCount.ClientID %>").value);
      return;
  }

In the main page, I have this javascript function:

  // called from document iframe to set the hit count
  function SetHitCount(count){
        var hdnHitCount = document.getElementById("<%=hdnHitCount.ClientID %>")
        hdnHitCount.value = count;
        // set in the toolbar. needs a delay so the telerik controls will be ready
        window.setTimeout(function() { 
            var toolbar = $find("<%=RadToolBarDocument.ClientID%>");
            if (toolbar != null) {
                var button = toolbar.findItemByValue("NumberOfHits");
                button.set_text("<%= Resources.Review_Document.Hits %>" + hdnHitCount.value);
            }
       }, 1000); 
  }
+1  A: 

It seems like your problem has nothing to do with the IFrame, since the hdnHitCount value is being obtained with no problem.

Rather, you have a timing issue - the control is not always available when the value is.

The hardcoded timeout is not a good solution. What if the control initialization takes longer than a second (for example on slower machines/connections)?

The right way to do it is to set up a system where both the control initialization and the SetHitCount function will both check if the other has already happened:

  • If when SetHintCount is run, the control is available, run your logic, otherwise, save the hit count to some variable
  • If when the control is initialized this variable is set, populate the control from its value. Otherwise, SetHitCount has not executed yet and will populate the control when it does.
levik