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