1

目前我正在尝试比较两个变量,newhtml并且oldhtml. 我使用以下方法获取旧的 html:

var oldhtml = $('#pop').html();

我使用以下方法获取新的 html:

var newhtml = ("<%= escape_javascript render(:file => 'shared/_content') %>");

然后我尝试使用以下方法比较它们:

if(newhtml == oldhtml)
{
  //is never called
  $('#pop').hide();
}
else
{
  //is always called
  $('#pop').html(newhtml);
}

但它不起作用。在这种情况下,oldhtml变量实际上只是前一个newhtml变量。因此,如果您单击主页上的相同内容,newhtml实际上应该只是 ruby​​ on rails 生成的版本oldhtml(中存在的 html <div id="pop">)。我尝试将它们附加以查看差异所在,但对我来说它看起来完全一样。我希望有人能把我推向正确的方向吗?谢谢!

4

5 回答 5

2

我会尝试将 newhtml 放在隐藏的 DOM 元素中,然后从 jquery 中取回该内容.html()

$('#HiddenDOM').html(newhtml);

if ($('#HiddenDOM').html() === $('#pop').html()) { ... }

未经测试,但可能会消除 html 呈现问题。

此外,对 javascript: 使用三等式比较,===而不是==. 有关解释,请参阅 youtube 上 Javascript The Good Parts 上的 Cockford。

总体而言,我会重新考虑您的设计,因为比较可能并不真正可行,并且会使您的架构暴露于各种浏览器之谜。有时,您首先必须找出什么不起作用才能找到有效的解决方案。

于 2012-05-08T01:50:44.170 回答
1

我不记得关于返回的 html 格式的任何保证html(),尤其是 whitepace。

但是,至少当我在 Firefox 中从页面中拉出一大块 HTML 时,出来的内容似乎与服务器发送的格式相同。

因此,字符串之间可能只有微不足道的区别,例如前导和尾随空格。尝试使用函数行 this 来比较两个 HTML 片段:

function compare_html(a,b) {
    a = a.replace(/^\s+/,"").replace(/\s+$/,"");
    b = b.replace(/^\s+/,"").replace(/\s+$/,"");
    return a == b;
}
于 2012-05-08T01:43:40.393 回答
1

jQuery 文档警告说,.html()“某些浏览器可能不会返回与原始文档中的 HTML 源完全相同的 HTML”。这也适用于动态插入的 HTML。

最好的办法是比较两个 javascript 字符串,这两个字符串都不是从 DOM 中读回的。

例如:

var newhtml = ("<%= escape_javascript render(:file => 'shared/_content') %>"),
    oldhtml = newhtml;

...

if(newhtml == oldhtml)
{
  $('#pop').hide();
}
else
{
  oldhtml = newhtml;
  $('#pop').html(newhtml);
}

毫无疑问,它比这更复杂,但我相信你明白了。

于 2012-05-08T01:45:53.220 回答
0

这一切都非常有帮助,我实际上将答案结合起来得到了一些有用的东西。最终的工作是这样的:

像以前一样获取oldhtml:

var oldhtml = $('#pop').html();

然后将新的 html 插入到 div 中:

$('#pop').html("<%= escape_javascript render(:file => 'shared/_content') %>");

之后,从 div 中获取 newhtml,就像我检索 oldhtml 一样:

var newhtml = $('#pop').html();

然后 if 语句起作用,但您要确保将 div 更改为无法从数据库中检索到的任意内容:

if(newhtml == oldhtml)
{
$('#pop').html("<h>toggled_off</h>");
$('#pop').hide();
}
else
{
$('#pop').html(newhtml);
}
于 2012-05-08T20:57:48.583 回答
0

剥离两个 html 的标签,然后与 == 进行比较

`var StrippedString = OriginalString.replace(/(<([^>]+)>)/ig,"");

于 2014-10-13T21:32:40.223 回答