Pregunta

Tenemos algo de HTML que tiene este aspecto:

<form id="MyUserControl" runat="server" method="post">
   <script language="javascript" src="javascript.js"></script>

El archivo JavaScript contiene algo como esto:

document.write('<object id="MyUserControl" ');
document.write('classid="MyUserControl.dll#MyNamespace.MyUserControl"');
document.write('height="611" width="951" >');
document.write('<param name="Parm1" value="' + parm1 + '" />');
document.write('</object>');

En esencia, me gustaría ser capaz de mostrar algún texto o dejar en espera de texto en su lugar si el objeto no se carga correctamente.

La razón de todo esto es que estamos tratando de migrar una aplicación antigua de FoxPro a .NET mientras que todavía está en uso. Es una aplicación bastante grande y nos estamos convirtiendo una pantalla a la vez. Estamos construyendo controles de usuario .NET y que se muestran en un objeto de navegador dentro de FoxPro. El código HTML y JS anteriormente nos permiten incrustar el control WinForms usuario en una página web.

Si un usuario particular no tiene un grupo de acceso de código para nuestro servidor de aplicaciones establecido, el control de usuario no hace que la pantalla y sólo demuestra el pequeño icono en la esquina superior izquierda que se parece a algo que está intentando cargar. Nunca lo hace la carga, pero quiero indicar al usuario un correo electrónico a nuestro equipo para obtener su acceso embrollo.

He intentado utilizar de espera y alt, pero tampoco mostró texto. Todos nuestros usuarios tienen IE7 y esto es sólo una solución temporal (<6 meses).

¿Fue útil?

Solución

Se puede poner cualquier elemento dentro del texto en la etiqueta de objeto, y si no se puede cargar, se presenta al usuario.

<object>
  This object failed to load,
  try to install <a href="http://plugin-site/">here</a>
</object>

de MSDN: elemento de objeto | objeto Object

quería añadir algunas notas acerca de los comportamientos de IE impares. (IE <8) Cuando se utiliza el código anterior, donde el contenido fallo se va a mostrar, perderá el acceso al objeto de DOM. Así que es posible que desee mantenerlo vacío y hacer algo de código adicional para determinar el éxito de la carga.

<!DOCTYPE html>
<html>
<head>
  <title>so-objects</title>
  <script type="text/javascript">

    function add(text) {
      document.body.appendChild(document.createElement("div"))
                   .appendChild(document.createTextNode(text));
    };

    function each(o, f, c) {
      for (var i=0, l=o.length; i<l; i++) f.call(c, o[i], i, o);
    };

    onload = function() {

      // IE returns null and has mysteriously removed the object from DOM
      add("byId = "+ document.getElementById("no-access") );

      // IE returns 2 instead of 3
      add("byTags = "+ document.getElementsByTagName("object").length );

      // verify successful load if the object property is available
      each(document.getElementsByTagName("object"), function(node) {
        add(node.id +" = "+ !!node.object);
      });

    };

  </script>
  <style type="text/css">
    object, span { position: absolute; left:-10000px; }
  </style>
</head>
<body>

  <object id="access">
  </object>

  <object id="no-access">
    <span>failed</span>
  </object>

  <object id="supported"
     classid="clsid:6bf52a52-394a-11d3-b153-00c04f79faa6">
  </object>

</body>
</html>

Los valores devueltos para IE <8

byId = null
byTags = 2
access = false
supported = true

Los valores devueltos para W3C Cumple

byId = [object HTMLObjectElement]
byTags = 3
access = false
no-access = false
supported = false

Pruebe por sí mismo

Otros consejos

La adición de otra respuesta más específica a su situación.

Cambiar su javascript para esto puede producir los resultados deseados (si sólo hay una instancia de este objeto de ser aplicada a la página).

function onchange(o) {
  if (o.readyState == 4) {
    if (o.object == null) {
      alert("UserControl is not installed, please email your administrator.");
      // or, toggle display of a message dialog in HTML
      //document.getElementById("not-installed").style.display = "block";
    }
  }
};

document.write('<object id="MyUserControl"');
document.write(' classid="MyUserControl.dll#MyNamespace.MyUserControl"');
document.write(' height="611" width="951" onreadystatechange="onchange(this)">');
document.write(' <param name="Parm1" value="' + parm1 + '" />');
document.write('</object>');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top