我碰到这个问题不断地在开发AJAX应用程序。 比方说,我希望用户能够点击与我的网站上,这导致了AJAX请求每个评论关联的“标志”的图标被发送到服务器,请求注释进行标记。 我需要让AJAX请求可以对标志,该标志评论服务器进行通信,以评论的ID与客户端的评论联系起来。
此页面介绍了一些方法,以这种方式注释HTML,但他们都不是很理想。 虽然我可以只使用一个ID或类属性来评论ID旗按钮(比如:id =“comment_1998221”)相关联,这将失败,更复杂的数据不很好地成为这些属性(例如,任意的字符串)。 是否有这样的事情最好的做法? 每次我需要这样做,我最终喜欢使用id属性,一个隐藏的表单字段,或者更糟糕的是设置为显示跨度一些杂牌:无。
在HTML5数据 - *属性似乎是一个完美的解决方案,但我已经看到了很多的敌意向他们,这使我认为人们必须拥有他们满意的解决方案。 我很想知道它是什么。
此页面介绍了一些方法,以这种方式注释HTML,但他们都不是很理想。
尽管如此,他们是几乎所有你已经有了。 虽然该页面是不是一个非常好的总结,也有错误,这错误地理解什么是不显眼的“JavaScript的意思。
例如,它实际上是完全有效的把一个脚本元素体内 - 只是没有直接的表元素中。 你可以把所有的脚本片段在表的底部,或把每一行中自己的表,甚至,有一些限制,如果你正打算变更DOM,在讨论的行内。
设置“ID =‘评论-123’,”然后开始“comment-”的ID扫描所有行的是你的具体情况确实不错。 对于设置非识别额外的信息属性,你可以使用任何HTML5数据属性或使用例如,它攻入类名。 “类=‘评论类型FOO杠数据’”。 当然,这两个ID和类名有他们了解您可以使用哪些字符的限制,但它可以为任何字符串下来编码为有效的字符串。 例如,你可以使用自定义URL式编码隐藏非字母数字字符:
<tr class="greeting-Hello_21_20_E2_98_BA">
...
</tr>
function getClassAttr(el, name) {
var prefix= name+'-';
var classes= el.className.split(' ');
for (var i= classes.length; i-->0;) {
if (classes[i].substring(0, prefix.length)==prefix) {
var value= classes[i].substring(prefix.length);
return decodeURIComponent(value.split('_').join('%'));
}
}
return null;
}
var greeting= getClassAttr(tr, 'greeting'); // "Hello! ☺"
你甚至可以复杂的非字符串值存储在这种方式,通过编码它们的JavaScript或JSON字符串,然后使用EXEC检索它们(或JSON.parse如果有的话)。
但是,如果你是把什么不平凡的在那里它很快就会变得混乱。 这就是你可能更喜欢评论。 您可以在这里除了序列适合什么“ - ”,这是很容易逃脱如果它发生拿出一个字符串。
<table>
<tr class="comment">
<td>...</td>
<!-- {"id": 123, "user": 456} -->
</tr>
</table>
function getLastComment(node) {
var results= [];
for (var i= node.childNodes.length; i-->0;)
if (node.childNodes[i]==8)
return node.childNodes[i];
return null;
}
var user= getLastComment(tr).user;
摘要警告说,这可能无法保证正常工作,因为XML解析器可以丢弃的意见,但随后DOM Level 3的LS解析器必须在默认情况下让他们和每一个浏览器和主要的XML库至今呢。
jQuery的数据API是这个漂亮。
假设你有以下DOM ...
<div class="comment">
<a href="#">Flag</a>
Some text
</div>
然后,假设你还装载阿贾克斯这些元素,你可以做
$(".comment").data('someKey', (any javascript value/object));
再后来,在点击处理程序的标志,你可以做...
$(".flagSelector").click(function(ev) {
var extraData = $(this).closest(".comment").data("someKey");
// use extraData along with your request
});
如果您正在生成服务器端的意见,并与初始页面运输他们,你需要弄清楚如何初始化数据。 一种方法是将有唯一的ID-S的意见,并在页面加载,还是从阿贾克斯服务器加载自定义数据。
下面是我会怎么做:
当渲染页面的服务器端,生成标志链接作为一个正常的链接,这样,它会正常工作,如果你启动Javascript没有。
<a class="flag_link" href="/comment/123/flag/"><img src="flag.gif" /></a>
然后,在JavaScript中,添加一个click事件通过Ajax来做到这一点,而不是。 我将使用jQuery我的例子,但同样的事情并不难离不开它。
<script>
$('a.flag_link').click(function() {
$.get($(this).attr('href'), function() {
alert('you flagged this comment');
});
});
</script>
当然,你会做一些更人性化不是一个警报信号的成功。
文章来源: How should I associate server-side data with client-side UI elements in HTML?