14

我想问更多的意见而不是一个问题:当你必须做一个包含大量数据的网页时,社区会建议做什么,例如,一个产品列表,应该有一些功能,比如购买(添加到购物车) 、排序等,如果非要操作当前商品的数据——价格、标题、图片、链接等属性?你如何在你的项目中做到这一点?

例如,我们有一个包含几十个产品的页面,每个产品都有属性:价格、标题、描述、图片(URL)、链接(URL)。您将如何存储数据以在某些用户交互中使用它?就个人而言,我只是通过在标签中插入每个属性来完成它,例如:

<div class="product" data-product_id="123">
  <div class="pr_title">Title</div>
  <div class="pr_body">Body</div>
  <div class="pr_img"><img src="http://www.www.www/img.png"></div>
  <div class="pr_link"><a href="http://www.stackoverflow.com/">Buy!</a></div>
</div>

这样,我就有了用于演示的 html 结构,并通过以下方式在 jQuery 中处理数据:

var url = $('.product').find('.pr_link').find('a').attr('href');

但是当项目变大并且每个元素添加了 10-15 个以上的属性时,从当前产品中获取数据变得非常复杂,并且代码变得几乎不可读。

我想过使用相同的结构,但要将数据保存在某个对象中,例如:

var products = {
    1: {
        title: "abc",
        description: "lorem ipsum",
        price: 25.19,
        img: "http://www.www.www/img.png",
        link: "http://www.stackoverflow.com"
    }
}

并保持标记尽可能简单,仅使用 css 设计所需的元素和样式:

<div class="product" data-product_id="123">
  <div class="title">Title</div>
  <div>Body</div>
  <img src="http://www.www.www/img.png">
  <a href="http://www.stackoverflow.com/">Buy!</a>
</div>

所以onClick我需要检索产品的 id 并在我们的对象“产品”中查询它:

var url = products[id].title;

虽然这是最方便的使用方式,但它需要一个新对象。

另一个想法是将所有数据保存在data-父 div 元素的属性中,例如:

<div class="product" data-product_id="123" data-title="abc" data-body="Body">

但据我所知,jQuery 不能很好地处理数据属性(本机)。

那么你有什么建议呢?也许你有一些更好的想法要分享。

PS我试图找到有关该主题的一些信息,但很可能未能找到很好的表述方式,因此我一无所获。如果堆栈交换站点上有链接甚至类似的问题,请随时发布。先感谢您!

4

9 回答 9

5

您可以使用HTML5 data属性来存储产品数据,因为您有多个产品属性与每个产品块相关联,您可以JSON encode对象并分配给顶部元素,然后可以在该元素或任何子元素上的用户交互中访问它。

var product = {
    title: "abc",
    description: "lorem ipsum",
    price: 25.19,
    img: "http://www.www.www/img.png",
    link: "http://www.stackoverflow.com"
};
$(selector).data('product',JSON.stringify(product));

然后检索您可以在任何事件的回调中执行的对象

$product = $.parseJSON($(elem).data('product'));

事实上,facebook和都twitter使用数据属性来存储与tweets和关联的数据stories。例如这里有一些 FB 故事的 html

<li data-ft='{"qid":"5757245005920960301","mf_story_key":"7164261693049558180"}'
 id="stream_story_4fe5d7d51bc415443080257">

您可以看到 facebook 正在将 JSON 编码数据存储到data-ft属性中。

同样的一个 Twitter tweethtml的例子

<div data-tweet-id="216534496567230464" data-item-id="216534496567230464" 
data-screen-name="onimitch" data-user-id="123682011" data-is-reply-to="">

所以 twitter 正在将一条推文的相关数据保存到不同的属性中,比如data-tweet-id, data-user-id

因此,由于它们都处理大量数据,我认为您也可以使用任何一种方法来保存数据,而不会出现任何性能问题。

如果您使用单个键存储数据,请注意.data()@nnnnnn 在评论中已经提到的自动数据转换。

使用 .data() 进行演示:http: //jsfiddle.net/joycse06/vcFYj/

使用 .attr() 进行演示:http: //jsfiddle.net/joycse06/vcFYj/1/

于 2012-06-23T15:19:32.787 回答
3

无需在 DOM 中使用 id 或引用。保持干净。

只需在 jquery 中使用 data() 函数并将其绑定到 html 元素。这样,当您单击每个元素时,您将能够通过在单击事件中调用它来获取对象。

//loop through your elements in the dom or build them dynamically. 
$.each('div.products', function(){
 $(this).data('product', <your data>);
};

//assign a handler to each element and grab the data object by using this. :)
$(container).delegate('.products', 'click' function(){
  console.log($(this).data('product'))
});
于 2012-06-18T01:25:09.257 回答
2

我不建议您将数据保存在对象中并用它填充 HTML,

这是有原因的:

  • 您的数据对所有黑客开放,可以窃取。
  • 当您的数据太大而无法获取时,您的页面最初可能会在没有数据的情况下加载 - 这是任何 Web 开发人员都不想要的。
  • 同样,当您的数据太大时,旧计算机 - 大约有。512M Ram-可能会陷入僵局
  • 一次又一次,当您的数据太大时,遍历或排序可能会花费太多时间。

我了解您的数据在至少 5 分钟内是静态的。我建议的是,

  • 使用服务器端语言(PHP、ASP(.NET)、Python 等)放置您的数据
  • 当您的脚本需要时,使用查询单独获取数据。
  • 您不需要的任何东西都是您的用户的成本,用户可能在他/她的浏览器中有很多页面,这也会导致死锁。

ps任何细节都会帮助我更多地帮助你。

于 2012-06-20T10:51:46.860 回答
1

您不需要遍历整个对象树。如何放置ID:

<div class="pr_link" id='id_link_123'><a href="http://www.stackoverflow.com/">Buy!</a></div>

并将它们检索为:

// ....
var id = 123;
// ....
var url = $("#id_title_" + id + " a").attr('href');
于 2012-06-17T22:04:07.793 回答
1

你应该试试 AngularJS。它与 jQuery 配合得很好,而且很容易学习。AngularJS 包含两种方式的数据绑定,并通过新的属性和元素扩展 HTML。最后但并非最不重要的是谷歌的 MVC 框架。在http://www.angularjs.com上查看更多信息

于 2012-06-20T09:18:53.910 回答
1

尽管有许多优秀的客户端 mvc 框架,请查看Backbone.js,它是一个功能强大但易于使用的框架,用于管理数据源(通常是 http 服务器)和 DOM 之间的接口。简而言之,它使“你的真相远离 DOM

作为一个人为的例子,如果您正在创建一个简单的地址簿应用程序,您可能会有一个客户端ContactBackbone 模型,它会大致(或完全)反映您在服务器上的模型。

Backbone 管理从服务器(或本地存储等)请求和解析联系人数据(json、xml 等)到这些Contact模型对象中,并且您提供一个 js 回调以在发生更改时更新您的 DOM。这也适用于相反的情况:当模型对象发生变化时,Backbone 会更新服务器,无论是即时、延迟后还是当您显式调用该save函数时。

Backbone 可能不适合您。但是,在您决定推出自己的解决方案之前,请先检查它们。即使这样,您也可以创建自己的客户端 MVC 层,如果您觉得:

  • 可以比现有的众多优秀 javascript MVC 框架之一做得更好,
  • 有这样一个独特的问题,只有定制的解决方案才能为您工作,或者
  • 发现客户端 MVC 或 javascript 框架有些可怕或令人反感。
于 2012-06-25T00:55:18.603 回答
1

我必须同意 Enes,您不应该将数据嵌入到 jquery 代码中,否则,正如您已经提到的,您的代码将很快变得如此复杂以至于无法支持。MVC 框架将对此有所帮助。

上面的答案中提到了一些,例如http://angularjs.comhttp://backbonejs.org虽然我不能保证它们中的任何一个,但你应该看看它们是否有助于解决你的问题。

我目前正在将我最初用 jquery 和原始 php 开发的 scrumwall 应用程序重写到敏捷工具包中。使用agiletoolkit(在stackoverflow 上又名atk4),您可以定义映射到数据库表、html 模板和视图的模型,这些模型具有您希望数据去往的占位符以及您添加模型、表单和网格的页面。它提供了 javascript 和 php 之间的链接,并具有包括 ajax 刷新视图在内的功能。

您可以使用 html5 功能,但只有最新的浏览器会支持此功能,因此如果用户不在受控环境中(例如,有标准 Web 浏览器的单个公司),您可能会遇到问题。

于 2012-06-26T09:28:07.567 回答
0

DOM 和 jQuery 的结合是 Web 拥有的最强大的东西之一。你没有把它们都拿走。

让 DOM 帮助您并为您工作。更好地组织 DOM。把它全部拿走。您的示例可以通过这种方式进行优化:

<div class="product" data-product_id="123">
  <div class="pr_title">Title</div>
  <div class="pr_body">Body</div>
  <img class="prodcut-image" src="http://www.www.www/img.png">
  <a class="product-link" href="http://www.stackoverflow.com/">Buy!</a>
</div>

要使用 jQuery 进行选择,只需编写:

var url = $('.product .product-link').attr('href');

我相信您的问题是您忘记了 CSS 选择器的工作方式。没有必要深入到 DOM 的每一层。

您可以在示例中删除一些 DIV。不需要的链接必须是内联的。CSS 规则可以使它们像 DIV 一样工作。

于 2012-06-20T15:27:57.203 回答
0

您可以通过 jQuery 使用(就像您已经使用的那样)HTML 中的 data- 属性。从服务器数据创建 DIV 时,可以执行以下操作:

$('.product').data(yourProduct); // yourProduct would be the JSON representation of the data

要检索:

var url = $('product').data('product-link'); // if the JSON object has a product-link property that is.

上面有人提到您的数据暴露给浏览器的警告当然仍然有效,所以要小心。

于 2012-06-20T16:27:50.920 回答