创buildHTML:PHP服务器端与jQuery客户端

这是一个devise问题。 我有需要进入HTML表格的数据,稍后将由用户操纵。 基本上用户将能够select表格行中的项目。

我有两个select – 在这两种情况下,我使用AJAX来获取数据:

  1. 使用PHP在服务器端创buildHTML代码,将其作为HTML发送给客户端。 然后用户使用JavaScript(本质上是jQuery)来操纵表格。

  2. 使用JSON将原始数据发送到客户端,然后使用jQuery创buildHTML,然后由用户对其进行处理。

从devise/易编码/美观的angular度来看,推荐哪种方法? 感谢您的任何见解。

为什么要在PHP中生成HTML:

  • JavaScript应该定义行为,而不是内容。
  • 在JavaScript中创build需要更多的标记(多行string不像在PHP中那么容易)。
  • 如果你的HTML是在几个地方生成的(PHP&JS),那么很难保持它。
  • 您可以使用jQuery的DOM操作函数来创build您的HTML,但是长远来看,您正在拍摄自己的腿。
  • 在服务器上创buildHTML比在浏览器上更快(从计算的意义上讲)。
  • 使用PHP循环更容易 – 生成表格标记很容易。
  • 如果用户在页面加载时输出标记,则JavaScript保持禁用状态,则保留某种兼容性。

为什么要在jQuery中生成HTML:

  • 你会节省一些带宽。
  • 绑定事件可能更简单。

所以,我赞成第一个选项,在PHP中生成HTML。


两种方法的视觉对比,创build一个简单的表格。

选项1,使用PHP:

// PHP $html = '<table>'; foreach($data as $row) { $html .= '<tr>'; $html .= '<td><a href="#" class="button">Click!</a></td>'; $html .= '<td>'.$row['id'].'</td>'; $html .= '<td>'.$row['name'].'</td>'; $html .= '</tr>'; } $html .= '</table>'; echo $html; ?> // jQuery $('#container').load('handler.php', function() { $('#container a.button').click(function() { // Do something }); }); 

选项2,使用jQuery:

 // PHP echo json_encode($data); // jQuery $.ajax({ url: 'handler.php', dataType: 'json', success: function(data) { var table = $('<table />'); var len = data.length; for(var i = 0; i < len; i++) { var row = $('<tr />'); var a = $('<a />').attr('href', '#').addClass('button'); row.append($('<td />').append(a)); row.append($('<td />').html(data[i].id); row.append($('<td />').html(data[i].name); table.append(row); } table.find('.button').click(function() { // Do something }); $('#container').html(table); } }); 

从devise/编码/美观的angular度来看,我肯定会说PHP的方法。

为什么返回生成的HTML代替JSON是一个不好的做法? 还是呢? 在这个线程中没有提到一些好点。

如果生成的HTML与页面HTML相同,则可以利用现有的模板代码生成相同的HTML,而代码重复性较低。

否则,JSON通常更为常见,因为它往往更加紧凑,它允许您创build节点并随时为其分配非HTML属性(如事件处理程序)。

但是,如果通过创buildHTMLstring来创build新节点,则必须使用HTML编码来确保任何<&引号都能正确转义。 没有内置函数可以在PHP中像htmlspecialchars一样在JavaScript中执行此操作; 写一个是很微不足道的,但似乎没有人打扰。 结果是jQuery应用程序充满了客户端的跨站点脚本安全漏洞,就像我们开始在修复服务器端XSS方面取得一些进展一样。

同样可以为两者提出相当有说服力的论点,但是如果你用2来做,你可能会把更less的数据放在pipe道中。

我真的很喜欢把这样的东西放在客户端的想法。 我发现JavaScriptMVC是一个很好的框架(2.0版本基于jQuery),因为它具有客户端视图模板(尽pipe不是每个人都喜欢这种方法)。

单独使用jQuery,我发现创build客户端视图相当复杂(因为这不是意味着什么),所以如果你能保持你的应用程序同样dynamic,那么你可能会更好地把所有东西放在一起在PHP的服务器端那样。

这两个选项都有正面和负面的点,但是,安德拉斯说明内容是否需要索引/search是一个很好的观点。 我个人会select选项1,因为我相信这个架构会更容易生成。