IE ->FF 摘自 jxc博客

本文详细介绍了从Internet Explorer迁移到Firefox时JavaScript和CSS的调整方法,包括DOM操作、事件处理、选择器差异及兼容性解决方案,旨在帮助开发者实现跨浏览器的稳定应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    通过firefox自带的工具学习的方法:          打开TOOLS -> dom inspector , 左侧选中某个控件后, 右侧可以选择 JAVASCRIPT OBJECT         通过自带工具调试javascript         TOOLS -> JavaScript Console                       打开所有js警告:         在地址栏里录入:about:config         双击,设置 javascript option restict  打开为true 能够看到很多警告,利于纠错                       ☆ 关于调试JS的tip        调试js时,经常受缓存的影响,页面不会加载最新的代码,为此解决如下:        在新页面里打开原来的地址,关闭原来的页面,ok了.        以上方法在IE和FF下都有效.               在ff下按Ctrl+shift+del, 打开清除私有信息对话框, 点击立即清除, 回到页面后reload一次也是可行的方案.                      ☆ IE -> firefox javascript类          △   document.all   -> document.getElementById                 并且控件尽量用id,而不是name标识                                 为了兼容旧代码,参考下面的函数, 把document.all 替换为 document_all即可                 function document_all(objName,doc){                  if (!doc) doc = document;                                    var obj;                  obj = doc.getElementById(objName);                                    if (!obj) obj = doc.getElementsByName(objName)[0];                                    return obj;                 }                                   提示:                 如果控件只有name,没有id, 用getElementById时:                     IE:也可以找到对象                     FF:返回NULL          △   获得form里某个元素的方法                 formObj.elements['user_ name'];                   △   取集合元素时, ie支持  [],() 2种写法, 但是ff仅支持[],如:                 table.rows(5).cells(0)                 改为:                 table.rows[5].cells[0]                            △   判断对象是否是object的方法应该为                 if( typeof  对象变量 == "object")                 而不是 if(对象变量 == "[object]")                          △     eval(对象名称)    ->  document.getElementById                                 FF支持eval函数                            △     通过id直接调用对象                   对象id.value = ""                   改为                   document.getElementById("name").value = ""                                                              △     不支持onpropertychange事件                   △     obj.insertAdjacentElement("beforeBegin",objText);                  改为用                 obj.parentNode.insertBefore(objText,obj);                      △     createElement不支持HTML代码                   用document.write(esHTML); 可以解决一部分情况                            △     innerText -> textContent                   △     对象名称中的$不能识别, 建议改为_                   objName = "t1$spin"                   改为                   objName = "t1_spin"                            △     事件名称和注册方式的变化                     addEventListener("blur", myBlur, false);                    △      FF里设置Attribute为某个对象,然后再取出来,这时候对象的属性都丢失了?                  objText.setAttribute("dropdown_select",obj);                  alert(obj.id)   //正确的名字                  obj = objText.getAttribute("dropdown_select");                  alert(obj.id) //null                                     在IE下没有问题, FF对setAttribute来说,第2个参数都是字符串型的!!!                   所以如果第2个参数是对象时,相当于调用对象的 toString() 方法了                                     解决的方法是用下面的调用方式:                   objText.dropdown_select = obj;                                     obj = objText.dropdown_select                                             △      className -> class                   FF下用class代替IE下的className                   由于class是关键字, 所以需要用 setAttribute/getAttribute才行                   setAttribute("class","css样式名称");                 △      在html里定义的属性,必须用getAttribute才行                                      获取时:                   document.getElementByID("TD1").isOBJ  总返回 undefined, IE下是可以的                   应该用:                   document.getElementByID("TD1").getAttribute("isOBJ")                                                 △      FF里select控件不再是:总是在顶端显示                   所以需要设置控件的zIndex                 △      对于if ( vars == undefined ) 下面的值用于判断是等同的                    undefined                    null                    false                    0                         △      如果FF调用obj.focus(); 报错,请尝试改为:                     window.setTimeout( function(){ obj.focus(); }, 0);          现在的方案是在失去焦点前判断        △       关于在控件的blur事件里判断下一个获得焦点的控件的tip, 类似于Powerbuilder的item focus changing事件                   用途举例: 对dropdown控件里的text控件,                   如果下一个获得焦点的对象是selection,则不做录入控制,如果不是,则提示,并设置焦点为text                                     经测试:                   IE: blur发生在focus后                   FF: blur发生在focus前调用                                                       IE: 在onbeforedeactivate事件里用activeElement可以获得下一个对象                                     FF: blur事件发生在focus前面,而FF又没有中间事件                     下面的都不行!                     target                     currentTarget                     relativeTarget                                         看来需要这样处理!                     注册所有控件的onblur,设置lastElement                     在focus里处理上一个? 也不行啊!                                         能否模拟自己的itemfocuschanging事件?                     IE: onbeforedeactivate                     FF: 抢先注册onfocus和onblur, 在里面设置activeElement                           在onfocus里设置activeElement后,                           调用onbeforedeactivate                           如果onbeforedeactivate返回false,则设置focus为原来的控件!                                                               在控件失去焦点前,设置lastObj=this                   在控件获得焦点时,先判断lastObj是什么                                                                                                                              △       FF不能处理alert造成的死循环情况                            △       FF下,keyCode是只读的, 那把回车转换为tab怎么办? 在录入时进行转换怎么办??                                     变通的方法是:                   1. 回车跳转 -> 自己写跳转处理代码.                   2. 在能够录入的控件里,                       把选中的部分替换为新录入的内容: var text = String.fromCharCode(event.keyCode);                       同时阻止按键事件上传, 调用: event.preventDefault()                                            △       selection的难度较大,因为IE和FF没有接近的函数                   为此专门做了一个对象来消除差异                   感觉firefox的selection机制使用起来更简洁一些                                     这种模式是桥梁模式还是                                            △        会被firefox解释为提交form或者刷新页面???                   需要写标准                            △       在firefox里, document.onfocus里获得不到实际获得焦点的控件?                   为什么document.keydown可以呢?                          △       children    -> childNode()                      △       sytle.pixelHeight -> style.height               △       obj.attachEvent("onfocus", editmask_focus);           obj.onfocus = editmask_focus;                   上面2句竟然有区别!                    如果用 attachEvent, 就不能用 this 关键字了!                   通用的做法是不用this, 而是用 event.srcElement                          △       fireevent不能用               △       onpropertychange    -> oninput               △       判断函数或者变量是否存在                 IE: if (funcName)   funcName();                     if (varName == undefined)   varName=1;                                     FF: if (window.funcName)    funcName();                     if (window.varName == undefined)   varName=1;                                 即前面要加 window.         ☆ IE -> firefox css类         △ cursor:hand  ->  cursor:pointer                                         △ expression  firefox不支持          在IE下expression也非常消耗CPU,所以不应该使用!!          为了达到较好的效果,应该建立自己的expression to javascript的处理函数          这样在IE和FF里就都能用了.         △ FILTER  firefox不支持             filter: Alpha(Opacity=50);          替换为          -moz-opacity: 0.5;           △ text-overflow             不支持                     △ transparent             firefox下 obj.setAttribute("bgColor","#ffffff") 只支持颜色             必须用 obj.style.backgroundColor = "transparent" 才行
<think>好的,我现在需要解决用户遇到的Maven编译错误,具体是“For input string: ""”的问题,同时用户提到使用的是JDK17,可能涉及maven.multiModuleProjectDirectory、plexus-classworlds和maven-resources-plugin。首先,我需要分析这个错误的常见原因,然后结合用户的引用内容来寻找解决方案。 首先,用户提供的引用中有多个关于Maven插件版本问题的解决案例。比如引用[1]和[2]提到修改maven-resources-plugin的版本来解决打包错误,引用[4]提到升级maven-plugin-plugin版本来兼容JDK9+环境。这可能意味着当前用户的错误也是由于插件版本与JDK17不兼容导致的。 错误信息“For input string: ""”通常发生在尝试将空字符串转换为数值类型时,比如Integer.parseInt()。在Maven项目中,这可能与插件配置中的某个属性有关,该属性预期是一个数值但实际为空。例如,可能在pom.xml中引用了某个属性,但该属性未正确设置,导致解析失败。 接下来,我需要考虑用户的环境是JDK17,而高版本的JDK可能带来与旧版Maven插件的兼容性问题。例如,引用[4]中提到的maven-plugin-plugin在JDK9+下需要升级到3.15.1。类似地,maven-resources-plugin可能需要更高版本来支持JDK17。 可能的解决步骤包括: 1. 检查pom.xml中的属性是否正确设置,尤其是数值类型的属性,如资源过滤中的占位符是否有未定义或空值的情况。 2. 升级相关Maven插件,特别是maven-resources-plugin,到兼容JDK17的版本。根据引用[2],版本2.7或3.3.0可能有效。 3. 确保Maven本身的版本足够新,支持JDK17。建议使用Maven 3.8.6或更高版本。 4. 检查资源文件中的过滤符号是否正确,避免意外触发属性替换。 5. 如果存在多模块项目,确认maven.multiModuleProjectDirectory是否正确配置,或者尝试在IDE中设置MAVEN_OPTS环境变量。 另外,用户提到的plexus-classworlds可能与类加载器有关,但通常升级Maven和插件版本可以解决这类问题。需要指导用户逐步排查,从升级插件开始,再检查属性配置,最后考虑Maven版本和环境设置。</think>针对Maven项目在JDK17环境下编译时报错“For input string: ""”的问题,以下是分步解决方案: --- ### **问题分析** 该错误通常由以下原因导致: 1. **插件版本不兼容JDK17**:旧版Maven插件(如`maven-resources-plugin`)对高版本JDK支持不足,解析空字符串时触发异常[^4] 2. **属性占位符未正确配置**:资源过滤(`<filtering>true</filtering>`)中存在未赋值的占位符(如`${undefined.property}`),导致空字符串被尝试转换为数值[^3] 3. **多模块项目路径问题**:`maven.multiModuleProjectDirectory`环境变量未正确设置(常见于IDE环境)[^3] --- ### **解决方案** #### **1. 升级Maven插件版本** 修改`pom.xml`中相关插件的版本以适配JDK17: ```xml <!-- 升级maven-resources-plugin --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <!-- 或3.3.1 --> <dependencies> <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-filtering</artifactId> <version>3.3.1</version> <!-- 兼容性依赖 --> </dependency> </dependencies> </plugin> </plugins> </build> ``` *说明:高版本插件修复了JDK17下的资源过滤逻辑问题[^2][^4]* --- #### **2. 检查资源过滤占位符** 排查资源文件(如`.properties`或`.yml`)中的属性占位符: - **错误示例**:`port=${server.port}`(若`server.port`未定义则解析为空) - **修复方法**: - **方案1**:在`pom.xml`中定义默认值 ```xml <properties> <server.port>8080</server.port> <!-- 显式赋值 --> </properties> ``` - **方案2**:关闭资源过滤(不推荐) ```xml <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <!-- 关闭过滤 --> </resource> ``` --- #### **3. 配置多模块项目路径** 在IDE(如IntelliJ IDEA)中设置环境变量: - **步骤**: 1. 打开运行配置(Run/Debug Configurations) 2. 添加环境变量:`MAVEN_OPTS=-Dmaven.multiModuleProjectDirectory=$MAVEN_HOME` 3. 确保`MAVEN_HOME`指向正确路径(如`/usr/local/maven`) --- #### **4. 更新Maven版本** 使用**Maven 3.8.6+**(原生支持JDK17): - 下载地址:https://maven.apache.org/download.cgi - 验证版本: ```bash mvn -v Apache Maven 3.8.6 ``` --- ### **验证步骤** 1. 执行清理并重新编译: ```bash mvn clean compile -U ``` 2. 若仍报错,启用调试模式定位具体文件: ```bash mvn -X resources:resources ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值