【问题标题】:custom binding html jquery自定义绑定html jquery
【发布时间】:2013-11-07 07:28:56
【问题描述】:

我需要完成类似以下的事情......

我的 html 会是

<div id="targetdiv">
<div class="Comments30" title="{@something1}"></div>
<div class="{@something2}" title="{@something3}"></div>
<div class="Comments30" title="{@something4}"></div>
</div>

我的 json 会是

var myJson=
{
something1 : value1
something2 : value2
something3 : value3
something4 : value4
}

我想使用 jquery 来绑定它们

$('#targetdiv').bindMyJSON(myJson);

我怎样才能做到这一点。 我知道会是这样的

jQuery.fn.extend({
bindMyJSON : function(json){    

}})

【问题讨论】:

标签: javascript jquery html


【解决方案1】:

您可以使用一些 $.fn.renderMyJSON() 来执行此操作,但存在 _.template、handlebars 等模板引擎是有原因的。

我使用 .replace() 修改了一些基本的 renderByJson() 插件,但请记住,这只会替换第一次发现的要替换的字符串:http://jsfiddle.net/6dece/

基本代码如下:

jQuery(function($) {
    $.fn.renderMyJSON = function(json) {
        var $el = $(this);

        $.each(json, function(key, val) {
            $el.html($el.html().replace('{@' + key + '}', val));
        });
    };


    var json = $.parseJSON('{"something1" : "value1","something2" : "value2","something3" : "value3","something4" : "value4"}');

    $('#targetdiv').renderMyJSON(json);
})

【讨论】:

  • 感谢您的回答...这对我有用,我刚刚添加了 var regex = new RegExp("{@" + key + "}", "g");用于全局替换。非常感谢。
  • 这太棒了...但是如何将更改后的值从 html 获取到我的 JSON 对象中?有没有通用的方法来做到这一点?
  • 是的,使用 RegEx 进行替换可以解决“第一个仅匹配”问题。我的函数只处理呈现 JSON(因此我将其命名为 renderMyJSON),如果您需要真正的数据绑定(我猜您甚至想要双向数据绑定),您必须编写更多的东西。也许您对 AngularJS 及其处理双向数据绑定的方式感兴趣(参见此处的第一个示例:angularjs.org)。如果你想自己写,你必须 1. 通过 jQuery 从 DOM 收集信息(可能使用数据属性) 2. 使用 JSON.stringify() 构建 JSON 3. 覆盖你的 JSON
【解决方案2】:

Underscore.js 有一个很棒的 _.template 函数,我建议您使用它,但您可以在下面解决它:

makeTemplate 是一个生成插入变量的函数的函数。您可以将模板字符串传递给它,它会生成一个函数,当使用对象调用该函数时,它将插入属性。首先处理模板通常比每次查找和替换更有效。

var makeTemplate = (function() {
  var escapeMap = {
    '\n'      : '\\n', 
    '\"'      : '\\\"',
    '\u2028'  : '\\u2028',  // line separator
    '\u2029'  : '\\u2029'   // paragraph separator
  };

  return function (templateString) {
    // Escape Special Characters
    templateString = templateString.replace(/["\n\r\u2028\u2029]/g, function(index) {
      return escapeMap[index];
    });

    // Replace interpolation ({@foo}) variables with their object counterpart.
    templateString = templateString.replace(/\{@(\w+)\}/g, '" + (obj["$1"] || "") + "');

    // Return template function.
    return new Function('obj', 'return "' + templateString + '";');
  };
}());

一旦你有了makeTemplate 函数,你就可以定义你的html 并使你的模板函数:

var html = '<div id="targetdiv"><div class="Comments30" title="{@something1}"></div><div class="{@something2}" title="{@something3}"></div><div class="Comments30" title="{@something4}"></div></div>';

var template = makeTemplate(html);

一旦你有了模板函数,你就可以调用模板函数:

var interpolatedHtml = template({
  something1 : "value1",
  something2 : "value2",
  something3 : "value3",
  something4 : "value4"
});

【讨论】:

  • 你能解释一下这条线会做什么吗??? (templateString = templateString.replace(/\{@(\w+)\}/g, '" + (obj["$1"] || "") + "');) 这样做有什么好处?谢谢你
【解决方案3】:

我要做的是将 myJson 的键名作为类属性分配给 div 元素,并遍历 targetDiv 集合,假设类名是静态且唯一的,为元素分配相应的值

html

<div id="targetDiv">
    <div class="something1"></div>
    <div class="something2"></div>
    <div class="something3"></div>
</div>

js

var container = $("#targetDiv");
$.each(myJson, function(key, value)
{
  container.filter("." + key).attr("title", value);
});

【讨论】:

  • 这是一个不错的选择,但我一直在寻找可以帮助我更改我想要的任何属性的东西,例如样式或类或文本或任何属性。太感谢了。我在 Jquery.applyJSON 中看到的相同类型的解决方案
  • 您可以以类似的方式替换和/或添加更多属性,只需复制这一行并更改属性名称,但您当然不能更改类名称,因为如果您想存储它,它是您的参考点更多信息使用数据属性html5doctor.com/html5-custom-data-attributes。这个解决方案是纯 jquery,在创建这个 sn-p 时没有使用框架或模板库:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多