`
ricoyu
  • 浏览: 10184 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Pro JavaScript Techniques一处错误的代码

阅读更多

Pro JavaScript Techniques中文版256页的例子代码有误, 原版给出的例子就已经错误了
Listing A-30. Converting a Set of Links Into Plain URLs

// Convert all links to visible URLs (good for printing
// Find all <a> links in the document
var a = document.getElementsByTagName("a");
//首先这边循环不能用while, while ( a.length )只是判断a是否包含length属性, 在这边只要存在<a>元素,
//那么
document.getElementsByTagName("a") 返回一个NodeList, 即a, 同时这个NodeList包含length属性,
//这样将陷入死循环

while ( a.length ) {
  // Create a <strong> element
  var s = document.createElement("strong");
  // Make the contents equal to the <a> link URL
  // 因为用的while循环, 这边的i未定义
  s.appendChild( document.createTextNode( a[i].href ) );
  // Replace the original <a> with the new <strong> element
  // 这边的错误是replaceChild, 先不管i, 假设a[i]引用某个<a>元素
  // 那么这边的代码也应该是这么写的
a[i].parentNode.replaceChild( s, a[i] );
  a[i].replaceChild( s, a[i] );
}

以下是demo
<html>
<head>
</head>
<body>
<a href=" www.163.com ">163</a>
<a href=" www.sina.com ">新浪</a>
<script type="text/javascript">

  var a = document.getElementsByTagName( 'a');
  // 这是我修改后的代码
  for(var i=a.length-1;i>=0;i--){
      var s = document.createElement(' strong');
      s.appendChild(document. createTextNode(a[i].href))
      a[i].parentNode.replaceChild( s, a[i]);
  }
 
  /**
  var a = document.getElementsByTagName("a");
while ( a.length ) {
  // Create a <strong> element
  var s = document.createElement("strong");
  // Make the contents equal to the <a> link URL
  s.appendChild( document.createTextNode( a[i].href ) );
  // Replace the original <a> with the new <strong> element
  a[i].replaceChild( s, a[i] );
}*/
</script>
</body>
</html>

分享到:
评论
5 楼 ricoyu 2011-04-15  
<p>getElementsByTagName返回的确实是一个live NodeList, 注意不是LiveNodeList, 没有这个对象的, 所谓的live NodeList我的理解是这个NodeList会随着文档中DOM的变化而实时地得到更新.<br>就像我的例子, getElementsByTagName("a")返回一个包含&lt;a&gt;元素的的NodeList, 然后将里面的&lt;a&gt;元素替换成&lt;strong&gt;, 这时候这个NodeList就不断的缩小, 当全部&lt;a&gt;元素被替换成&lt;strong&gt;元素时, a.length也就等于0了, 因为javascript是弱类型的, 所以此时while(a.length) == while(0) == while(false), 即跳出循环.<br>这个问题我确实没有考虑到, 大牛毕竟是大牛<img src="/images/smiles/icon_biggrin.gif" alt=""></p>
<p> </p>
<pre name="code" class="html">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;W3C DOM tests - NodeList&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a href=" www.163.com "&gt;163&lt;/a&gt;
&lt;a href=" www.sina.com "&gt;新浪&lt;/a&gt;
&lt;script type="text/javascript" &gt;
var a = document.getElementsByTagName("a");
alert('a.length before replace: '+a.length);
while ( a.length ) {
  var s = document.createElement("strong");
  s.appendChild( document.createTextNode( a[0].href ) );
  //看看替换的元素也是a元素时这个NodeList会不会缩减
  //var s = document.createElement('a');
  //a.href = a[0].href;
  a[0].parentNode.replaceChild( s, a[0] );
  alert('a.length after replace: '+a.length);
}
alert(a.length == false);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
 
<p>再给出一个例子, 下面的代码会陷入无限循环:</p>
<p> </p>
<pre name="code" class="js">var divs = document.getElementsByTagName("div");
for (var i=0; i &lt; divs.length; i++){
  var div = document.createElement(“div”);
  document.body.appendChild(div);
}</pre>
<p> divs会随着document.body.appendChild(div)而得到更新</p>
4 楼 int08h 2011-04-14  
好吧,你是从后到前的逆循环,那确实你的代码也没问题……
3 楼 int08h 2011-04-14  
同时我认为你的代码才是有问题的,会导致某些a元素没有被转成strong
不知你有没有试过这段代码
当然书中的代码确实有错误:
1、循环体里应该始终是a[0]而不是a[i],这里根本没有i
2、最后是a[0].parentNode.replaceChild,而不是直接对a[0]调用replaceChild

只不过错误不是你说的while的问题
2 楼 int08h 2011-04-14  
真的吗?getElementsByTagName('a')返回的NodeList称为LiveNodeList,即会根据DOM当前的状态有所变化
在循环中,有把a使用strong替换的逻辑,即这个a元素会消失,一但a元素从DOM中移除,那么他在这个NodeList中也会消失,导致list.length减1
最后这个length会变成0,因此我认为这个代码没有错误
1 楼 gwj41 2011-04-14  
总结的不错,受益非浅啊,谢谢LZ的分享

相关推荐

    pro javascript techniques.pdf Modern JavaScript

    《Pro JavaScript Techniques》是一本面向现代专业Web开发者的高级JavaScript技术书籍,由知名开发者John Resig编写。本书聚焦于实际工作中的JavaScript技巧与最佳实践,旨在帮助读者深入理解和掌握这门语言的核心...

    Pro JavaScript Techniques, 2nd Edition

    《Pro JavaScript Techniques, 2nd Edition》是一本深入探讨JavaScript编程技术的专业书籍,旨在帮助开发者提升JavaScript编程技能,实现更高效、更具交互性的Web应用。该书的第二版结合了最新的JavaScript特性,如...

    Pro JavaScript Techniques(jQuery之父作品:精通Javascript英文原版+源码)

    《Pro JavaScript Techniques》是John Resig,也就是jQuery之父的作品,这本书深入探讨了JavaScript编程的各种高级技巧和实用方法。本书的出版商是Apress,它并非普通的扫描版,而是高质量的原版电子书,旨在为读者...

    Pro JavaScript Techniques, Second Edition

    ### 《Pro JavaScript Techniques, 第二版》关键知识点解析 #### 一、专业JavaScript技术概览 本书《Pro JavaScript Techniques, 第二版》为读者提供了当前JavaScript状态的专业概述,特别是对于那些希望深入了解...

    Apress - Pro JavaScript Techniques -2007.pdf

    综上所述,《Pro JavaScript Techniques》是一本非常有价值的JavaScript高级编程指南,它不仅能够帮助开发者深入理解JavaScript的核心概念和技术,还提供了丰富的实践经验和优化技巧,对于想要提升自己JavaScript...

    Pro JavaScript Techniques

    《Pro JavaScript Techniques》是JQuery作者的一本经典著作,它深入探讨了JavaScript这一重要的Web开发语言,涵盖了从基础到高级的各种技巧和最佳实践。这本书旨在帮助开发者提升JavaScript编程能力,优化网页性能,...

    Pro JavaScript RIA Techniques

    **标题解析:** "Pro JavaScript RIA Techniques" 这个标题指的是关于专业级JavaScript富互联网应用(Rich Internet Applications,简称RIA)的技术方法。这通常涵盖了使用JavaScript构建高性能、交互性强的Web应用...

    Apress.Pro.JavaScript.Techniques.Dec.2006

    《Apress.Pro.JavaScript.Techniques.Dec.2006》是一本专注于JavaScript技术的专业书籍,出版于2006年12月。这本书旨在帮助读者深入理解和掌握JavaScript这一编程语言,是学习JavaScript的优秀资源。书中涵盖了...

    Apress.Pro.JavaScript.Techniques.Dec.2006.rar

    在"Apress.Pro.JavaScript.Techniques.Dec.2006"这本书中,作者深入浅出地探讨了JavaScript的各种技术,旨在帮助读者提升JavaScript编程技能。 首先,JavaScript的基础知识包括变量、数据类型、运算符、流程控制...

    pro-javascript-techniques:John Resig的“ Pro JavaScript Techniques”的源代码-java source code

    Apress源代码 该存储库随附John Resig的 (Apress,2007年)。 使用绿色按钮将文件下载为zip格式,或使用Git将存储库克隆到您的计算机上。 发行版 版本v1.0对应于已出版书籍中的代码,没有更正或更新。 会费 请参阅...

    Pro[removed]《Pro Javascript Techniques,Second Edition》 读书笔记

    《Pro Javascript Techniques,Second Edition》 读书笔记 第三章,创建可重用代码 shim和polyfill 在JavaScript的世界里,有两个词经常被提到,shim和polyfill.它们指的都是什么,又有什么区别? 一个shim是一个库,它将...

    精通JavaScript

    《精通JavaScript》(Pro JavaScript Techniques ) 源代码

    Pro Zend Framework Techniques Build a Full CMS Project code 代码

    "Pro Zend Framework Techniques Build a Full CMS Project code 代码" 这个标题和描述揭示了我们正在探讨一个使用 Zend Framework 框架构建的全功能内容管理系统(CMS)项目。这个项目提供了实际的源代码,旨在帮助...

    pro-javascript-ria-techniques:支持 Apress 书籍“Pro JavaScript RIA 技术”的代码清单

    专业 JavaScript RIA 技术:最佳实践、性能、演示作者:Den Odell ISBN 9781430219347 源代码发布 - 版本 1.6 2010 年 12 月 17 日更新 - 版本 1.6 修复: 第 2 章,清单 2-14,更新了 getPosition 方法以正确返回...

Global site tag (gtag.js) - Google Analytics