2

我们有一些看起来像这样的 html:

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

javascript 文件包含如下内容:

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>');

本质上,如果对象未正确加载,我希望能够显示一些文本或保留备用文本。

所有这一切的原因是我们正在尝试将一个仍在使用的旧应用程序从 FoxPro 迁移到 .Net。这是一个相当大的应用程序,我们一次转换一个屏幕。我们正在构建.Net 用户控件,它们显示在 FoxPro 内的浏览器对象中。上面的 html 和 js 允许我们在网页中嵌入 winforms 用户控件。

如果特定用户没有为我们的应用程序服务器设置代码访问组,则不会呈现用户控件,并且屏幕仅显示左上角的小图标,看起来像是在尝试加载某些东西。它永远不会加载,但我想通知用户给我们的团队发送电子邮件,以理顺他们的访问权限。

我尝试使用待机和 alt,但都没有显示文本。我们所有的用户都有 IE7,这只是一个临时解决方案(< 6 个月)。

4

2 回答 2

4

您可以在对象标签内放置任何内联元素,如果加载失败,它们将呈现给用户。

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

MSDN:对象元素 | 对象对象

想添加一些关于奇怪的 IE 行为的注释。(IE < 8) 当使用上述代码显示失败内容时,您将无法访问 DOM 中的对象。因此,您可能希望将其保留为空并执行一些额外的代码来确定加载成功。

<!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>

IE < 8的返回值

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

符合 W3C 标准的返回值

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

自己试试

于 2009-03-31T19:59:23.310 回答
1

根据您的情况添加另一个更具体的答案。

将您的 javascript 更改为此可能会产生所需的结果(如果只有该对象的一个​​实例应用于页面)。

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>');
于 2009-04-01T17:39:21.550 回答