表单元素不返回新值

Posted

技术标签:

【中文标题】表单元素不返回新值【英文标题】:Form element not returning new value 【发布时间】:2012-10-19 08:56:36 【问题描述】:

我正在尝试创建一个脚本,允许用户单击带有h1'd 文本位的div 元素,然后将h1 替换为文本框和编辑后单击的图形。单击图形后,div 将用新编辑的 h1'd 位文本替换文本框和图形。

以下是函数:

function savename() 
    var s = $('#mytextbox').val();
    $('#mydiv').replaceWith('<div id="mydiv" onclick="editname();"><h1>' + s + '</h1></div>');

function editname() 
    var strName = $('#mydiv').text();
    $('#mydiv').replaceWith($('<div id="mydiv"><input id="mytextbox" name="mytextbox" type="text" value="' + strName + '"><img id="mysavebutton" src="images/save.gif" onclick="savename();"></div>'));

这里是 div:

<div id="mydiv" onclick="editname();"><h1>Some text I want to edit</h1></div>

所以,div 点击功能可以正常工作。它将h1 元素替换为一个文本框。当我单击保存图形时,它也可以正常工作,因为它返回h1。问题是,文本框的值应该是h1'd 文本。那部分不工作。它仍然保留旧值。在将“s”设置为.val() 后,我对“s”发出了警告,即使在编辑后它仍然显示旧值。我觉得我错过了一些简单的东西,但我整天都在与它作斗争,需要一些新鲜的眼睛来替我看。提前致谢。

【问题讨论】:

似乎对我有用。 jsfiddle.net/cwfhY/2 我应该澄清一下,里面有 h1 的 div 首先出现。您的测试从输入框开始。但是,当我编辑您的测试时,这并没有改变任何东西。原来是因为我把它放在了一个表格里。一旦我将 div 放在表单之外,它就起作用了。 【参考方案1】:

与其替换 mydiv 并尝试重新创建 mydiv,不如在单击时隐藏 mydiv 并在尝试保存时更改 h1 标签的值?

html 中你可以有这样的东西:

<div id="mydiv">
    <h1 id="myoutput" onclick="editname();"> ... </h1>
    <input id="mytextbox" name="mytextbox" type="text" style="display:none;">
    <img id="mysavebutton" src="images/save.gif" onclick="savename();" style="display:none" /> 
</div>

然后在javascript中:

function editname()

    var s = $('#myoutput').text();
    $('#myoutput').css('display', 'none');
    $('#mytextbox').val(s).css('display','inline');
    $('#mysavebutton').css('display', 'inline');

function savename()

    var s = $('#mytextbox').val();
    $('#myoutput').text(s).css('display', 'inline');
    $('#mytextbox').css('display', 'none');
    $('#mysavebutton').css('display', 'none');

【讨论】:

我曾考虑过这一点,并且可能会更改生产代码以使其像那样工作,但我决心找出编辑不起作用的原因。正如我在对 Fabricio 的评论中所说,事实证明将其包装在一个表格中是问题所在。所以,虽然你的方法更干净,但它并不能解决问题。【参考方案2】:

这对我有用,并且是原生 ES5(ECMAScript 5 规范)- 没有库

(fiddle)

JavaScript:

document.addEventListener("DOMContentLoaded", function() 
    "use strict";

    var divElem = document.getElementById("div"),
        textInputElem = document.createElement("input"),
        buttonElem = document.createElement("input");

    textInputElem.type = "text";
    buttonElem.type = "button";
    buttonElem.value = "Apply";

    function removeChildren(elem) 
        while (elem.firstChild) 
            elem.removeChild(elem.firstChild);
        
    

    function divClick() 
        removeChildren(divElem);
        divElem.appendChild(textInputElem, divElem.firstChild);
        divElem.appendChild(buttonElem);
        divElem.removeEventListener("click", divClick, true);
    

    buttonElem.addEventListener("click", function() 
        var textNode;

        if (textInputElem.value !== "") 
            removeChildren(divElem);
            textNode = document.createTextNode(textInputElem.value);
            divElem.appendChild(textNode);
            divElem.addEventListener("click", divClick, true);
        
    , false);
    divClick();
, false);

HTML:

<div id="div"></div>​

这是关于 Element.AddEventListener() 的 MDN 文档:MDN: AddEventListener

【讨论】:

以上是关于表单元素不返回新值的主要内容,如果未能解决你的问题,请参考以下文章

将表单数据推送到对象数组

Ajax表单提交我想通过id更改表单元素的值,以便脚本从php中的返回值进行下一次调用

将选择的数据返回到包含键值对的表单元素中

为啥 Scheme `filter` 表单不能“按顺序”处理列表元素?

即使为表单元素定义了名称属性,JQuery form.serialize() 也会返回空字符串

jQuery操作Form表单元素