最近在做个相册,把它做成全 Ajax 型似乎不错,反正该死的搜索引擎也不可能来搜索我的图片资源。但在制作过程中遇到了一个问题。
<span class="albumManage">
<span class="albumManageEdit"><a id="edit_<%# DataBinder.Eval(Container.DataItem, "id")%>" href="#">编辑</a></span>
<script type="text/javascript">
var editID = '<%# DataBinder.Eval(Container.DataItem, "id")%>';
new Ajax.InPlaceEditor(editID, $('post_' + editID), '../ManagementCenter/PhotoCenter/SaveAlbumName.aspx', {
externalControl: 'edit_' + editID,
ajaxOptions: {method: 'post'}
});
</script>
</span>
于是我编写了一个函数:
new Ajax.InPlaceEditor(objID, $('post_' + objID), '../ManagementCenter/PhotoCenter/SaveAlbumName.aspx', {
externalControl: 'edit_' + objID,
ajaxOptions: { method: 'post' }
});
}
我试着用通俗的语言描述一遍,以便初学者也能看懂:
简单来说就是在 A页 用 XmlHttp 这个内置对象异步读取 B页 的内容,读取完成后把得到的内容用 innerHTML 方法填充到 A页 中的某个元素,比如一个 div 中,但是 B页 返回的内容中包含有需要立刻执行的 Javascript 脚本。
填充的脚本是不会立刻执行的,所以我用了 onclick 事件,以便在使用时激活它。问题出现了,我实现了让它执行脚本,但是 new Ajax.InPlaceEditor 显然生成了一些 onclick 事件的内容,导致每次点它都多产生了一个输入文本框。
我在做了一些试验后意识到其实它并不是需要立刻执行,而是在使用到它的时候只需要执行第一次。那么解决方法就很简单了:
提醒一点,必须先事件清空,在执行后面的事件,为什么就不用说了吧。这个问题耗费了我不少时间,为什么我一开始没有想到呢,或许我太依赖搜索引擎了,在查了大量动态载入资料后才意识到我的解决方向错了。
写这么多废话,也为了做个备份,也算个教程吧。看来以后我得灵活一点。