为什么不是';t一个.post和.html调用能够在jQuery中的if(条件)中进行比较


Why isn't a .post and .html call able to compare in an if(condition) in jQuery?

创建以下脚本是为了测试db字段的值是否已更改,如果已更改,则重新加载页面,如果未更改,则提醒用户尚未发生更改。

警报只是为了查看.post函数返回了什么。

auto_refresh运行良好,因为我需要它每5秒检查一次,当if()条件设置为"=="时,将显示页面警报,如果设置为"!=="页面不断地重新加载。

jQuery.post正在获取数据库字段数据,但似乎无法正确比较这两个值。

任何帮助都将不胜感激,谢谢

var auto_refresh = setInterval(function(){
    $.post("/index.php/listen", function(data) {
          if($('#slide').html() != data)
            {
               window.location.reload()
            }
            else
            {
               alert('its the same'+ data);
            }
          });
    }, 5000);

编辑

与其试图解析原始数据,不如从$.post()中传递HTML,比如:

<p>4</p>

然后jQuery插入并用$.post()中的新版本替换p标记因为html是传递的,所以没有空白,可以正确地进行比较。

我认为将新值与html进行比较不是很安全。某些浏览器可能会添加空格或不需要的字符。我会尝试将旧值保存在隐藏类型的输入中,并在变量中使用.val(),或者更好地使用事件。这取决于你的情景。

If$('#slide').html()==数据

那么这意味着条件失败了,它不相等,所以它显示了警报。

问题是,数据变量可能会返回一些额外的空白。若我是你们,我会尝试在滑块中解析一小段数据变量和一小段html,并比较这些值。

就像如果滑块在p标记或输入值中有东西一样,将其与数据进行比较,看看它是否在该p标记或输出值中返回了相同的值,然后用空字符串替换所有空格,以确保安全。

顺便说一句,尽量不要使用提醒,因为你不能真正确定是否有多余的空白。如果在visualstudios中使用IE,请尝试使用类似"调试器"的东西,或者使用chrome或firefox时使用console.log。

您正在比较两个html字符串:一个是从DOM序列化的,另一个是来自服务器响应。

无法保证这两个字符串将永远相同!想想看:同一个渲染的html可能有很多字符串差异。例如,<a href="/file"> click </a><a href="http://example.org/file">click</a>都是相同的HTML,但字符串不同。

你可以在这里采取两种不同的方法:

  1. 您可以创建某种规范化例程,以确保您认为"相同"的两个html片段具有相同的字符串形式。通过该例程运行两个html碎片,然后进行比较
  2. 您可以更明确地管理版本。
    1. 包括某种版本指示器:
      1. 您可以使用ETAG标头(这意味着您可以利用http缓存机制)
      2. 您可以在html本身中包含某种版本号(可能在data-version属性中),并对它们进行比较
    2. 您可以将服务器中的html字符串单独保存,并与之进行比较