这是我目前正在使用的代码:(注意 - %s在服务器端被替换)
<!--[if !IE]>-->
<object
type="application/x-java-applet"
width="300" height="300"
>
<!--<![endif]-->
<!--[if IE]>
<object
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/update/1.6.0/jinstall-6u22-windows-i586.cab"
type="application/x-java-applet"
width="300" height="300"
>
<!--><!-- <![endif]-->
<param name="codebase" value="/media/vnc/" >
<param name="archive" value="TightVncViewer.jar" />
<param name="code" value="com.tightvnc.vncviewer.VncViewer" />
<param name="port" value="%s" />
<param name="Open New Window" value="yes" />
</object>
安装Java时,这在IE和Firefox中都能很好地运行。 当没有安装Java时,IE和Firefox都正确地提示从代码库行自动下载Java 1.6。 (IE通过插件查找器服务给予firefox的activex url)
现在,假设我想要在没有安装插件的情况下显示回退内容,比如像“获取Java”这样的简单消息。从阅读the specs开始,我认为这不应该改变插件查找提示 - 也就是说,渲染后备应该被视为无法呈现对象标记。因此,我仍然应该获得插件查找器服务,提示我安装Java。相反,只需将单个字符添加到object元素的innerHTML就会导致Firefox不再提示。访问data:text/html,<object type='application/x-java-applet'>Java failed to load</object>
。
如何在提供后备内容的同时保持firefox提示安装Java?
测试Firefox的Java插件查找服务的URL:data:text/html,<object type='application/x-java-applet'/>
答案 0 :(得分:1)
点击此处:https://eyeasme.com/Shayne/XHTML/appletObject.html
问题:为什么只有一个结束标签?非IE浏览器将看到两个打开的OBJECT标签[是的,第二个因为CLASSID属性中无法识别的值而无法工作],并且它们将只伴有一个结束对应物。
编辑2:不幸的是,我无法使该页面中描述的方法适用于Chrome。所有其他浏览器[FF,IE,Safari和Opera - 最新版本]工作得很好,除了Chrome - 它甚至不加载applet /对象。
答案 1 :(得分:1)
在我看来,使用[if IE]
classid和codebase属性会使HTML变得复杂。此外,它们仅用于在未安装Java的情况下指导用户。相反,为什么不在JS中使用setTimeout在几秒钟后调用applet中的方法,如果它没有响应,那么使用JS建议用户操作。这简化了目标代码: -
<p>
<object type="application/x-java-applet"
name="accessName" width="300" height="300">
<param name="codebase" value="/media/vnc/" />
<param name="code" value="com.tightvnc.vncviewer.VncViewer" />
<param name="archive" value="TightVncViewer.jar" />
<param name="scriptable" value="true" />
<param name="mayscript" value="true" />
<param name="port" value="%s" />
<param name="Open New Window" value="yes" />
</object>
</p>
如果applet必须调用JS,则1.6.0.10之前的Java插件需要mayscript参数。如果JS需要调用applet,则根据javadocs 1.6.0.21仍然需要可编写脚本的param。但是,在我使用1.6.0.24进行签名applet的一次测试中,IE8在没有脚本化设置为真的情况下从JS调用它。对于上面的applet,你不需要“mayscript”,或者作者会包含它,但是对于任何setTimeout调用你可能需要“scriptable”。
答案 2 :(得分:1)
如何在提供后备内容的同时保持firefox提示安装Java?
编辑/制作VncViewer applet start()方法以设置Javascript变量。从Javascript检查变量的存在与几秒钟后的setTimeout或setInterval。如果它无法显示,则java无法正常工作,因此提醒用户从java.com获取最新的Java运行时。您甚至可以使用DOM插入可点击的链接。
应该适用于任何浏览器,并且会出现后备文本。 HTML也更简单: -
<object type="application/x-java-applet" width="300" height="300">
<param name="codebase" value="/media/vnc/" />
<param name="code" value="com.tightvnc.vncviewer.VncViewer" />
<param name="archive" value="TightVncViewer.jar" />
<param name="mayscript" value="true" />
Java failed to load
</object>
classid,用于问题中的IE,找到用户安装的最高版本的java版本。如果找到的版本小于1.6,则codebase属性会提示用户下载1.6。但是,如果最新版本为1.7,则可能会错过安全错误修正,因此提示使用最新版本不是更好。
从java插件1.5.0_06(2005年12月)开始,无论如何都会自动选择最高用户安装的java版本。因此,问题中使用的classid在2011年似乎有点无关紧要。无论代码库是否可以自行运行,我都不知道。
在HTML4中,classid和codebase对象属性应该表示实现位置(例如applet本身),而不是java版本。所以IE系统看起来完全不标准。
在HTML5中,classid和codebase属性已过时。
使用“code”属性或参数不会出现在HTML4对象规范中,也不会出现在HTML5中。
无法在IE8或FF5中使用HTML4 / 5“数据”属性。
总而言之,它看起来是一个混乱,并且毫不奇怪,oracle建议使用已弃用的旧applet标记而不是object标记。