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

prototype确实实用

阅读更多
今天解决一个bug时花了很长时间分析定位。

起因是我们自己写了一个tab函数,用来支持网页上分tab显示内容,可以局部更新,支持缓存和刷新。
但是后来发现,refresh content的时候采用AJAX方式取数据,而数据中的js脚本并不会执行。一开始不知道为什么会这样,我一直以为只要设置innerHTML就会执行包含的js,单独写了两个页面用prototype的Ajax.updater试验,也是可以执行的,真是搞不懂。
前辈教导我们,搞不定的时候读源码永远是一个好主意。于是看prototype──哦,原来如此:
javascript 代码
 
  1. update: function(element, html) {  
  2.   html = typeof html == 'undefined' ? '' : html.toString();  
  3.   $(element).innerHTML = html.stripScripts();  
  4.   setTimeout(function() {html.evalScripts()}, 10);  
  5.   return element;  
  6. },  

设置innerHTML时并不会做什么js的执行工作,其实是prototype帮我们完成了工作。真是实践中凝结的代码阿,它专门扩展了String类,添加了stripScripts和evalScripts,让我们方便许多。

嗯,看来我这个半瓶子水还是要多看看源码的。
分享到:
评论
7 楼 meteoric_cry 2008-08-30  
afcn0 写道
不过其setTimeout(function() {html.evalScripts()}, 10);这个10ms值得讨论,timeout就是在本次js结素后执行,难道js执行后和新innerHTML被浏览器解析完不是一回事,还有必要再延后10ms,值得讨论



  在我做过的东西中,setTimeout是解决IE中BUG的一种最简单的办法,IE遇到setTimeout就老实了,而且JS引擎到底是怎么在执行的我还不是很懂.不过加了setTimeout确实解决了问题
6 楼 mouse_xb 2008-01-10  
prototype 是做什么的?请教
5 楼 afcn0 2007-10-24  
其实感觉还是有问题的,极端点,这个Ajax.Updater是同步的,并且希望update以后执行完js后我立即看到效果,可是timeout的话你这次看结果是不可能了,只能等你js停了,它才执行,10ms主要解决应该是innerHTML的渲染应该是
4 楼 笨笨狗 2007-10-24  
也许是为了解决浏览器的某些bug吧,要不然他大可不必延迟执行。或许,是为了起一个伪线程?
3 楼 afcn0 2007-10-24  
不过其setTimeout(function() {html.evalScripts()}, 10);这个10ms值得讨论,timeout就是在本次js结素后执行,难道js执行后和新innerHTML被浏览器解析完不是一回事,还有必要再延后10ms,值得讨论
2 楼 笨笨狗 2007-10-24  
Prototype是我的js学习榜样,嘿嘿
这个自动执行js是可以通过evalScripts这个选项来控制的……
1 楼 ddh9504 2007-10-24  
fsword 写道
今天解决一个bug时花了很长时间分析定位。<br />
<br />
起因是我们自己写了一个tab函数,用来支持网页上分tab显示内容,可以局部更新,支持缓存和刷新。<br />
但是后来发现,refresh content的时候采用AJAX方式取数据,而数据中的js脚本并不会执行。一开始不知道为什么会这样,我一直以为只要设置innerHTML就会执行包含的js,单独写了两个页面用prototype的Ajax.updater试验,也是可以执行的,真是搞不懂。<br />
前辈教导我们,搞不定的时候读源码永远是一个好主意。于是看prototype──哦,原来如此:<br />
<div class="code_title">javascript 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>update:&nbsp;function(element,&nbsp;html)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;html&nbsp;=&nbsp;typeof&nbsp;html&nbsp;==&nbsp;'undefined'&nbsp;?&nbsp;<span class="string">''</span><span>&nbsp;:&nbsp;html.toString();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;$(element).innerHTML&nbsp;=&nbsp;html.stripScripts();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;setTimeout(function()&nbsp;{html.evalScripts()},&nbsp;<span class="number">10</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;element;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>},&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
设置innerHTML时并不会做什么js的执行工作,其实是prototype帮我们完成了工作。真是实践中凝结的代码阿,它专门扩展了String类,添加了<span>stripScripts和</span><span>evalScripts,让我们方便许多。<br />
<br />
嗯,看来我这个半瓶子水还是要多看看源码的。</span>
那是,这个框架博大精深

相关推荐

    prototype-1.6.0.2.js.rar

    1. **对象扩展**:Prototype扩展了JavaScript的基本对象,如Array、String、Function等,提供了许多实用的方法,使得操作更加便捷。例如,Array对象添加了`each()`方法,可以方便地遍历数组。 2. **DOM操作**:...

    使用Javascript实现超酷tooltip

    在网页设计中,Tooltip是一种非常实用的交互元素,它可以在用户将鼠标悬停在某个元素上时显示额外的信息。在HTML中,我们通常通过给元素添加`title`属性来实现基本的Tooltip效果,但这确实存在一些限制,比如不支持...

    几大原型软件开发对比

    原型软件开发对比 在软件开发过程中,原型开发工具扮演着非常重要的角色,它可以帮助开发者快速建立和...Prototype Composer是Serena公司免费提供的原型开发工具,功能确实强大,提供了基于项目管理主要流程的产出物。

    Javascript代码收藏大全1

    "Javascript代码收藏大全1"显然是一个集合了各种实用JavaScript代码片段的资源库,对于开发者来说,这样的资源非常宝贵,能够节省时间并提高工作效率。这个压缩包包含四个文档,分别命名为"Javascript代码收藏大全1....

    《软件工程专业英语》第一单元:启动软件项目——单词、短语、名词缩写、难句、备忘录的基本格式样本.pdf

    - prototype:原型或雏形,是产品设计的初期模型。 - discipline:学科,如计算机科学或软件工程。 - mythical:神话的,有时用于描述虚构或理想化的概念。 - peculiarly:特有地或特别地,强调独特性。 - epsilon:...

    JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别

    这是一个非常实用的函数,用于迭代数组或对象。在使用`jQuery.each()`遍历数组时,如果在回调函数中返回`false`,它会停止当前的迭代,相当于`break`语句,即立即退出整个循环。以下是一个示例: ```javascript var...

    跟我学习javascript的arguments对象

    JavaScript中的`arguments`对象是一个非常实用的特性,它允许开发者在函数中动态处理传入的参数,无论参数的数量是否已知。以下是对`arguments`对象的详细解释: 1. **`arguments`对象的定义** `arguments`是...

    js判断数组key是否存在(不用循环)的简单实例

    `hasOwnProperty()`方法就是一个非常实用的工具,它允许我们在不使用循环的情况下,判断对象中是否存在某个属性。 在提供的实例中,我们有一个名为`aaa`的对象,它包含了一些用数字和字符串作为键的值: ```...

    JavaScript中关于indexOf的使用方法与问题小结

    JavaScript中的`indexOf`方法是一个非常基础且实用的函数,它用于查找数组或者字符串中指定元素的位置。在字符串中,`indexOf`返回给定子字符串的第一个出现的索引;在数组中,它返回与给定值相等的元素的第一个索引...

    js的hasownproperty使用示例

    JavaScript中的hasOwnProperty方法是一个非常实用的内置对象方法,用于检查对象是否包含特定的自身属性(不包括从原型链继承的属性)。当我们需要遍历一个对象的所有属性时,通常会使用for...in循环。然而,使用for....

    javascript 利用arguments实现可变长参数

    如果你确实需要修改参数,建议将`arguments`的内容复制到一个新的数组上操作,比如使用`Array.prototype.slice.call(arguments)`: ```javascript var args = Array.prototype.slice.call(arguments); args.shift()...

    二十三种设计模式【PDF版】

    设计模式之 Prototype(原型) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 B. 结构模式 设计模式之 Adapter(适配器) 使用类再生的两个方式:组合(new)和继承(extends),这个已经在 ...

Global site tag (gtag.js) - Google Analytics