【问题标题】:jQuery, update content when necessaryjQuery,必要时更新内容
【发布时间】:2013-05-28 12:45:42
【问题描述】:

我正在尝试更新位于 div (div1) 中的聊天内容,但仅当 div1 的内容发生更改时(一条消息已提交到 db 并在 div1 中提取)。

我尝试了 here 的解决方案,但我的 get 无法比较数据。

此解决方案完美运行,但没有内容比较:

window.onload = startInterval;
function startInterval()
{
    setInterval("startTime();",2000);
}

function startTime()
{
    jQuery('#div1').load('index.php #div1 > *');
}

这是基于this的修改,失败:

window.onload = startInterval;
function startInterval()
{
    setInterval("startTime();",2000);
}

function startTime()
{
    var $main = $('#div1');
    $.get('chat.php #div1', function (data)
    {
        if ($main.html() !== data) $main.html(data);
    }); 
}

我尝试了对这段代码的各种修改,但无济于事...... 我无法重新加载整个页面,如果没有必要,我也不想这样做,因为如果您必须滚动浏览消息,这会使聊天更难阅读。 如何解决这个问题?

更新

根据@T.J 的建议,我修改了现在完美运行的代码:

window.onload = startInterval;
function startInterval()
{
    setInterval(startTime,3000);
    scrolDown();
}

function startTime()
{
    var $main = $('#div1');     
    $.get('#div1', function (data)
    {
        elements = $(data);
        thisHTML = elements.find("#div1").html();
        if ($main.html() !== thisHTML) {                
            $main.html(thisHTML);
            scrolDown();
        }           
    });     
}

另一个问题是获取所需的库:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>

这显然不是我之前使用的负载所需要的。

【问题讨论】:

  • 旁注:不要将字符串传递给setTimeoutsetInterval。使用setInterval(startTime,2000);(传递函数引用),而不是setInterval("startTime();",2000);(传递字符串)。
  • 您的第一次(成功)尝试从 index.php 中提取,第二次不成功从 chat.php 中提取,这些页面是否正确?
  • 那些页面应该是一样的,只是我在简化代码时犯了一个错误。

标签: javascript jquery html get load


【解决方案1】:

您想使用get,但又想要load 的片段功能,所以您必须自己完成这项工作。然后记住你上次得到了什么,只有不一样才更新:

var lastHTML;

function startTime()
{
    var $main = $('#div1');
    $.get('chat.php', function (data) // <== Or index.php, the question has both
    {
        var elements, html;

        // Turn the HTML into elements
        elements = $(data);

        // Get the HTML of *only* the contents of #div1
        html = elements.find("#div1").html();

        // If that has changed, use it
        if (lastHTML !== thisHTML) {
            lastHTML = thisHTML;
            $main.html(thisHTML);
        }
    }); 
}

请注意,这是片段功能的一个相当基本的实现(例如,它不会像 load 那样去除脚本)。您可能想看看 load 如何处理其片段内容并复制它(开源的乐趣)。

【讨论】:

  • 感谢您抽出宝贵时间,但问题可能出在其他地方,因为我什至无法从 get 内部运行 alert('test') (在它之外运行良好)。我的整个代码:pastebin.com/fjWHHiu7 它是对 joomla 模块的修改。该站点的完整路径是 www.example.com/index.php/sim-chat
  • @Roman:基本上,如果load 有效,get 将有效。我认为这一定是您在从 load 切换到 get 的同时更改了一些 other 变量。
  • @"T.J."你能看看整个代码吗? pastebin.com/fjWHHiu7 经过几个小时的努力,我真的没有想法...... startTime() 函数的第一部分(在 cmets 中)工作正常 - 没有内容检查。
  • @Roman:出于各种原因,代码应始终在 SO,而不是外部站点上。我确实看了一下,大概sim-chat 不是来自运行它的页面的有效相对URL,所以请求失败,所以自然不会调用成功回调。在 JavaScript 控制台中查看错误,并查看 $.ajax 中的 error 函数($.get 只是 $.ajax 的简写,请参阅 the docs 了解如何将 $.get 转换为 $.ajax 以便您可以使用所有选项0。
  • 那个链接没问题,另一个问题是缺少js库引起的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多