IE 下new Date() 参数传递的问题

本文介绍了一种兼容多种浏览器(包括Internet Explorer)的日期字符串解析方法。对于不同格式的日期字符串,如“2015-11-25”或“2015-11-25 21:18:00”,提供了JavaScript函数以确保在所有现代浏览器中都能正确解析。

在除了 IE 的浏览器下,可以直接这样写:

var date = new Date("2015-11-25");
或者
var date = new Date("2015-11-25 21:18:00");

IE 下 date 会是 NaN,所以用下法替代:

function NewDate(str)
{str=str.split('-');
var date=new Date();
date.setUTCFullYear(str[0], str[1]-1, str[2]);
date.setUTCHours(0, 0, 0, 0);
return date;
}

 

同理可以加上时间:

function newDateAndTime(dateStr){
var ds = dateStr.split(" ")[0].split("-");
var ts = dateStr.split(" ")[1].split(":");
var r = new Date();
r.setFullYear(ds[0],ds[1] - 1, ds[2]);
r.setHours(ts[0], ts[1], ts[2], 0);
return r;
}
<think>首先,用户的问题是:“我想在网页中激活COM对象并传递参数 请问如何在网页中激活COM对象并传递参数”。这涉及到在网页中激活COM组件并传递参数。 从系统级指令中,我有几个关键点: - 所有行内数学表达式用$...$。 - 独立公式用$$...$$并单独成段。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,例如[^1]。 - 参考提供的引用内容,尽管它们不是直接相关的,但需要尽可能参考。 提供的引用: - [^1]: 关于激活远程对象和定义激活组。 - [^2]: 关于传递复杂对象作为参数,使用props函数模式序列化为查询参数。 - [^3]: 关于在Python中传递Selenium Webdriver参数。 用户的问题是关于在网页中激活COM对象并传递参数。COM(Component Object Model)是微软的技术,用于创建可重用的软件组件。在网页中激活COM对象通常涉及ActiveX控件或类似技术,但现代浏览器由于安全限制,可能不支持或不推荐使用。 参考引用[^1],它提到了“Activatable.exportObject(this, id, 0)”和定义激活组,这类似于COM的激活机制。引用[^2]讨论了传递复杂对象作为参数,序列化为查询参数。引用[^3]展示了在Python中传递Selenium Webdriver参数。 因此,我应该基于这些构建我的回答。核心步骤: 1. **定义激活组**:类似于引用[^1],需要设置激活参数。 2. **序列化参数**:类似于引用[^2],将参数序列化后传递。 3. **在网页中嵌入COM对象**:使用HTML的<object>标签或JavaScript。 由于COM对象在网页中通常通过ActiveX实现,但现代浏览器如Chrome、Firefox等不支持ActiveX,所以这可能只在Internet Explorer中可行。我应该提到这一点。 回答结构: - 解释在网页中激活COM对象的基本概念。 - 步骤说明如何做。 - 提供代码示例(如果可能)。 - 讨论注意事项,如安全性和浏览器兼容性。 - 生成相关问题。 使用中文回答。 步骤: 1. **激活COM对象**:在网页中,使用<object>标签指定COM对象的CLSID。 2. **传递参数**:可以通过属性或方法调用传递参数。序列化复杂对象为字符串(如JSON),然后在COM对象中解析。 3. **示例**:提供一个简单的HTML和JavaScript示例。 引用相关部分: - 在解释激活组时,引用[^1]。 - 在讨论参数传递时,引用[^2]。 最后,生成相关问题。 完整回答: - 介绍。 - 详细步骤。 - 示例代码。 - 注意事项。 - 相关问题。</think>### 在网页中激活COM对象并传递参数的指南 在网页中激活COM(Component Object Model)对象并传递参数,通常依赖于浏览器对ActiveX控件的支持(主要限于Internet Explorer)。以下步骤基于COM激活机制和参数传递原理,结合安全性和实现细节,逐步说明如何操作。核心参考引用包括:定义激活组以配置环境[^1],序列化复杂对象为查询参数以简化传递[^2],以及通过脚本接口控制对象行为[^3]。 #### 1. **理解COM激活基础** COM对象在网页中的激活需要通过HTML嵌入,并指定对象的CLSID(Class ID)。浏览器会加载并初始化该对象,但需注意: - 仅支持Internet Explorer(现代浏览器如Chrome、Firefox因安全限制已弃用ActiveX)。 - 用户需降低IE安全设置或添加受信任站点(高风险操作,不推荐在生产环境使用)。 - 激活过程涉及创建“激活组”(activation group),用于定义安全策略和运行时参数,确保对象在隔离环境中运行[^1]。 #### 2. **步骤:激活COM对象并传递参数** 以下是实现的关键步骤,结合参数传递的最佳实践: **步骤1: 定义激活组(Activation Group)** 激活组是COM对象激活的基础配置,指定安全策略、身份验证和参数传递方式。在网页脚本中,需通过JavaScript或VBScript初始化: - 设置安全策略:例如,允许对象执行特定操作。 - 传递公共参数:如超时时间或默认值。 ```javascript // 示例:在JavaScript中模拟激活组设置 try { var activationGroup = new ActiveXObject("Activatable.ActivationGroup"); activationGroup.setSecurityPolicy("low"); // 降低安全策略(仅测试用) activationGroup.exportObject("myCOMObject", "{CLSID-HERE}", 0); // 0表示无额外标志 } catch (e) { console.error("激活失败: " + e.message); } ``` 此步骤确保对象在可控环境中加载[^1]。 **步骤2: 嵌入COM对象并传递简单参数** 使用HTML `<object>` 标签嵌入COM对象,并通过属性直接传递简单参数(如字符串、数字): ```html <object id="myCOMObj" classid="clsid:Your-CLSID-Here" width="0" height="0"> <param name="param1" value="简单参数值" /> </object> ``` - `classid`:替换为COM对象的实际CLSID(需在系统注册)。 - `<param>` 标签:用于传递键值对参数,对象初始化时自动接收。 **步骤3: 传递复杂参数(序列化与解析)** 对于复杂对象(如数组或自定义结构),参考引用[^2]的建议,序列化为查询字符串(query string),然后在COM对象内部解析: - **序列化参数**:使用JavaScript将对象转换为字符串。 - **调用COM方法**:通过脚本接口传递序列化后的参数。 ```javascript // 序列化复杂对象为查询字符串(例如:{name: "test", id: 123} -> "name=test&id=123") function serializeParams(obj) { return Object.keys(obj).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]) ).join('&'); } // 激活对象后传递参数 var comObj = document.getElementById("myCOMObj"); var complexParams = { data: "示例数据", count: 10 }; var serializedParams = serializeParams(complexParams); // 调用COM对象的方法(假设对象有processData方法) try { comObj.processData(serializedParams); // COM对象内部解析字符串 } catch (e) { alert("参数传递错误: " + e.message); } ``` 此方法避免直接传递对象,提升兼容性[^2]。 **步骤4: 通过脚本控制对象(可选)** 参考引用[^3]的Webdriver示例,可使用脚本动态操作对象: ```javascript // 等待对象加载完成(类似Selenium的WebDriverWait) function waitForCOMObjectReady(obj, timeout) { var start = new Date().getTime(); while (!obj.isReady) { // 假设对象有isReady属性 if (new Date().getTime() - start > timeout) { throw new Error("对象加载超时"); } } } // 使用示例 waitForCOMObjectReady(comObj, 5000); // 等待5秒 comObj.executeAction(serializedParams); // 执行自定义操作 ``` #### 3. **注意事项与安全性** - **浏览器兼容性**:仅IE支持;其他浏览器需使用替代方案(如Web Assembly或服务器端COM调用)。 - **安全风险**:ActiveX易受恶意攻击,务必在测试环境中操作,并避免传递未经验证的用户输入。 - **参数验证**:在COM对象内部,解析序列化参数时需检查数据类型和范围,防止注入攻击。 - **备选方案**:对于现代网页,考虑REST API或JavaScript库(如Electron)替代COM,以规避兼容性问题。 #### 4. **完整示例** 以下是一个简化的HTML页面示例,激活一个虚构的COM对象并传递参数: ```html <!DOCTYPE html> <html> <head> <title>COM对象激活示例</title> <script> function initCOMObject() { try { // 定义激活组(模拟) var activationGroup = new ActiveXObject("Activatable.ActivationGroup"); activationGroup.setSecurityPolicy("low"); activationGroup.exportObject("dataProcessor", "{12345678-1234-1234-1234-1234567890AB}", 0); // 获取COM对象 var comObj = document.getElementById("comObj"); // 传递序列化参数 var params = { input: "用户数据", mode: "high" }; var serialized = Object.keys(params).map(k => k + '=' + params[k]).join('&'); comObj.process(serialized); // 调用COM方法 alert("COM对象激活成功,参数已传递!"); } catch (e) { alert("错误: " + e.message); } } </script> </head> <body onload="initCOMObject()"> <object id="comObj" classid="clsid:12345678-1234-1234-1234-1234567890AB" width="0" height="0"> <param name="defaultMode" value="normal" /> </object> </body> </html> ``` ### 相关问题 1. 如何在现代浏览器中替代COM对象实现类似功能? 2. COM对象激活失败时如何调试和排查原因? 3. 如何安全地在企业内部网中使用网页COM对象? 4. 序列化参数时如何处理特殊字符或二进制数据? [^1]: 激活组定义了启动远程对象所需的公共参数和安全策略,确保对象在隔离环境中运行。 [^2]: 复杂对象序列化为查询字符串可简化参数传递,需在接收端解析以还原数据结构。 [^3]: 通过脚本接口(如Webdriver)控制对象行为,适用于动态参数传递和异步操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值