使用 AJAX 进行内联编辑 - 如何在同一页面上创建多个可编辑区域?

发布于 2024-07-14 17:38:12 字数 2813 浏览 4 评论 0原文

我找到了有关如何使用 AJAX 在页面上创建可编辑区域的教程。

这很棒,只不过它是为具有唯一 ID 的单个元素编写的。 我希望能够单击同一页面上的多个元素并使它们也可以编辑(例如,我想更改下面的脚本,以便它不适用于单个元素,而是适用于特定的多个元素)。

这是我的 HTML:

<h2>Edit This</h2>
<p class="edit">This is some editable content</p>
<p class="edit">This is some more editable content</p>
<p class="edit">I could do this all day</p>

这是我正在使用的 JS 文件(我根据下面的 Rex 答案更新了脚本): 不幸的是,这个脚本不起作用 - 谁能指出我正确的方向?

Event.observe(window, 'load', init, false);

function init() {
    makeEditable('edit');
}

function makeEditable(className) {
    var editElements = document.getElementsByClassName(className);
    for(var i=0;i<editElements.length;i++) {
        Event.observe(editElements[i], 'click', function(){edit($(className))}, false);
        Event.observe(editElements[i], 'mouseover', function(){showAsEditable($(className))}, false);
        Event.observe(editElements[i], 'mouseout', function(){showAsEditable($(className), true)}, false);
    }
}


function showAsEditable(obj, clear) {
    if (!clear) {
        Element.addClassName(obj, 'editable');
    } else {
        Element.removeClassName(obj, 'editable');
    }
}

function edit(obj) {
    Element.hide(obj);

    var textarea ='<div id="' + obj.id + '_editor"><textarea cols="60" rows="4" name="' + obj.id + '" id="' + obj.id + '_edit">' + obj.innerHTML + '</textarea>';

    var button = '<input type="button" value="SAVE" id="' + obj.id + '_save"/> OR <input type="button" value="CANCEL" id="' + obj.id + '_cancel"/></div>';

    new Insertion.After(obj, textarea+button);

    Event.observe(obj.id+'_save', 'click', function(){saveChanges(obj)}, false);
    Event.observe(obj.id+'_cancel', 'click', function(){cleanUp(obj)}, false);
}

function cleanUp(obj, keepEditable) {
    Element.remove(obj.id+'_editor');
    Element.show(obj);
    if (!keepEditable) showAsEditable(obj, true);
}

function saveChanges(obj) {
    var new_content = escape($F(obj.id+'_edit'));

    obj.preUpdate = obj.innerHTML // stow contents prior to saving in case of an error
    obj.innerHTML = "Saving…";
    cleanUp(obj, true);

    var success = function(t){editComplete(t, obj);}
    var failure = function(t){editFailed(t, obj);}

    var url = 'http://portal.3roadsmedia.com/scripts/edit.php';
    var pars = 'id=' + obj.id + '&content=' + new_content + '&pre=' + obj.preUpdate;
    var myAjax = new Ajax.Request(url, {method:'post',
    postBody:pars, onSuccess:success, onFailure:failure});
}

function editComplete(t, obj) {
    obj.innerHTML = t.responseText;
    showAsEditable(obj, true);
}

function editFailed(t, obj) {
    obj.innerHTML = 'Sorry, the update failed.';
    cleanUp(obj);
}

I found a tutorial on how to create editable regions on a page using AJAX.

This is great, except it was written for a single element with a unique ID. I'd like to be able to click on multiple elements on the same page and have them also be editable (e.g., I'd like to alter the script below so it works not with a single element, but with multiple elements of a particular class).

Here is my HTML:

<h2>Edit This</h2>
<p class="edit">This is some editable content</p>
<p class="edit">This is some more editable content</p>
<p class="edit">I could do this all day</p>

Here is the JS file I'm working with (I updated the script per Rex's answer below): This script is, unfortunately, not working - can anyone point me in the right direction?

Event.observe(window, 'load', init, false);

function init() {
    makeEditable('edit');
}

function makeEditable(className) {
    var editElements = document.getElementsByClassName(className);
    for(var i=0;i<editElements.length;i++) {
        Event.observe(editElements[i], 'click', function(){edit($(className))}, false);
        Event.observe(editElements[i], 'mouseover', function(){showAsEditable($(className))}, false);
        Event.observe(editElements[i], 'mouseout', function(){showAsEditable($(className), true)}, false);
    }
}


function showAsEditable(obj, clear) {
    if (!clear) {
        Element.addClassName(obj, 'editable');
    } else {
        Element.removeClassName(obj, 'editable');
    }
}

function edit(obj) {
    Element.hide(obj);

    var textarea ='<div id="' + obj.id + '_editor"><textarea cols="60" rows="4" name="' + obj.id + '" id="' + obj.id + '_edit">' + obj.innerHTML + '</textarea>';

    var button = '<input type="button" value="SAVE" id="' + obj.id + '_save"/> OR <input type="button" value="CANCEL" id="' + obj.id + '_cancel"/></div>';

    new Insertion.After(obj, textarea+button);

    Event.observe(obj.id+'_save', 'click', function(){saveChanges(obj)}, false);
    Event.observe(obj.id+'_cancel', 'click', function(){cleanUp(obj)}, false);
}

function cleanUp(obj, keepEditable) {
    Element.remove(obj.id+'_editor');
    Element.show(obj);
    if (!keepEditable) showAsEditable(obj, true);
}

function saveChanges(obj) {
    var new_content = escape($F(obj.id+'_edit'));

    obj.preUpdate = obj.innerHTML // stow contents prior to saving in case of an error
    obj.innerHTML = "Saving…";
    cleanUp(obj, true);

    var success = function(t){editComplete(t, obj);}
    var failure = function(t){editFailed(t, obj);}

    var url = 'http://portal.3roadsmedia.com/scripts/edit.php';
    var pars = 'id=' + obj.id + '&content=' + new_content + '&pre=' + obj.preUpdate;
    var myAjax = new Ajax.Request(url, {method:'post',
    postBody:pars, onSuccess:success, onFailure:failure});
}

function editComplete(t, obj) {
    obj.innerHTML = t.responseText;
    showAsEditable(obj, true);
}

function editFailed(t, obj) {
    obj.innerHTML = 'Sorry, the update failed.';
    cleanUp(obj);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

℡Ms空城旧梦 2024-07-21 17:38:12

Event.observe 方法当前附加到具有指定 ID 的单个元素。 您应该更改此设置以迭代按类名定位的元素集合并附加到每个元素。 根据 Prototype 文档,您可以提供一个元素对象作为第一个参数,而不是 ID。

目前,id 是一个字符串:

function makeEditable(id) {
    Event.observe(id, 'click', function(){edit($(id))}, false);
    //...

这意味着 Event.observe 正在附加到具有提供的 ID 的元素的单击事件。 您想要用一个类附加到所有元素。 尝试:

function makeEditable(className) {
    var editElements = document.getElementsByClassName(className);
    for(var i=0;i<editElements.length;i++) {
        Event.observe(editElements[i], 'click', function()
        //...
    }
    //...

The Event.observe method currently attaches to a single element with the ID specified. You should change this to iterate over a collection of elements located by classname and attach to each of them. According to the Prototype documentation, you can provide an element object as the first parameter, instead of an ID.

Currently, id is a string:

function makeEditable(id) {
    Event.observe(id, 'click', function(){edit($(id))}, false);
    //...

Which means Event.observe is attaching to the click event of the element with the ID provided. You want to attach to all elements with a class. Try:

function makeEditable(className) {
    var editElements = document.getElementsByClassName(className);
    for(var i=0;i<editElements.length;i++) {
        Event.observe(editElements[i], 'click', function()
        //...
    }
    //...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文