JQuery 选择器和 val() 或 text() 似乎在元素 html 被替换为就地编辑元素时失败

JQuery selectors and val() or text() appear to fail when element html replaced on edit in place elements

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

除此代码外一切正常

 //* 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 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;

这是加载 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() 时我们的新锚点不存在,因此它不会获取事件处理程序。

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

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 

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