【问题标题】:jQuery's replaceWith() CSS alignment not same as exact same straight codejQuery 的 replaceWith() CSS 对齐方式与完全相同的直接代码不同
【发布时间】:2012-01-02 11:09:54
【问题描述】:

这是我遇到的一个非常奇怪的问题,我不确定要在此处粘贴什么代码,因为代码很多,所以我想我真的在寻找理论上的解决方案。

基本上,我使用 jQuery 的 replaceWith() 在用户登录后将内容添加到框中。它添加的代码与 php 页面吐出的代码完全相同(检查用户是否已登录)。这样做是为了当他们登录时,jQuery 添加他们的内容,但如果他们刷新或移动到网站上的另一个页面,它应该完全相同。

这主要是可行的,除了一些表单元素在 jQuery 替换内容后看起来不对齐。刷新页面后,它们会按照应有的方式对齐。

任何想法可能会发生什么?我浏览了 Chrome 的开发工具,查看了这些元素及其周围元素的 CSS 边距以及边距/填充等完全相同,但在刷新之前显示很奇怪!!

这让我发疯了 - 以前有人见过这种行为吗?

干杯,

斯科特

屏幕截图可能会有所帮助 -

下面是代码示例:

<?php
    echo '<div id="accountpanel">
            <div id="selectclientbox">
              <form id="formSelectClient" action="" onsubmit="return false;">
                  <select id="selectClient">
                      <option>Client 1</option>
                      <option>Client 2</option>
                      <option>Client 3</option>
                      <option>Client 4</option>
                  </select>
                  <select id="selectAttribute">
                      <option>Change ID</option>
                      <option>Change Userame</option>
                      <option>Change Password</option>
                      <option>Change Name</option>
                      <option>Change Email Address</option>
                  </select>
                  <input id="changeDetail" class="coolbox" type="text" size="38" maxlength="128" />
                  <input id="updatebtn" type="button" value="update" onclick="updatedetail()" />
              </form>
              <form id="formUpdateClient" action="" onsubmit="return false;">

                  <section>
                      <label for="changeCurrency">Currency</label><input id="changeCurrency" class="text" type="text" maxlength="1" />

                      <input id="updatebtn2" type="button" value="update" onclick="updatecost()" />
                  </section>
              </form>
          </div>
    </div>';
?>

<div id="accountpanel2">
</div>
<script type="text/javascript">
            $('#accountpanel2').replaceWith('<div id="accountpanel2">' + 
                '<div id="selectclientbox">' +
              '<form id="formSelectClient" action="" onsubmit="return false;">' +
                  '<select name="">' +
                      '<option>Client 1</option>' +
                      '<option>Client 2</option>' +
                      '<option>Client 3</option>' +
                      '<option>Client 4</option>' +
                  '</select>' +
                  '<select name="">' +
                      '<option>Change ID</option>' +
                      '<option>Change Userame</option>' +
                      '<option>Change Password</option>' +
                      '<option>Change Name</option>' +
                      '<option>Change Email Address</option>' +
                  '</select>' +
                  '<input id="changeDetail" class="coolbox" type="text" size="38" maxlength="128" />' +
                  '<input id="updatebtn" type="button" value="update" onclick="updatedetail()" />' +
              '</form>' +
              '<form id="formUpdateClient" action="" onsubmit="return false;">' +

                  '<section>' +
                      '<label for="changeCurrency">Currency</label><input id="changeCurrency" class="text" type="text" maxlength="1" />' +
                      '<input id="updatebtn2" type="button" value="update" onclick="updatecost()" />' +
                  '</section>' +
              '</form>' +
          '</div>');
</script>

【问题讨论】:

  • 您是否使用任何自定义表单输入的 js?
  • 我没有使用js修改整个accountPanel DIV上的fadeIn()以外的任何CSS,所以我认为这不是答案。不过还是谢谢。
  • 你能链接到这个网站吗?没有链接,任何人都不太可能提供帮助。
  • 不容易,因为它是一个登录系统,问题只出现在管理员帐户上:p

标签: jquery css alignment replacewith


【解决方案1】:

好的,看看您的示例代码,我发现您用于呈现页面的 HTML 与“注入”的代码之间存在很大差异。

在 JavaScript 字符串中,您的构造看起来像这样(这只是一个示例,可能不是导致问题的确切行):

'<select name="">' +
  '<option>Change ID</option>' +
  '<option>Change Userame</option>' +
  '<option>Change Password</option>' +
  '<option>Change Name</option>' +
  '<option>Change Email Address</option>' +
'</select>' +

在 HTML 中是这样的:

   <select name="">
     <option>Change ID</option>
     <option>Change Userame</option>
     <option>Change Password</option>
     <option>Change Name</option>
     <option>Change Email Address</option>
  </select>

解析器的结果是两个非常不同的东西,因为非 JavaScript 有大量的空白和每个元素之间的carrage return + line feed。

这与我所描述的相反——看来你需要留白才能让它看起来正确。

有两种方法可以立即浮现在脑海中。 1) 将您的 HTML 模板存储在脚本标签中。我喜欢这样,因为它使它们易于编辑,并且您不必在每一行处理大量引号和加号。或 2) 在每行末尾的末尾引号和加号之前至少添加一个空格。


是的,我在很多年前就看到了,追踪到标签结束和标签开始之间的空格。应该没关系,但确实如此。

我有这样的事情

..</tag1> <tag2>...

并改成

..</tag1><tag2>...

它解决了这个问题。

我似乎记得这在 IE 和列表元素中更常见——但我可能记错了。

【讨论】:

  • 好主意,我会检查并回复你!
  • 我真的认为这是答案,因为它完全有道理,但不幸的是它不是。要插入到 replaceWith 中的每一行 HTML 都在自己的行上,没有空格。回到绘图板 :( 不过谢谢。还有什么想法吗?
  • 你能显示通过php和javascript插入的html(查看源代码)吗?
  • 我不认为我可以,因为当您使用“查看源代码”时,它本质上会获取站点的新副本(与刷新相同),因此您无法区分两个输出。我试过这个并且差异说它们是相同的(除了我知道不同,因为我使用了fadeIn()所以一些元素具有“display:block”的内联样式标签,我最初将它们全部放在外部CSS中)。我尝试使用 chrome 的开发工具来复制当前的 html,但它不会让我选择多于一行。任何想法如何获取实时代码?
  • 啊,我想查看 php 的查看源代码,然后查看 javascript -- 我知道更改后我们无法查看源代码(chrome 会在“检查元素”中显示一些内容” 页。
猜你喜欢
  • 2012-09-26
  • 2014-06-01
  • 2012-10-14
  • 2011-10-07
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多