我应该如何在HTML客户端的UI元素的服务器端数据相关联?(How should I associa

2019-07-03 17:41发布

我碰到这个问题不断地在开发AJAX应用程序。 比方说,我希望用户能够点击与我的网站上,这导致了AJAX请求每个评论关联的“标志”的图标被发送到服务器,请求注释进行标记。 我需要让AJAX请求可以对标志,该标志评论服务器进行通信,以评论的ID与客户端的评论联系起来。

此页面介绍了一些方法,以这种方式注释HTML,但他们都不是很理想。 虽然我可以只使用一个ID或类属性来评论ID旗按钮(比如:id =“comment_1998221”)相关联,这将失败,更复杂的数据不很好地成为这些属性(例如,任意的字符串)。 是否有这样的事情最好的做法? 每次我需要这样做,我最终喜欢使用id属性,一个隐藏的表单字段,或者更糟糕的是设置为显示跨度一些杂牌:无。

在HTML5数据 - *属性似乎是一个完美的解决方案,但我已经看到了很多的敌意向他们,这使我认为人们必须拥有他们满意的解决方案。 我很想知道它是什么。

Answer 1:

此页面介绍了一些方法,以这种方式注释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库至今呢。



Answer 2:

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的意见,并在页面加载,还是从阿贾克斯服务器加载自定义数据。



Answer 3:

下面是我会怎么做:

  • 当渲染页面的服务器端,生成标志链接作为一个正常的链接,这样,它会正常工作,如果你启动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?