本文整理了JavaScript在Firefox与IE浏览器下的关键兼容细节。针对Firefox不支持innerText的问题,提供了textContent替代方案及document.all判断逻辑。详细说明了在Firefox中启用剪贴板写入权限的配置方法(signed.applets.codebase_principal_support),并给出了兼容多浏览器的复制代码。此外,还介绍了利用ActiveXObject在IE环境下获取客户端电脑名的实现方式及安全限制。
许多技术细节容易在开发过程中被遗忘,因此有必要将这些关键点记录下来以备查阅。
Firefox与IE的innerText兼容处理
在Firefox浏览器中,对象不支持 innerText 属性。
若尝试通过 alert() 显示 obj.innerText 的值,结果将为 undefined。
Firefox 虽然支持 innerHTML,但不支持 innerText。若需在不使用 innerHTML 的情况下实现类似功能,可参考以下代码方案。
由于Firefox不支持 document.all 对象,因此在考虑浏览器兼容性时,获取DOM元素通常推荐使用 document.getElementById('yourid')。
if (document.all) { // 判断是否为IE浏览器
// 也可通过 if(navigator.appName.indexOf("Explorer") > -1) 判断。若为IE,可设置 obj.innerText = "myText";否则,应使用 obj.textContent = "yourtext" 作为替代方案。
}
跨浏览器剪贴板复制功能实现
以下代码实现了在Firefox和IE浏览器中兼容的复制到剪贴板功能。
该函数在Firefox环境下运行时,需要修改浏览器的特定配置才能生效。
1. 打开Firefox浏览器,在地址栏输入 about:config 并回车。
2. 在配置列表中找到 signed.applets.codebase_principal_support,将其值设置为 true。
function copyToClipboard(txt) {
if(window.clipboardData)
{
window.clipboardData.clearData();
window.clipboardData.setData('Text', txt);
}
else if(navigator.userAgent.indexOf('Opera') != -1)
{
window.location = txt;
}
else if (window.netscape)
{
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
}
catch (e)
{
alert('被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true');
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip)
return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans)
return;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData('text/unicode', str, copytext.length*2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip)
return false;
clip.setData(trans, null, clipid.kGlobalClipboard);
}
return true;
}
或者使用下面这段功能相同的代码。
function CopyToClipboard(meintext) {
{
if (window.clipboardData)
{
// IE的方式
window.clipboardData.setData('Text', meintext);
}
else if (window.netscape)
{
// 这一点很重要,但官方文档中并未明确说明:
// 你需要对代码进行签名以启用此功能,或参考下方说明
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
// 创建剪贴板接口
var clip = Components.classes['@mozilla.org/widget/clipboard;1']
.createInstance(Components.interfaces.nsIClipboard);
if (!clip) return;
//alert(clip);
// 创建传输对象
var trans = Components.classes['@mozilla.org/widget/transferable;1']
.createInstance(Components.interfaces.nsITransferable);
if (!trans) return;
// 指定我们要获取的数据类型,此处为文本
trans.addDataFlavor('text/unicode');
// 为了从传输对象中提取数据,我们需要两个新对象
// 用于存储数据
var str = new Object();
var len = new Object();
var str = Components.classes['@mozilla.org/supports-string;1']
.createInstance(Components.interfaces.nsISupportsString);
var copytext = meintext;
str.data = copytext;
trans.setTransferData('text/unicode', str, copytext.length*2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip) return false;
clip.setData(trans, null, clipid.kGlobalClipboard);
}
else
{
return false;
}
alert('您已经复制: ' + meintext);
return false;
}
IE环境下获取客户端电脑名
使用JavaScript获取客户端电脑名称。
前几天在学习PHP时,希望实现获取客户端电脑名称的功能。在ASP及.NET环境下已有相关实现示例,但在PHP中一直未找到直接方法。后来在国外论坛找到了一些JavaScript代码,但这些代码仅在IE环境中运行,且必须将浏览器安全级别设置得相当低才能生效。
try {
{
var ax = new ActiveXObject('WScript.Network');
document.write('User: ' + ax.UserName + '<br />');
document.write('Computer: ' + ax.ComputerName + '<br />');
}
} catch (e) {
{
document.write('访问当前电脑名操作被拒绝' + '<br />');
}