例子
这个页面就是个例子。点击一个段落,编辑,然后点Ready。你的修改就会呈现。
问题
遇到的第一个问题是:我想用文本框作为编辑区域。一开始我却把内容放不进文本框去。读者发现Mozilla的一个警告说是只有在文本框放置到文档之后才能设置它的value。
另外,在Mozilla下面内容包装的不是很好。我试了好几种wrap参数,但是结果都不是很好。
最严重的问题就是把修改后的内容发回服务器,这是几乎所有的CMS系统都要做的。读者给了我很多高明巧妙的建议。然而因为不能通过JavaScript完成,所以我也不能提供解决办法。所以也请您不要发邮件告诉你找到了办法:那也许可行,但是我只想要纯JavaScript的不需要服务器端代码的方法。
脚本
复制代码 代码如下:
var editing = false;
if (document.getElementById && document.createElement) {
var butt = document.createElement('BUTTON');
var buttext = document.createTextNode('Ready!');
butt.appendChild(buttext);
butt.onclick = saveEdit;
}
function catchIt(e) {
if (editing) return;
if (!document.getElementById || !document.createElement) return;
if (!e) var obj = window.event.srcElement;
else var obj = e.target;
while (obj.nodeType != 1) {
obj = obj.parentNode;
}
if (obj.tagName == 'TEXTAREA' || obj.tagName == 'A') return;
while (obj.nodeName != 'P' && obj.nodeName != 'HTML') {
obj = obj.parentNode;
}
if (obj.nodeName == 'HTML') return;
var x = obj.innerHTML;
var y = document.createElement('TEXTAREA');
var z = obj.parentNode;
z.insertBefore(y,obj);
z.insertBefore(butt,obj);
z.removeChild(obj);
y.value = x;
y.focus();
editing = true;
}
function saveEdit() {
var area = document.getElementsByTagName('TEXTAREA')[0];
var y = document.createElement('P');
var z = area.parentNode;
y.innerHTML = area.value;
z.insertBefore(y,area);
z.removeChild(area);
z.removeChild(document.getElementsByTagName('button')[0]);
editing = false;
}
document.onclick = catchIt;
解释
我们设置一个editing标志为false。这用来显示用户是否正在编辑段落。当然初始是没有。
var editing=false;
创建一个按钮
然后我们创建一个Radey按钮,后面会需要很多次。这需要一些高级脚本技术,所以先做一些对象检测:
复制代码 代码如下:
if (document.getElementById && document.createElement) {
如果是现代浏览器,则创建按钮:
复制代码 代码如下:
var butt = document.createElement('BUTTON');
他的文本是:
复制代码 代码如下:
var buttext = document.createTextNode('Ready!');
把这个文本添加到按钮上:
复制代码 代码如下:
butt.appendChild(buttext);
然后添加一个onclick事件处理程序:
复制代码 代码如下:
butt.onclick = saveEdit; 2 }
现在按钮就存储在butt里面,需要的时候我们就可以直接引用。
将P转为文本框
稍后我们会为整个页面定义一个onclick事件。所有的这些事件都会发送到catchIt()函数。
复制代码 代码如下:
function catchIt(e){
首先检测用户是否正常编辑段落,如果是,结束函数:
复制代码 代码如下:
if (editing) return;
然后是支持性检测:
复制代码 代码如下:
if (!document.getElementById || !document.createElement) return;
然后寻找事件的源:
复制代码 代码如下:
if (!e) var obj = window.event.srcElement; 2 else var obj = e.target;
现在我们有了事件的源,但是有个问题是Mozilla会认为文本节点是源(而不是我们需要的P节点)。所以如果节点不是标签(nodeType不是1),我们需要向上遍历DOM树:
复制代码 代码如下: