【问题标题】:How can I add a jQuery Dialog for each row in an HTML table如何为 HTML 表中的每一行添加一个 jQuery 对话框
【发布时间】:2011-01-07 02:54:51
【问题描述】:

我正在使用 PHP(使用 codeigniter 框架)生成一个 HTML 表,并且我正在尝试添加一个链接,该链接将打开一个 jquery 对话框,其中包含特定于该行的一些信息。类似于“更多信息”类型的链接,只是打开对话框。

当我将对话框 div 添加到该行并将所需信息封装在其中时,它会破坏表格(表格中不能有 div)。

另外,我似乎需要添加未知数量的 jquery 对话框函数声明......我假设需要某种函数以及打开对话框的元素的 ID 以及用于对话框将被传递给函数。但是,对于这样的事情,似乎应该在 jQuery 中内置一些东西。

我是否遗漏了什么,如果有,是否有人有任何提示可以让我指出正确的方向?

【问题讨论】:

  • 您为什么不按需创建一个对话框并根据相关行用正确的信息填充它?像这样创建 x 对话框似乎效率很低。
  • 您能否提供一个屏幕截图或 url 示例,说明您说对话框时的想法?

标签: php jquery codeigniter


【解决方案1】:

将信息作为元数据嵌入到行中,例如...

<tr data-foo="additional data here" data-bar="even more data">…</tr>

在你的 javascript 中,一个叫做 .live() 的小魔法:

$('#your_table .show_dialog').live('click', function(){
  var data_for_dialog = {
    foo: $(this).closest('tr').attr('data-foo'),
    bar: $(this).closest('tr').attr('data-bar')
  }

  show_dialog(data); // your own code to show the dialog
});

您有一个带有“show_dialog”类的&lt;a&gt; 标记。请注意,如果您有很多属性或其中任何一个包含需要包含换行符的数据,这不是很有效。您可以通过在 &lt;tr&gt; 上定义的 iterating over each attribute 并自动包含以 data- 开头的属性来改进这一点。不过,这超出了这个问题的范围。

就显示对话框而言,这样的内容就足够了:

function show_dialog(data) {
  var $dialog = $('#dialog');
  for(var attr in data) {
    $dialog.find("." + attr).html(data[attr]);
  }
  $dialog.show();
}

<div id="dialog">
  <p class="data-foo"></p>
  <p class="data-bar"></p>
</div>

这是未经测试的,但应该足以说明正在发生的事情。

注意:您可以在 HTML5 中定义自定义属性,只要它们以“data-”为前缀,因此会在上面的任何地方显示。

【讨论】:

  • 在非 HTML 5 浏览器中运行会不会有问题?
  • 一点也不。大多数 HTML5 的实际规范更改记录了浏览器中的现有功能并标准化了行为。这是这些领域之一。您可以随意使用任何您喜欢的属性,但以数据为前缀的属性将不会在未来发生行为变化。
  • 效果很好!做了一些细微的修改,但之后就完美了……谢谢!!
【解决方案2】:

我同意 Tomalak 的评论,即使用一个盒子并更改其中的内容。 如果您想做我认为您正在尝试做的事情(没有看到您的代码),似乎您可能会将对话框 div 放在 &lt;table&gt; 标签而不是 &lt;td&gt; 标签中,这将是第一件事检查。

其次要打开对话框,您只需引用链接旁边的 div:

<table>
  <tr>
    <td>
      <span class="MoreInfo">More info</span>
      <div>stuff for dialog</div>
    </td>
  </tr>
</table>

$(document).ready(function(){
    $('.MoreInfo').next().dialog({ autoOpen: false })
    $('.MoreInfo').click(function(){
         $(this).next().dialog('open');
    });
});

编辑:抱歉搞砸了 Jquery 我假设您使用的是 JqueryUI Dialog

【讨论】:

  • 谢谢 Kumu,我认为这将完全按照我的需要工作......但是,.click(function(){ 有问题......我知道它在前面正确设置了对话框声明,因为如果我将 autoOpen 设置为 True,它会在页面加载完成时触发。但是,我无法弄清楚为什么对话框不会在点击时打开。如果我在其中放置警报,它会触发('MoreInfo')。点击,所以我知道它正在捕获事件。有什么建议吗?
  • 哦,是的,我正在使用 jQueryUI 对话框
  • 我不建议这样做。您在准备好文档时可能会初始化数百个 jQuery UI 对话框,这将对性能产生影响。更不用说,它不是很优雅。
  • 是的 - 我确实注意到对话框初始化时加载时间明显滞后。我根本不是 jQuery 或 Javascript 大师,也不知道如何在您的答案中使用该技术。今晚我再试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多