【问题标题】:JQuery selectors and val() or text() appear to fail when element html replaced on edit in place elements当在原地编辑元素上替换元素 html 时,JQuery 选择器和 val() 或 text() 似乎失败
【发布时间】:2016-12-03 02:52:18
【问题描述】:

我正在尝试将显示元素切换为输入元素,这样我就可以让用户在不刷新页面的情况下更新数据。

除了这段代码一切正常

 //* values*/
        var customernameval =  customername.attr('value');
        var customerphoneval =  customerphone.attr('value');
        var customerfaxval =  customerfax.attr('value');
        var customeremailval =  customeremail.attr('value');

我尝试了 val() 和 text(),但它们也不起作用!

如何从输入中获取值,以便使用 ajax 发送它!

/*Edit customer details*/

$(document).ready(function() {
    $(document).on('click','#edit_customer_info',function(){
        var shipmentid = $(this).attr('value1');

        /*selectors*/
        var customername =  $('#edit_customer_name'+shipmentid);
        var customerphone =  $('#edit_customer_phone'+shipmentid);
        var customerfax =  $('#edit_customer_fax'+shipmentid);
        var customeremail =  $('#edit_customer_email'+shipmentid);
        var Update =  $('#update_customer_info');


        //* values*/
        var customernameval =  customername.text();
        var customerphoneval =  customerphone.text();
        var customerfaxval =  customerfax.text();
        var customeremailval =  customeremail.text();

        /*remove edit button*/
        $(this).css('display','none');
        /*show update button*/
        Update.css('display','inline');

        /*append input text into the field*/
        customername.html("<input type='text' id='edit_customer_name"+shipmentid+"' value='"+customernameval+"'>");
        customerphone.html("<input type='text' id='edit_customer_phone"+shipmentid+"' value='"+customerphoneval+"'>");
        customerfax.html("<input type='text' id='edit_customer_fax"+shipmentid+"' value='"+customerfaxval+"'>");
        customeremail.html("<input type='text' id='edit_customer_email"+shipmentid+"'  value='"+customeremailval+"'>");
    });

    //update customer data
    $(document).on('click','#update_customer_info',function(){
        var shipmentid = $(this).attr('value1');

        /*selectors*/
        var customername =  $('#edit_customer_name'+shipmentid);
        var customerphone =  $('#edit_customer_phone'+shipmentid);
        var customerfax =  $('#edit_customer_fax'+shipmentid);
        var customeremail =  $('#edit_customer_email'+shipmentid);

        //* values*/
        var customernameval =  customername.attr('value');
        var customerphoneval =  customerphone.attr('value');
        var customerfaxval =  customerfax.attr('value');
        var customeremailval =  customeremail.attr('value');

        alert(customernameval);
        /*append input text into the field*/
        customername.html(customernameval);
        customerphone.html(customerphoneval);
        customerfax.html(customerfaxval);
        customeremail.html(customeremailval);

    });
});

【问题讨论】:

  • 在你的行之后 'var customername = $('#edit_customer_name'+shipmentid);'添加 console.log('customername count=' + customername.length)。您正在寻找 1。这是为了确认您没有带有 customername id 的多个元素。告诉我。
  • 我得到了“customername count=1”
  • 好的 - 你能在警报前尝试一下吗?这个想法是,当像 .val() 这样的简单 jquery 命令失败时,首先要检查的是您的假设(a)有一个具有指定 id 的元素,并且(b)没有多个具有指定 id 的元素.要检查 (a) 使用通过选择器获得的 jquery 对象的长度属性,或者 (b) 按 F12 并检查元素并搜索 (ctrl-F) 以获取预期的元素 ID。如果答案是 1,那么您的假设是正确的,并且只有一个元素,所以问题一定是其他问题。但很少发生。

标签: jquery jquery-selectors


【解决方案1】:

我认为您的问题在于您将输入框放入文档的方式。你正在使用

customername.html("<input type='text' id='edit_customer_name"+shipmentid+"' value='"+customernameval+"'>");

假设你从

<div id="edit_customer_name1234">I am customer 1234</div>

那么你的代码会给你...

<div id="edit_customer_name1234">
    <input type="text" id="edit_customer_name1234" value="I am customer 1234"/>
</div>

如您所见,您有 2 个 id = edit_customer_name1234 的元素

解决方案:使用 .replaceWith()

customername.replaceWith("<input type='text' id='edit_customer_name"+shipmentid+"' value='"+customernameval+"'>");

文档here at jquery.

或者,只需将输入框上的 id 更改为与原始显示元素不同。那么你在哪里

    <input type="text" id="edit_customer_name1234" value="I am customer 

切换到

    <input type="text" id="input_customer_name1234" value="I am customer 

当然,在后面的第二个块中更改您的选择。

【讨论】:

  • 谢谢。 replaceWith 做到了。我以前见过。代码现在可以工作了
  • 不用担心 - 我自己也做过这件事。浪费了我几个小时。
【解决方案2】:

这是加载 DOM 时输入不存在的问题。所以你需要做的是改变$(document).on('click',...部分如下:

//update customer data
    $(document).on('click','#update_customer_info',function(event){
        if ($(event.target).prop('id') === 'edit_customer_name') {
            var shipmentid = $(event.target).attr('value');
            var customername =  $('#edit_customer_name'+shipmentid);
        }
    ...
    });

对于每个字段。这样通过冒泡验证元素id。

来自jQuery manual

...考虑一下当我们在绑定了上面的监听器之后添加一个新的锚点时会发生什么:

// Add a new element on to our existing list

    $( "#list" ).append( "<li><a href='http://newdomain.com'>Item #5</a></li>" );

如果我们点击新添加的项目,什么都不会发生。这是因为我们之前附加的直接绑定的事件处理程序。直接事件仅在调用 .on() 方法时附加到元素。在这种情况下,由于在调用 .on() 时我们的新锚点不存在,因此它不会获取事件处理程序。

【讨论】:

  • 您可能是对的,但出于兴趣,您是如何得出这个结论的?
  • @VanquiishedWombat,列出的代码中的 OP 是 /*append input text into the field*/
  • 好的,但我读了它,因为他有 2 个按钮单击“#edit_customer_info”以显示输入,然后单击“#update_customer_info”以开始一些保存过程。第二个有一个警报,这是我认为问题所在。由于第二个事件直到第一个事件(假设)之后才被触发,所以元素将存在。还是我错了?如果是,为什么?
  • 如果没有开始的 HTML,这有点难以分辨。但是元素是在edit 部分中创建的。我们可以假设现有 id (HTML 规则)只有一个元素。这很令人困惑,因为editupdate 基本上是同义词。无论如何,即使在编辑事件之后触发了更新事件,元素也不会是原始 DOM 的一部分。浏览器并不完全知道它们的存在,除非它们是原始页面加载的一部分。
  • @VanquiishedWombat,我在答案中添加了 jQuery 手册页中的引用。
【解决方案3】:
var customernameval  = document.getElementById("edit_customer_name").value;
var customerphoneval = document.getElementById("edit_customer_phone").value;
var customerfaxval   = document.getElementById("edit_customer_fax").value;
var customeremailval = document.getElementById("edit_customer_email").value;

【讨论】:

  • 据我所知,OP 已经通过 jquery 选择器获取了这些值。另外,您忽略了元素 id 有一个连接的 shippingid。没有任何解释,您的答案似乎对 OP 的需求没有什么价值。
  • 请至少添加一个简短的描述这将如何解决问题,而不是仅提供代码的答案。
猜你喜欢
  • 2013-01-08
  • 2017-03-29
  • 2019-01-23
  • 2013-08-10
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多