由DOCTYPE造成的Javascript运行错误问题之解决方法

本文介绍了一种DOCTYPE声明导致JavaScript脚本失效的问题,并提供了解决方案。通过修改代码中的scrollTop属性引用,可以使浮动层正常工作。

      每个标准的网页最顶部都有

这段话,但是有时它会造成你的Javascript脚本不执行,怎么解决呢?当然删掉这句话是可以解决的,但那样肯定不是最好的解决方法。

DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本。其中的DTD(例如上例中的xhtml1- transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

下面这段代码是制作一个网页对联式浮动层的:

 

      但是一旦执行它,你会发现这个浮动层并不会move,也就是说里面的Javascript并没有完成应有的作用。此时,我们的解决方法有两种:一种是删掉DOCTYPE这句。但是如果你的页面使用了css(尤其是960网格系统等css框架),就会发现此时你的页面布局全部都混乱了。第二种方法是将上段代码里的document.body .scrollTop 改写为document.documentElement .scrollTop ,浮动层又开始听话啦~

      下面简要介绍一下DTD声明方式:

      XHTML 1.0 提供了三种DTD声明可供选择:

  • 过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。完整代码如下:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  • 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如<br>。完整代码如下:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD。完整代码如下:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

 

      理想情况应选用严格的DTD,但对于大多数新手程序员来说,过渡的DTD(XHTML 1.0 Transitional)是最佳选择。因为这种DTD允许使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。


最后支持一下曹操墓打假~不管真假,质疑才是对真相的负责

<think>首先,用户查询的是:控制JavaScript中setInterval运行和关闭的方法。根据系统指令,我需要使用中文回答,确保LaTeX语法正确(即行内数学表达式用$...$,独立公式用$$...$$),结构清晰,逐步解决问题,并生成相关问题。 回顾引用内容: - 引用[1]和[2]提到setInterval()会不停地调用函数,直到clearInterval()被调用或被清除。 - 引用[3]详细解释了setInterval()和setTimeout()的区别,setInterval()用于周期性调用,clearInterval()停止它。 - 引用[4]介绍了setTimeout()的基本用法。 - 引用[5]展示了如何使用clearInterval()来停止setInterval,特别是在AJAX请求中。 用户的问题是:控制setInterval运行和关闭的方法。所以,核心是: - 运行:使用setInterval()函数。 - 关闭:使用clearInterval()函数。 关键点: - setInterval()接受两个参数:要执行的函数或代码字符串(但推荐使用函数以避免eval风险),以及时间间隔(毫秒)。 - 它返回一个ID,用于后续清除。 - clearInterval()接受这个ID作为参数,停止定时器。 我的回答结构: 1. **介绍setInterval()的运行**:解释如何启动周期性的函数调用。 2. **介绍clearInterval()的关闭**:解释如何停止它,使用提供的ID。 3. **示例代码**:提供简单的JavaScript代码示例来演示启动和停止。 - 类似于引用中的示例。 4. **注意事项**:比如使用函数而非字符串,避免内存泄漏等。 5. **生成相关问题**:在结尾添加相关问题。 确保回答真实可靠:基于引用内容,这是标准JavaScript知识。 语言:全程中文。 生成相关问题:至少3个,基于主题。 最终输出格式: - 回答部分:清晰、逐步。 - 相关问题:以“§§相关问题§§”开头,然后编号列表。 - 引用标识:如果直接引用参考,末尾添加如[^1],但用户提供的引用是参考站内,我应该参考它们。 在回答中,如果需要直接引用参考内容,自然地添加引用标识。例如,解释时可以说:"如引用[3]所述,setInterval()会不停地调用函数,直到clearInterval()被调用。" 但保持回答原创,基于知识。 大纲回答: - **步骤1:启动setInterval** - 语法:`var timerId = setInterval(function, interval);` - 解释参数。 - **步骤2:停止setInterval** - 语法:`clearInterval(timerId);` - 解释作用。 - **示例代码** - 一个完整示例,如计数到某个值停止。 - **注意事项** - 使用函数而非字符串。 - 确保ID存储正确。 - **相关问题** - 生成3个相关问题。 相关问题想法: 1. setInterval和setTimeout的区别是什么? 2. 如何防止setInterval导致的内存泄漏? 3. setInterval在异步操作中的最佳实践? 这些都是基于主题。 </think>### JavaScript中控制setInterval运行和关闭的方法JavaScript中,`setInterval` 和 `clearInterval` 是用于控制周期性函数运行和停止的核心方法。以下是详细的步骤解释和示例,确保您能安全高效地使用它们。回答基于标准JavaScript实践,并参考了提供的引用内容[^3][^5]。让我们一步步来: #### 1. **启动setInterval(运行方法)** - **作用**:`setInterval` 用于周期性调用函数或执行表达式,它会无限重复,直到被手动关闭。 - **语法**: ```javascript var timerId = setInterval(function, milliseconds); ``` - `function`:要执行的函数(推荐使用函数引用,而非字符串,以避免安全风险如eval)。 - `milliseconds`:调用间隔时间,单位为毫秒(例如,1000毫秒=1秒)。 - `timerId`:返回的唯一标识符,用于后续停止定时器。 - **示例**:启动一个每500毫秒计数并更新标题的定时器。 ```javascript var counter = 0; function updateTitle() { document.title = "计数: " + counter; counter++; if (counter >= 5) { // 计数到5时停止 clearInterval(timerId); } } var timerId = setInterval(updateTitle, 500); // 每0.5秒执行一次 ``` - 这里,`timerId` 存储了定时器ID,便于在需要时停止[^1][^3]。 #### 2. **停止setInterval(关闭方法)** - **作用**:`clearInterval` 用于立即停止由 `setInterval` 启动的定时器。 - **语法**: ```javascript clearInterval(timerId); ``` - `timerId`:必须是之前 `setInterval` 返回的ID。 - **关键点**: - 调用 `clearInterval(timerId)` 后,定时器立即终止,函数不再执行。 - 通常在条件语句(如计数达到阈值)或事件处理(如按钮点击)中调用。 - **示例**:结合HTML按钮手动停止定时器。 ```html <button onclick="startTimer()">开始</button> <button onclick="stopTimer()">停止</button> <script> var timerId; function startTimer() { var i = 0; timerId = setInterval(function() { console.log("运行中: " + i); i++; }, 1000); // 每秒执行 } function stopTimer() { clearInterval(timerId); // 停止定时器 console.log("定时器已停止"); } </script> ``` - 此代码展示了如何通过按钮事件控制定时器的启动和关闭。参考引用[^5],类似方法常用于异步操作如AJAX轮询中。 #### 3. **实用注意事项** - **避免使用字符串参数**:如引用[^3]所述,不推荐 `setInterval('func()', 1000)`,因为它隐含 `eval()` 风险。使用函数引用更安全(例如 `setInterval(func, 1000)`)。 - **作用域管理**:确保 `timerId` 在全局或适当作用域声明,以便 `clearInterval` 能访问它。否则,会导致无法停止定时器。 - **内存泄漏防范**:如果忘记调用 `clearInterval`,定时器会持续运行,浪费资源。在页面卸载时(如 `window.onbeforeunload`)添加清除逻辑。 - **与setTimeout的区别**:`setInterval` 是周期性执行,而 `setTimeout` 只执行一次(引用[^3])。如果需要模拟循环,可用递归 `setTimeout`,但它不自动停止。 - **最佳实践**: - 在异步任务(如AJAX)中,像引用[^5]所示,在回调函数中调用 `clearInterval` 来响应服务器结果。 - 测试时添加日志:`console.log` 帮助调试定时器状态。 #### 4. **完整示例代码** 以下是一个完整的HTML示例,演示控制setInterval的运行和关闭: ```html <!DOCTYPE html> <html> <body> <p id="display">0</p> <button onclick="startInterval()">开始计数</button> <button onclick="stopInterval()">停止</button> <script> var timerId = null; var count = 0; function startInterval() { if (timerId !== null) { clearInterval(timerId); // 确保先停止旧定时器 } count = 0; timerId = setInterval(() => { document.getElementById('display').textContent = count; count++; }, 1000); // 每秒更新 } function stopInterval() { if (timerId !== null) { clearInterval(timerId); timerId = null; document.getElementById('display').textContent = "已停止"; } } </script> </body> </html> ``` - 运行此代码:点击“开始计数”启动定时器,点击“停止”关闭它。这避免了常见错误,如ID未初始化或重复启动[^1][^5]。 通过以上方法,您可以灵活控制 `setInterval` 的生命周期。如果您有具体场景(如AJAX集成),提供更多细节可进一步优化解答[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值