【问题标题】:Parse HTML in jquery through ajax into elements and replace each corresponding on page通过ajax将jquery中的HTML解析为元素并替换页面上的每个对应
【发布时间】:2013-02-08 02:05:17
【问题描述】:

我在 HTML 页面上有以下内容:

<script type="text/javascript">
setInterval(function(){refresh()},5000);
function refresh()
{
    $.post("test.php",
    {
           // nothing here             
    },
    function(data, textStatus)
    {      

      $('' + data + '').find('.maindiv').each(function () {
      $('.maindiv').replaceWith('.maindiv');
      });

    });  
}
</script>

<div id = "1" class= "maindiv">
<div sid= "1" class= "subdiv">old sub div content</div>
<div cid= "1" class= "childdiv">another old sub div</div>
<img id = "1" src="http://foo.com/bar.png"/>  
</div>

<div id = "2" class= "maindiv">
<div sid= "2" class= "subdiv">this content is old</div>
<div cid= "2" class= "childdiv">please update me!</div>
<img id= "2" src="http://foo.com/bar.png"/>  
</div> 

被调用以更新元素的 PHP 页面 (test.php):

<?php

 echo '<div id = "1" class= "maindiv">
       <div sid= "1" class= "subdiv">this is new sub div</div>
       <div cid= "1" class= "childdiv">this is also new sub div content</div>
       <img id= "1" src="http://foo.com/bar.png"/>  
       </div>'; 

 echo '<div id = "2" class= "maindiv">
       <div sid= "2" class= "subdiv">new content</div>
       <div cid= "2" class= "childdiv">new content for this child div</div>
       <img id= "2" src="http://foo.com/bar.png"/>  
       </div>'; 
?>

这两个元素也出现在 HTML 页面上。基本上我想调用 PHP 页面并从 PHP 页面获取这些元素并在 HTML 页面的响应中循环遍历它们,并将每个 maindiv(包括其所有子元素)替换为 HTML 页面上的相应元素。

这只是一个非常基本的例子。我这样做是因为这些元素中的内容发生了变化,并且想要替换实时更新等元素。

我发布的功能似乎没有响应,所以不知道如何实现。

提前致谢

【问题讨论】:

  • 虽然我相信它在 HTML5 中是允许的,但在某些浏览器中使用以数字开头的 id 是行不通的。
  • 我必须使用数字来唯一,因为页面上有很多交互,所以它们必须是唯一的......无论如何感谢您指出这一点@popnoodles
  • 您不能在它们前面加上一个非数字字符串?无论如何,至少你知道。
  • 在解决了上述问题后可以这样做:)
  • 这些 HTML 块看起来非常相似。如果这就是它们看起来最有效的方法,那么最有效的方法是使用模板并仅返回替换模板中占位符所需的数据。

标签: php javascript jquery html ajax


【解决方案1】:

您需要索引页面中的maindiv 元素,以便它们与新元素匹配。

还需要修改要替换的内容

 $(data ).filter('.maindiv').each(function (index) {/* filter or find depends on html structure sent*/
      /* "this" is the current div in response*/          
      $('#'+this.id).replaceWith(this);
});

each 将跟踪indexeq() 用于匹配页面中的相同索引。

编辑:如果只有输出是输出根目录中的 DIV,也将 find() 更改为 filter()

【讨论】:

  • 该函数可以工作,但出现了一些问题,因为它与被替换元素的id 不匹配,只是将第一个元素替换为maindiv 类。例如,如果在 HTML 页面上我有 ids 3、2 和 1,而我在 PHP 页面上只有 id 1..如果我使用这样的函数,它将用 id 1 替换页面上的 id3因为 id 3 是第一个出现的maindiv
  • 好的,我修改了答案以匹配 ID
  • 这现在效果很好:) 最后一个问题,如果我有一个名为 maindiv 的元素,就像上面发布的那样,但有另一个名为 gid 的属性,例如而不是常规 id,如何替换那些也?? (有些元素可能有id,而另一些元素可能有gid,但它们的编号相同......那么替换两者怎么样??
  • 尝试添加 $('#'+this.gid).replaceWith(this); 但它不起作用
  • 不,对不起,你不明白我的意思...我的意思是它只使用 id,我怎样才能让它使用自定义属性而不是常规 id??
【解决方案2】:

为什么您没有 1 个 div 围绕您要轮询的内容,然后在收到 ajax 响应时将整个块替换为 html()

<?php 
//check for ajax and return
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'){
    header('Content-Type: text/html');

    $response = '
    <div id = "a" class= "maindiv">
       <div sid= "1" class= "subdiv">'.date("D M j G:i:s T Y").'</div>
       <div cid= "1" class= "childdiv">'.md5(time()).'</div>
       <img id= "1" src="http://foo.com/bar.png"/>  
    </div>
    <div id = "a" class= "maindiv">
       <div sid= "1" class= "subdiv">'.date("D M j G:i:s T Y").'</div>
       <div cid= "1" class= "childdiv">'.md5(time()+1).'</div>
       <img id= "1" src="http://foo.com/bar.png"/>  
    </div>'; 

    echo $response;
    die;
}
?>

<script type="text/javascript">
function poll(){
    setTimeout(function(){
        $.ajax({ url: "./test.php", cache: false,
        success: function(data){
            $("#polling").html( data );
            poll();
        }});
    }, 5000);
}
$(document).ready(function(){
    poll();
});
</script>


<div id = "polling" class= "maindiv">
    <!--New response will replace the below html-->
    <div id = "1" class= "maindiv">
    <div sid= "1" class= "subdiv">old sub div content</div>
    <div cid= "1" class= "childdiv">another old sub div</div>
    <img id = "1" src="http://foo.com/bar.png"/>  
    </div>

    <div id = "2" class= "maindiv">
    <div sid= "2" class= "subdiv">this content is old</div>
    <div cid= "2" class= "childdiv">please update me!</div>
    <img id= "2" src="http://foo.com/bar.png"/>  
    </div> 

</div>

编辑

也可以返回json,然后根据id将响应循环到div中 这是一个例子:

<?php 
//check for ajax and return
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'){
    header('Content-Type: application/json');

    $response = array(
    'block_a'=>'content for block a (last_updated:)'.date("D M j G:i:s T Y"),
    'block_b'=>'content for block b (last_updated:)'.date("D M j G:i:s T Y"),
    'block_c'=>'content for block c (last_updated:)'.date("D M j G:i:s T Y"),
    'block_d'=>'content for block d (last_updated:)'.date("D M j G:i:s T Y"),
    'block_e'=>'content for block e (last_updated:)'.date("D M j G:i:s T Y"),
    ); 

    echo json_encode($response);
    die;
}
?>


<script type="text/javascript">
function poll(){
    setTimeout(function(){
        $.ajax({ url: "./test.php", cache: false,
        success: function(data){
            $.each(data, function(k, v) {
                //key value place html blocks
                $("#"+k).html(v);
            });
            poll();
        }, dataType: "json"});
    }, 1000);
}

$(document).ready(function(){
    poll();
});
</script>


<div id = "block_a" class= "maindiv"></div>
<div id = "block_b" class= "maindiv"></div>
<div id = "block_c" class= "maindiv"></div>
<div id = "block_d" class= "maindiv"></div>
<div id = "block_e" class= "maindiv"></div>

这样您就可以构建$response,在每次投票时只替换您想要替换的内容。

【讨论】:

  • 因为这只是一个非常基本的示例 :) 我实际上想发送唯一的某些 id,例如发送 1,2,3,4 中的 2,4 并更新这些2,4 元素及其新内容,因此需要特定于 id 的响应
  • 感谢您的努力,劳伦斯...为了简单起见,我选择了查理的答案...谢谢 :)
猜你喜欢
  • 2016-05-24
  • 2011-10-29
  • 2015-08-10
  • 2010-10-03
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2021-03-13
相关资源
最近更新 更多