诡异的A标签

本文深入探讨HTML中A标签的使用陷阱,包括this指向、javascript函数调用及事件顺序执行,通过实例揭示浏览器间差异。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>诡异的A标签</title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script>
//关于this
function dododo(src){
alert(src==window);
}
function hrefOrClick(val){
alert(val);
}
</script>
</head>
<body>
<a href="javascript:dododo(this)">dododo</a><br/>
<a href="javascript:!function(){}">取个反试试</a>(注意浏览器之间的不同哦)<br/>
<a href="javascript:hrefOrClick('href')" onclick="hrefOrClick('click')">猜猜先执行哪个?</a><br/>
</body>
</html>



上文中一共三处A标签:
第一个在对href属性进行设置执行javascript函数时,这时会有个陷阱,当你传入this时,或得到的却是Window对象.
第二个A标签没太大意义,在IE,FF下执行时页面会跳转到空白,并且只有一个false,谷歌浏览器没反应,Opera没装,所以不知道,希望回帖者可以把结果奉上。
第三个只是为了告诉大家href标签属性和click事件的执行顺寻而已。

献丑了
提供了一个基于51单片机的RFID门禁系统的完整资源文件,包括PCB图、原理图、论文以及源程序。该系统设计由单片机、RFID-RC522频射卡模块、LCD显示、灯控电路、蜂鸣器报警电路、存储模块和按键组成。系统支持通过密码和刷卡两种方式进行门禁控制,灯亮表示开门成功,蜂鸣器响表示开门失败。 资源内容 PCB图:包含系统的PCB设计图,方便用户进行硬件电路的制作和调试。 原理图:详细展示了系统的电路连接和模块布局,帮助用户理解系统的工作原理。 论文:提供了系统的详细设计思路、实现方法以及测试结果,适合学习和研究使用。 源程序:包含系统的全部源代码,用户可以根据需要进行修改和优化。 系统功能 刷卡开门:用户可以通过刷RFID卡进行门禁控制,系统会自动识别卡片并判断是否允许开门。 密码开门:用户可以通过输入预设密码进行门禁控制,系统会验证密码的正确性。 状态显示:系统通过LCD显示屏显示当前状态,如刷卡成功、密码错误等。 灯光提示:灯亮表示开门成功,灯灭表示开门失败或未操作。 蜂鸣器报警:当刷卡或密码输入错误时,蜂鸣器会发出报警声,提示用户操作失败。 适用人群 电子工程、自动化等相关专业的学生和研究人员。 对单片机和RFID技术感兴趣的爱好者。 需要开发类似门禁系统的工程师和开发者。
<think> 嗯,用户遇到了Android Studio编译时更改不立即生效的问题,第一遍编译没带上修改,第二遍才生效。这确实是个常见的痛点,用户可能刚接触安卓开发,从引用[1]能看出ta是新手,正在摸索TensorFlow Android demo的编译。 用户提供的三个引用很有价值:引用[1]说明ta的环境是全新的,引用[2]提到Apply Changes功能,引用[3]则涉及原生代码编译流程。结合这些线索,核心问题应该是增量更新机制和编译缓存之间的冲突。 深层分析可能有几个关键点:首先是Instant Run/Apply Changes的工作机制,这个功能本就依赖差异比对,第一次编译可能还在构建基础状态;其次是C++层面的特殊问题,引用[3]提到需要专门编译so库,如果用户修改了JNI代码,则必须完整重编;最后是Gradle的缓存策略,特别是跨模块依赖时的缓存同步延迟。 用户可能没意识到自己操作的细节很重要,比如是否修改了资源文件、是否清理过工程、是否用了--android-studio参数编译原生代码。在回复时需要引导ta确认这些关键点。 考虑到用户是初学者,解释时要避免术语堆砌。把Apply Changes比作"热补丁",缓存机制类比"流水线作业"应该更易懂。重点突出三个最可能的原因:Apply Changes的限制、原生代码的特殊性、Gradle缓存同步,这样用户能快速对照自己的操作场景。 安全方面要提醒备份工程,引用[3]提到命令行编译更小的细节也可以作为补充建议。最后列出的排查步骤需要明确操作路径,比如"Build > Rebuild Project"这样的具体菜单位置,这对新手很必要。 </think> Android Studio编译时出现第一遍编译未应用代码更改、第二遍才生效的情况,通常与增量编译机制和缓存同步策略有关。以下是可能的原因及解决方案: --- ### **核心原因分析** 1. **增量编译机制限制** - **Apply Changes/Run的局限性**: 当修改涉及结构性变更(如资源ID修改、方法签名变更、JNI层改动)时,Android Studio的`Apply Changes`(或旧版`Instant Run`)无法热替换,需**完整重启Activity或应用**才能生效[^2]。 ✅ *表现*:第一遍编译仅触发热部署(界面未刷新),第二遍编译触发冷启动生效。 2. **Gradle缓存未更新** - **依赖缓存未刷新**: 修改依赖库版本或模块间代码时,Gradle可能沿用旧缓存。需强制刷新: ```bash ./gradlew clean assembleDebug --rerun-tasks ``` - **构建配置缓存问题**: 启用`Settings > Build > Compiler > Configure on demand`可能导致配置延迟加载,关闭此选项可解决。 3. **原生代码(C++/JNI)的特殊性** - **未重新编译SO库**: 若修改了`JNI`或`C++`代码(如TensorFlow Lite的本地层),**必须手动执行NDK编译**(如运行`cocos compile`命令或`Build > Refresh Linked C++ Projects`)[^3]。否则首次编译只会打包旧SO文件。 ✅ *验证*:检查`app/build/intermediates/merged_native_libs`下SO文件的修改时间。 4. **资源/清单文件冲突** - **资源合并延迟**: 多模块项目中,资源ID冲突或`AndroidManifest.xml`合并错误可能导致首次构建忽略变更。 - **修复方案**: 清理构建并重建: - 菜单栏: `Build > Clean Project` → `Build > Rebuild Project` --- ### **排查流程图** ```mermaid graph TD A[修改代码后编译] --> B{更改是否生效?} B -- 否 --> C[检查改动类型] C -->|结构性变更| D[执行冷启动 Rebuild] C -->|普通代码| E[检查Apply Changes状态] E -->|功能未启用| F[开启 Settings > Build > Apply Changes] E -->|已启用| G[检查NDK/JNI改动] G -->|涉及原生代码| H[手动编译SO库] G -->|无原生代码| I[强制清理Gradle缓存] I --> J[./gradlew clean --refresh-dependencies] ``` --- ### **高频解决方案** 1. **强制冷启动**: 编译后点击 `Run` 按钮旁的 ▼ → 选择 `Cold Swap Now`(Android Studio 4.0+) 2. **禁用即时运行**: `Settings > Build > Deploy > 取消勾选 Enable Instant Run` 3. **原生代码修复**: - 执行项目特定的编译命令(如引用[3]的`cocos compile`) - 或运行: `Build > Make Module 'app'` 4. **重置缓存**: `File > Invalidate Caches / Restart → Invalidate and Restart` --- ### **根本性预防措施** - **避免混合编译方式**: 若项目含原生代码,**统一使用Android Studio或命令行编译**(引用[3]指出命令行编译APK更小,但需一致性)[^3]。 - **模块化隔离改动**: 将频繁修改的代码拆分为独立模块,减少全量编译范围。 - **监控构建输出**: 查看`Build`标签页日志,关键词:`Skipping task ':app:mergeDebugResources' (up-to-date)` 表明缓存生效。 > ⚠️ 若问题持续,检查`.idea/`和`.gradle/`目录权限,确保IDE有写入权限避免缓存失效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值