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 に移行しようとしているからです。これはかなり大きなアプリケーションで、一度に 1 画面ずつ変換しています。.Net ユーザー コントロールを構築しており、FoxPro 内のブラウザー オブジェクトに表示されます。上記の html と js により、winforms ユーザー コントロールを Web ページに埋め込むことができます。

特定のユーザーがアプリケーション サーバー セットアップ用のコード アクセス グループを持っていない場合、ユーザー コントロールはレンダリングされず、画面の左上隅に小さなアイコンが表示され、何かが読み込まれようとしているように見えます。読み込まれることはありませんが、ユーザーに私たちのチームにメールを送信して、アクセスを整理するように伝えたい.

スタンバイと代替を使用してみましたが、どちらもテキストを表示しませんでした。すべてのユーザーは IE7 を使用しており、これは一時的な解決策 (< 6 か月) にすぎません。

4

2 に答える 2

4

object タグ内に任意のインライン要素を配置できます。読み込みに失敗した場合、ユーザーに表示されます。

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

MSDN: OBJECT 要素 | オブジェクト オブジェクト

奇妙な 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 をこれに変更すると、目的の結果が得られる場合があります (このオブジェクトのインスタンスが 1 つしかページに適用されていない場合)。

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 に答える