如何正确选取jQuery $.post返回的jqXHR中的div标签
问题解决方法
问题根源在于jQuery解析混合了table专属元素(如<tbody>)和普通块级元素(如<div>)的HTML字符串时,会对DOM结构进行自动调整,导致部分元素无法通过filter()直接定位(filter()仅匹配jQuery集合中的顶级元素)。以下是两种可行的解决方案:
方案一:修改Django模板,添加父容器
在返回的HTML外层包裹一个统一的父容器,确保所有元素都成为该容器的子元素,之后用find()即可轻松定位所有目标元素。
修改table.html模板:
<div class="response-container"> <tbody id="queueTableBody"> {% for x in unarchived %} <tr> <td> value 1 </td> ... </tr> {% endfor %} </tbody> <tbody id="archiveTableBody"> {% for x in archived %} <tr> <td> value 1 </td> ... </tr> {% endfor %} </tbody> <div id="targetDivElet">{{ valueForDiv }}</div> </div>
更新JS代码:
function getDbUpdate(){ let _WaitTimes = JSON.stringify(compileWaitTimes()); $.post("{% url 'checkForDbUpdate' %}", {_WaitTimes, csrfmiddlewaretoken: '{{ csrf_token }}'}, function(data, status){ if (status !== 'nocontent'){ const $response = $(data); const queueTableHTML = $response.find("#queueTableBody").html(); const archiveTableHTML = $response.find("#archiveTableBody").html(); const targetDivContent = $response.find("#targetDivElet").html(); $('#queueTable > tbody').replaceWith(queueTableHTML); $('#archiveTable > tbody').replaceWith(archiveTableHTML); // 仅更新div内容,而非替换整个div元素 $('#targetDivElet').html(targetDivContent); // 若需替换整个div元素,改用: // const targetDivElement = $response.find("#targetDivElet").prop('outerHTML'); // $('#targetDivElet').replaceWith(targetDivElement); } } ); };
方案二:在JS中创建临时容器(无需修改模板)
直接在JS里将返回的HTML字符串放入临时div容器,再通过find()定位元素,绕过jQuery的自动结构调整问题。
更新JS代码:
function getDbUpdate(){ let _WaitTimes = JSON.stringify(compileWaitTimes()); $.post("{% url 'checkForDbUpdate' %}", {_WaitTimes, csrfmiddlewaretoken: '{{ csrf_token }}'}, function(data, status){ if (status !== 'nocontent'){ // 创建临时容器包裹返回的HTML const $temp = $('<div>').html(data); const queueTableHTML = $temp.find("#queueTableBody").html(); const archiveTableHTML = $temp.find("#archiveTableBody").html(); const targetDivContent = $temp.find("#targetDivElet").html(); $('#queueTable > tbody').replaceWith(queueTableHTML); $('#archiveTable > tbody').replaceWith(archiveTableHTML); $('#targetDivElet').html(targetDivContent); } } ); };
内容的提问来源于stack exchange,提问作者mriedl
相关产品推荐
相关产品推荐

