2020-09-24

作者参考代码做放大镜练习时,JS运行报错“Cannot set property ‘onmouseenter’ of null”。经分析,是因JS引入位置问题,浏览器先加载节点再执行JS,解析时找不到绑定节点致报错。解决办法是在head或外部js头部引入window.onload函数,放入预加载内容。

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

Cannot set property ‘onclick’ of null 问题

昨晚打算参考老陈代码做一个放大镜练手,刚开始发现js就运行不了,出师不利,搞得我很烦

看代码

<body>
            <div class="fdj">
                <div class="left">
                <div class="zhezhao"></div>
                </div>
                <div class="right"></div>
            </div>
</body>

外部引入js

var left =document.querySelector(".left");
    var zhezhao= document.querySelector(".zhezhao");
left.onmouseenter = function(){
    zhezhao.style.display = "block";
 }

发现页面鼠标移入div-left没有效果,打开控制台看到Cannot set property ‘onmouseenter’ of null at index.js:2而老陈代码演示的代码却完美运行,代码如下:

             <div class="fdj">
                <div class="left">
                <div class="zhezhao"></div>
                </div>
                <div class="right"></div>
              </div>
              <script type="text/javascript">
                  var left =document.querySelector(".left");
                  var zhezhao= document.querySelector(".zhezhao");
                  left.onmouseenter = function(){
                   zhezhao.style.display = "block";
                    }
              </script>              

而当我不甘失败,又将外部js写到head标签中,还是报错,这是为什么呢?

可以发现,我与演示代码的区别仅在js引入的位置不同,可就是因为这个位置,导致了我的错误。
因为浏览器先加载完节点再执行JS,所以当浏览器自顶向下解析时,找不到onmouseenter绑定的节点,也就是将onmouseenter设置为null,于是报错。
解决方法:
仅要在head头部或者外部js头部引入window.οnlοad=function(){},将需要预加载的内容放入此函数中即可。例如:

window.onload=function(){
    var left =document.querySelector(".left");
    var zhezhao= document.querySelector(".zhezhao");
left.onmouseenter = function(){
    zhezhao.style.display = "block";
 }
}
<think>好的,我需要帮助用户编写一个SQL查询,从solution表中查找满足max_code_lines大于500且submit_time为'2020-09-24'的题号(problem_id)和avg_memory字段。首先,我应该回忆基本的SQL语法结构,特别是SELECT语句的用法。 用户的需求是选择特定条件下的数据,所以需要使用WHERE子句来过滤记录。条件有两个:max_code_lines > 500和submit_time = '2020-09-24'。这两个条件需要用AND连接起来,确保同时满足。另外,需要选择的字段是problem_id和avg_memory,所以SELECT后面跟着这两个字段名。 接下来要确认表名是否正确,用户提到的是solution表,所以FROM子句后面应该是solution。日期值需要用单引号括起来,确保SQL正确解析。还要注意大小写的问题,虽然SQL关键字通常不区分大小写,但表名和字段名是否区分取决于具体的数据库系统,但为了保险起见,建议保持与数据库中的命名一致。 然后,我需要检查是否有语法错误,比如逗号是否正确分隔字段,条件是否正确使用运算符。例如,比较运算符是>,日期字符串用单引号。可能还需要考虑性能问题,比如是否有索引在max_code_lines或submit_time上,但用户没有提到优化需求,所以基础的查询即可。 最后,组合这些部分形成完整的SQL语句,并验证是否符合用户的要求。确保查询返回的结果是problem_id和avg_memory,且只包含满足两个条件的记录。此外,是否需要排序或者限制结果数量?用户没有提到,所以暂时不需要添加。 总结一下,SQL的结构应该是: SELECT problem_id, avg_memory FROM solution WHERE max_code_lines > 500 AND submit_time = '2020-09-24'; 需要确认所有语法正确,比如逗号的位置,关键字是否正确,以及条件的逻辑是否正确使用AND。此外,日期格式是否正确,是否与数据库中存储的格式一致,例如是否包含时间部分。如果submit_time包含时间,可能需要使用日期函数来提取日期部分,比如使用DATE(submit_time) = '2020-09-24',但用户示例中直接用了等号,可能假设submit_time是DATE类型,没有时间部分,或者存储的值正好是该日期的午夜时间。如果有时间部分,可能需要调整条件,但用户提供的条件中未提及,所以按原样处理。</think>要查询满足条件的题号(`problem_id`)和平均内存(`avg_memory`),可以使用以下 SQL 语句: ```sql SELECT problem_id, avg_memory FROM solution WHERE max_code_lines > 500 AND submit_time = '2020-09-24'; ``` ### 分步说明: 1. **选择字段**:通过 `SELECT problem_id, avg_memory` 指定需要返回的字段。 2. **指定表**:`FROM solution` 表示从 `solution` 表中查询数据。 3. **设置过滤条件**: - `max_code_lines > 500` 筛选代码行数超过 500 的记录。 - `submit_time = '2020-09-24'` 限定提交时间为 2020 年 9 月 24 日。 - 使用 `AND` 连接两个条件,确保同时满足[^3]。 ### 注意事项: - 如果 `submit_time` 字段包含时间部分(如 `2020-09-24 10:30:00`),需改用日期函数提取日期部分,例如 `DATE(submit_time) = '2020-09-24'`。 - 若查询性能不足,可在 `max_code_lines` 和 `submit_time` 字段上建立索引[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值