jQuery 追加插入一个意外的值
jQuery append insert an unexpected value
我在特定的 WordPress 实例上执行 jQuery("body").append() 指令时遇到一个非常奇怪的问题(不是在所有使用此脚本的 WordPress 站点上),尽管我“追加”了什么(即使在使用 chrome 控制台进行调试时)附加的实际数据也不同。
在我的场景中,我开发了一个 javascript 文件来处理符合 GDPR 规则的最小 cookiebar,它应该与 wordpress 兼容。
将 javascript 文件包含到 wordpress 实例后,脚本中的内容将被执行,它将“扫描”(有点复杂,它涉及远程服务和休息 api)页面并生成包含所有 cookie 信息的 cookiebar,以便用户可以只接受所需的 cookie。
Cookibar 代码不是太复杂,但绝对太长 post 在这里,只考虑在它执行该指令的所有逻辑结束时:
jQuery("body").append(calculatedCookiebarHtml);
现在从我的cookiebar坏掉的前提出发,我去掉了所有的cookiebar代码,只留下两行代码
jQuery("body").empty();
jQuery("body").append(HARDCODED_HTML);
其中 HARDCODED_HTML 是 cookiebar 的虚拟示例(这里是未转义的版本):
<div class="js-cookieBar cookieLaw" id="cookie_bar_main_body">
<div class="js-cookieBarDescription cookiebar">
<div class="cookie-panel">
<div class="left">
<span class="heading">Questo sito <br>utilizza cookie</span>
<p>Per garantirti la migliore esperienza sul nostro sito in termini di funzionalità, accessibilità, usabilità e prestazioni nonché per ricordare le tue preferenze, ti invitiamo ad installare i cookie opzionali cliccando sul pulsante "Accetta tutti". Se desideri invece gestire le singole opzioni, clicca sul tasto "Impostazioni"</p>
</div>
<div class="right">
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"/></a>
<a class="js-cookieBarAcceptAll button">Accetta tutti</a>
</div>
</div>
</div>
<div class="js-cookieBarDetail cookiebar">
<div class="cookie-panel selezionati">
<p>Vogliamo essere trasparenti sui dati che noi e i nostri partner raccogliamo e sul loro utilizzo, in modo che tu possa averne un controllo ottimale.<br>Per ulteriori informazioni, visita la <a class="js-privacyLink">privacy policy</a> e la <a class="js-policyLink">cookie policy</a>.</p>
<div class="box-selezionati">
<div class="selezionati-left">
<ul class="js-cookieBarList"/>
<div class="selezionati-bottoni">
<div class="js-cookieBarChecks"/>
<a class="button button-small rifiuta js-cookieBarDeclineAll">Rifiuta tutti</a>
<a class="js-cookieBarSave button button-small">Conferma</a>
<p>
<span class="js-cookieBarSelected"/>/<span class="js-cookieBarSelectable"/>
</p>
</div>
</div>
<div class="selezionati-right">
<table id="tableCookie" class="js-cookieBarExplain">
<tr>
<th/>
<th>Nome / A cosa serve</th>
<th>Scadenza</th>
<th>Proprietario</th>
<th>Dati inviati in</th>
</tr>
</table>
</div>
</div>
</div>
</div>
这里是带有转义 html 有效负载的确切命令:
$("body").append('<div class=\"js-cookieBar cookieLaw\" id=\"cookie_bar_main_body\">\n\t<div class=\"js-cookieBarDescription cookiebar\">\n\t\t<div class=\"cookie-panel\">\n\t\t\t<div class=\"left\">\n\t\t\t\t<span class=\"heading\">Questo sito <br>utilizza cookie</span>\n\t\t\t\t<p>Per garantirti la migliore esperienza sul nostro sito in termini di funzionalità, accessibilità, usabilità e prestazioni nonché per ricordare le tue preferenze, ti invitiamo ad installare i cookie opzionali cliccando sul pulsante \"Accetta tutti\". Se desideri invece gestire le singole opzioni, clicca sul tasto \"Impostazioni\"</p>\n\t\t\t</div>\n\t\t\t<div class=\"right\">\n\t\t\t\t<a class=\"js-cookieBarInfoButton link\">Impostazioni <i class=\"arrow down\"/></a>\n\t\t\t\t<a class=\"js-cookieBarAcceptAll button\">Accetta tutti</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"js-cookieBarDetail cookiebar\">\n\t\t<div class=\"cookie-panel selezionati\">\n\t\t\t<p>Vogliamo essere trasparenti sui dati che noi e i nostri partner raccogliamo e sul loro utilizzo, in modo che tu possa averne un controllo ottimale.<br>Per ulteriori informazioni, visita la <a class=\"js-privacyLink\">privacy policy</a> e la <a class=\"js-policyLink\">cookie policy</a>.</p>\n\t\t\t<div class=\"box-selezionati\">\n\t\t\t\t<div class=\"selezionati-left\">\n\t\t\t\t\t<ul class=\"js-cookieBarList\"/>\n\t\t\t\t\t<div class=\"selezionati-bottoni\">\n\t\t\t\t\t\t<div class=\"js-cookieBarChecks\"/>\n\t\t\t\t\t\t<a class=\"button button-small rifiuta js-cookieBarDeclineAll\">Rifiuta tutti</a>\n\t\t\t\t\t\t<a class=\"js-cookieBarSave button button-small\">Conferma</a>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span class=\"js-cookieBarSelected\"/>/<span class=\"js-cookieBarSelectable\"/>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"selezionati-right\">\n\t\t\t\t\t<table id=\"tableCookie\" class=\"js-cookieBarExplain\">\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th/>\n\t\t\t\t\t\t\t<th>Nome / A cosa serve</th>\n\t\t\t\t\t\t\t<th>Scadenza</th>\n\t\t\t\t\t\t\t<th>Proprietario</th>\n\t\t\t\t\t\t\t<th>Dati inviati in</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>')
我期待看到正确的 UI 出现,但我又一次得到了错误的结果。
所以我从 chrome 控制台执行那两条 javascript 行,将 html 添加到主体中。
附加的 HTML 与我要求附加的不同,我在生产中看到的问题被转载:
<div class="js-cookieBar cookieLaw" id="cookie_bar_main_body">
<div class="js-cookieBarDescription cookiebar">
<div class="cookie-panel">
<div class="left">
<span class="heading">Questo sito <br>utilizza cookie</span>
<p>Per garantirti la migliore esperienza sul nostro sito in termini di funzionalità, accessibilità, usabilità e prestazioni nonché per ricordare le tue preferenze, ti invitiamo ad installare i cookie opzionali cliccando sul pulsante "Accetta tutti". Se desideri invece gestire le singole opzioni, clicca sul tasto "Impostazioni"</p>
</div>
<div class="right">
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"></i></a><i class="arrow down">
<a class="js-cookieBarAcceptAll button">Accetta tutti</a>
</i></div><i class="arrow down">
</i></div><i class="arrow down">
</i></div><i class="arrow down">
<div class="js-cookieBarDetail cookiebar">
<div class="cookie-panel selezionati">
<p>Vogliamo essere trasparenti sui dati che noi e i nostri partner raccogliamo e sul loro utilizzo, in modo che tu possa averne un controllo ottimale.<br>Per ulteriori informazioni, visita la <a class="js-privacyLink">privacy policy</a> e la <a class="js-policyLink">cookie policy</a>.</p>
<div class="box-selezionati">
<div class="selezionati-left">
<ul class="js-cookieBarList">
<div class="selezionati-bottoni">
<div class="js-cookieBarChecks">
<a class="button button-small rifiuta js-cookieBarDeclineAll">Rifiuta tutti</a>
<a class="js-cookieBarSave button button-small">Conferma</a>
<p>
<span class="js-cookieBarSelected">/<span class="js-cookieBarSelectable">
</span></span></p>
</div>
</div>
<div class="selezionati-right">
<table id="tableCookie" class="js-cookieBarExplain">
<tbody><tr>
<th>
</th><th>Nome / A cosa serve</th>
<th>Scadenza</th>
<th>Proprietario</th>
<th>Dati inviati in</th>
</tr>
</tbody></table>
</div>
</ul></div>
</div>
</div>
这里是差异:
好像我的 escaping 有什么东西坏了,或者有什么东西拦截了附加指令并改变了内容(很奇怪,即使我 运行 来自的指令也发生了chrome 逐步调试控制台,因此不应在追加之后触发任何指令)。
有人可以向我解释是什么导致了这种奇怪的行为吗?
因为您的 html 无效,span 或 i 标签的成对结束标签在哪里?
无效:
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"/></a>
有效:
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"></i></a>
你的html完全坏了,你可以在验证器中检查你的html,例如here
我在特定的 WordPress 实例上执行 jQuery("body").append() 指令时遇到一个非常奇怪的问题(不是在所有使用此脚本的 WordPress 站点上),尽管我“追加”了什么(即使在使用 chrome 控制台进行调试时)附加的实际数据也不同。
在我的场景中,我开发了一个 javascript 文件来处理符合 GDPR 规则的最小 cookiebar,它应该与 wordpress 兼容。 将 javascript 文件包含到 wordpress 实例后,脚本中的内容将被执行,它将“扫描”(有点复杂,它涉及远程服务和休息 api)页面并生成包含所有 cookie 信息的 cookiebar,以便用户可以只接受所需的 cookie。 Cookibar 代码不是太复杂,但绝对太长 post 在这里,只考虑在它执行该指令的所有逻辑结束时:
jQuery("body").append(calculatedCookiebarHtml);
现在从我的cookiebar坏掉的前提出发,我去掉了所有的cookiebar代码,只留下两行代码
jQuery("body").empty();
jQuery("body").append(HARDCODED_HTML);
其中 HARDCODED_HTML 是 cookiebar 的虚拟示例(这里是未转义的版本):
<div class="js-cookieBar cookieLaw" id="cookie_bar_main_body">
<div class="js-cookieBarDescription cookiebar">
<div class="cookie-panel">
<div class="left">
<span class="heading">Questo sito <br>utilizza cookie</span>
<p>Per garantirti la migliore esperienza sul nostro sito in termini di funzionalità, accessibilità, usabilità e prestazioni nonché per ricordare le tue preferenze, ti invitiamo ad installare i cookie opzionali cliccando sul pulsante "Accetta tutti". Se desideri invece gestire le singole opzioni, clicca sul tasto "Impostazioni"</p>
</div>
<div class="right">
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"/></a>
<a class="js-cookieBarAcceptAll button">Accetta tutti</a>
</div>
</div>
</div>
<div class="js-cookieBarDetail cookiebar">
<div class="cookie-panel selezionati">
<p>Vogliamo essere trasparenti sui dati che noi e i nostri partner raccogliamo e sul loro utilizzo, in modo che tu possa averne un controllo ottimale.<br>Per ulteriori informazioni, visita la <a class="js-privacyLink">privacy policy</a> e la <a class="js-policyLink">cookie policy</a>.</p>
<div class="box-selezionati">
<div class="selezionati-left">
<ul class="js-cookieBarList"/>
<div class="selezionati-bottoni">
<div class="js-cookieBarChecks"/>
<a class="button button-small rifiuta js-cookieBarDeclineAll">Rifiuta tutti</a>
<a class="js-cookieBarSave button button-small">Conferma</a>
<p>
<span class="js-cookieBarSelected"/>/<span class="js-cookieBarSelectable"/>
</p>
</div>
</div>
<div class="selezionati-right">
<table id="tableCookie" class="js-cookieBarExplain">
<tr>
<th/>
<th>Nome / A cosa serve</th>
<th>Scadenza</th>
<th>Proprietario</th>
<th>Dati inviati in</th>
</tr>
</table>
</div>
</div>
</div>
</div>
这里是带有转义 html 有效负载的确切命令:
$("body").append('<div class=\"js-cookieBar cookieLaw\" id=\"cookie_bar_main_body\">\n\t<div class=\"js-cookieBarDescription cookiebar\">\n\t\t<div class=\"cookie-panel\">\n\t\t\t<div class=\"left\">\n\t\t\t\t<span class=\"heading\">Questo sito <br>utilizza cookie</span>\n\t\t\t\t<p>Per garantirti la migliore esperienza sul nostro sito in termini di funzionalità, accessibilità, usabilità e prestazioni nonché per ricordare le tue preferenze, ti invitiamo ad installare i cookie opzionali cliccando sul pulsante \"Accetta tutti\". Se desideri invece gestire le singole opzioni, clicca sul tasto \"Impostazioni\"</p>\n\t\t\t</div>\n\t\t\t<div class=\"right\">\n\t\t\t\t<a class=\"js-cookieBarInfoButton link\">Impostazioni <i class=\"arrow down\"/></a>\n\t\t\t\t<a class=\"js-cookieBarAcceptAll button\">Accetta tutti</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"js-cookieBarDetail cookiebar\">\n\t\t<div class=\"cookie-panel selezionati\">\n\t\t\t<p>Vogliamo essere trasparenti sui dati che noi e i nostri partner raccogliamo e sul loro utilizzo, in modo che tu possa averne un controllo ottimale.<br>Per ulteriori informazioni, visita la <a class=\"js-privacyLink\">privacy policy</a> e la <a class=\"js-policyLink\">cookie policy</a>.</p>\n\t\t\t<div class=\"box-selezionati\">\n\t\t\t\t<div class=\"selezionati-left\">\n\t\t\t\t\t<ul class=\"js-cookieBarList\"/>\n\t\t\t\t\t<div class=\"selezionati-bottoni\">\n\t\t\t\t\t\t<div class=\"js-cookieBarChecks\"/>\n\t\t\t\t\t\t<a class=\"button button-small rifiuta js-cookieBarDeclineAll\">Rifiuta tutti</a>\n\t\t\t\t\t\t<a class=\"js-cookieBarSave button button-small\">Conferma</a>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<span class=\"js-cookieBarSelected\"/>/<span class=\"js-cookieBarSelectable\"/>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"selezionati-right\">\n\t\t\t\t\t<table id=\"tableCookie\" class=\"js-cookieBarExplain\">\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th/>\n\t\t\t\t\t\t\t<th>Nome / A cosa serve</th>\n\t\t\t\t\t\t\t<th>Scadenza</th>\n\t\t\t\t\t\t\t<th>Proprietario</th>\n\t\t\t\t\t\t\t<th>Dati inviati in</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>')
我期待看到正确的 UI 出现,但我又一次得到了错误的结果。 所以我从 chrome 控制台执行那两条 javascript 行,将 html 添加到主体中。 附加的 HTML 与我要求附加的不同,我在生产中看到的问题被转载:
<div class="js-cookieBar cookieLaw" id="cookie_bar_main_body">
<div class="js-cookieBarDescription cookiebar">
<div class="cookie-panel">
<div class="left">
<span class="heading">Questo sito <br>utilizza cookie</span>
<p>Per garantirti la migliore esperienza sul nostro sito in termini di funzionalità, accessibilità, usabilità e prestazioni nonché per ricordare le tue preferenze, ti invitiamo ad installare i cookie opzionali cliccando sul pulsante "Accetta tutti". Se desideri invece gestire le singole opzioni, clicca sul tasto "Impostazioni"</p>
</div>
<div class="right">
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"></i></a><i class="arrow down">
<a class="js-cookieBarAcceptAll button">Accetta tutti</a>
</i></div><i class="arrow down">
</i></div><i class="arrow down">
</i></div><i class="arrow down">
<div class="js-cookieBarDetail cookiebar">
<div class="cookie-panel selezionati">
<p>Vogliamo essere trasparenti sui dati che noi e i nostri partner raccogliamo e sul loro utilizzo, in modo che tu possa averne un controllo ottimale.<br>Per ulteriori informazioni, visita la <a class="js-privacyLink">privacy policy</a> e la <a class="js-policyLink">cookie policy</a>.</p>
<div class="box-selezionati">
<div class="selezionati-left">
<ul class="js-cookieBarList">
<div class="selezionati-bottoni">
<div class="js-cookieBarChecks">
<a class="button button-small rifiuta js-cookieBarDeclineAll">Rifiuta tutti</a>
<a class="js-cookieBarSave button button-small">Conferma</a>
<p>
<span class="js-cookieBarSelected">/<span class="js-cookieBarSelectable">
</span></span></p>
</div>
</div>
<div class="selezionati-right">
<table id="tableCookie" class="js-cookieBarExplain">
<tbody><tr>
<th>
</th><th>Nome / A cosa serve</th>
<th>Scadenza</th>
<th>Proprietario</th>
<th>Dati inviati in</th>
</tr>
</tbody></table>
</div>
</ul></div>
</div>
</div>
这里是差异:
好像我的 escaping 有什么东西坏了,或者有什么东西拦截了附加指令并改变了内容(很奇怪,即使我 运行 来自的指令也发生了chrome 逐步调试控制台,因此不应在追加之后触发任何指令)。 有人可以向我解释是什么导致了这种奇怪的行为吗?
因为您的 html 无效,span 或 i 标签的成对结束标签在哪里?
无效:
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"/></a>
有效:
<a class="js-cookieBarInfoButton link">Impostazioni <i class="arrow down"></i></a>
你的html完全坏了,你可以在验证器中检查你的html,例如here