Работа с данными в jQuery - программирование
Подтвердить что ты не робот

Работа с данными в jQuery

Я хотел бы попросить больше мнения, чем вопрос: Что бы сообщество рекомендовало делать, когда вы должны делать веб-страницу с большим количеством данных, например, список продуктов, которые должны обладать некоторыми функциями, такими как покупка (добавление в корзину), сортировка и т.д., Если вам нужно манипулировать данными текущий продукт - цена, название, изображение, ссылка и другие атрибуты? Как вы это делаете в своих проектах?

Например, у нас есть страница с десятками продуктов, каждая из которых имеет атрибуты: цена, название, описание, изображение (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="#" onclick="location.href='http://www.stackoverflow.com/'; return false;">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="#" onclick="location.href='http://www.stackoverflow.com/'; return false;">Buy!</a>
</div>

so onClick Мне нужно будет получить идентификатор продукта и запросить его в наших "продуктах":

var url = products[id].title;

В то время как это самый удобный способ работы с ним, требуется новый объект.

Другая идея заключалась в том, чтобы сохранить все данные в атрибутах data- родительского элемента div, например:

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

но во многом, поскольку я знаю, что jQuery не работает с атрибутами данных хорошо (изначально).

Итак, каковы ваши предложения? Возможно, у вас есть еще лучшие идеи поделиться.

P.S. Я попытался найти некоторую информацию по этому вопросу, но, скорее всего, не смог найти способ сформулировать его, поэтому я ничего не нашел об этом. Если на сайтах обмена ссылками есть ссылки или даже похожие вопросы, не стесняйтесь публиковать их. Заранее благодарю вас!

4b9b3361

Ответ 1

Вы можете использовать атрибут 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. Например, здесь приведен некоторый html истории FB

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

Вы можете видеть, что facebook хранит JSON-кодированные данные в атрибуте data-ft.

Аналогично, пример твиттера tweet html

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

Таким образом, твиттер сохраняет связанные данные для твита в разные атрибуты, такие как data-tweet-id, data-user-id.

Итак, поскольку они оба обрабатывают много данных, я думаю, вы также можете использовать любой из этих методов для сохранения ваших данных без каких-либо проблем с производительностью.

Если вы храните данные с отдельными ключами, тогда имейте в виду автоматическое преобразование данных, которое .data() делает как @nnnnnn уже упоминалось в комментарии.

Демо с .data(): http://jsfiddle.net/joycse06/vcFYj/

Демо с .attr(): http://jsfiddle.net/joycse06/vcFYj/1/

Ответ 2

Не нужно использовать идентификаторы или ссылки в DOM. Держи в чистоте.

Просто используйте функцию data() в jquery и привяжите ее к элементам html. Таким образом, когда вы нажимаете на каждый элемент, вы сможете получить объект, вызвав его из вашего события click.

//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'))
});

Ответ 3

Я не рекомендую хранить ваши данные в объекте и заполнять его HTML,

Есть причины для этого:

  • Ваши данные открыты для всех хакеров, чтобы украсть.
  • Когда ваши данные слишком велики для извлечения, ваша страница может быть первоначально загружена без данных - и это то, что не хочет любой веб-разработчик.
  • Опять же, когда ваши данные слишком велики, старые компьютеры - компьютеры, которые имеют ок. 512M Ram - может зайти в тупик.
  • Снова и снова, когда ваши данные слишком велики, перемещение или сортировка могут занять слишком много времени.

Я понимаю, что ваши данные статичны минимум на 5 минут. Что я рекомендую,

  • Поместите свои данные на серверные языки (PHP, ASP (.NET), Python и т.д.).
  • Получить данные с запросами отдельно, когда ваш script нуждается в нем.
  • Все, что вам не нужно, это затраты для вашего пользователя, у пользователя может быть много страниц в его/ее браузере, и это тоже будет причиной тупика.

p.s. Любая деталь поможет мне больше помочь.

Ответ 4

Вам не нужно перемещаться по всему дереву объектов. Как насчет ввода идентификаторов:

<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');

Ответ 5

Вам следует попробовать AngularJS. Он отлично работает с jQuery, и его легко освоить. AngularJS содержит двухстороннюю привязку данных и расширяет HTML новыми атрибутами и элементами. И последнее, но не менее важное - это MVC-инфраструктура от Google. Подробнее см. http://www.angularjs.com

Ответ 6

Несмотря на то, что существует много превосходных инфраструктур mvc clientside, ознакомьтесь с Backbone.js, который является мощной, но простой в использовании инфраструктурой для управления интерфейсом между вашим источником данных (обычно http-сервером) и вашим DOM. Короче говоря, он сохраняет " свою правду из DOM"

В качестве надуманного примера, если вы создаете приложение с простой адресной книгой, у вас, вероятно, будет клиентская модель Contact Backbone, которая будет грубо (или точно) зеркально отображать модель, которая у вас есть на вашем сервере.

Backbone управляет запросом и анализом данных контакта (json, xml и т.д.) с сервера (или localstorage и т.д.) в этих объектах модели Contact, и вы предоставляете ответ js для обновления вашей DOM при возникновении изменений. Это также работает в обратном порядке: Магистраль обновляет сервер, когда объекты модели меняются мгновенно после некоторой задержки или когда вы явно вызываете функцию save.

Магистраль может быть неправильной основой для вас. Но проверьте их все, прежде чем решите опрокинуть свое решение. Тем не менее, вы можете создать свой собственный клиентский уровень MVC, если вы чувствуете себя:

  • Может сделать лучшую работу, чем одна из многих превосходных существующих фреймворков javascript MVC,
  • У вас есть такая уникальная проблема, что для вас будет работать только индивидуальное решение, или
  • Найти клиентские MVC или фреймворки javascript как-то страшно или неприятно.

Ответ 7

Я должен согласиться с Enes, вы не должны вставлять свои данные в код jquery или, как вы уже упоминали, ваш код быстро станет настолько сложным, чтобы быть неподдерживаемым. Это поможет поддержка MVC.

В приведенных выше ответах есть пара, например http://angularjs.com и http://backbonejs.org, хотя я не могу поручиться за кого-либо из них, но вы должны посмотреть, помогают ли они решить ваши проблемы.

В настоящее время я переписываю приложение scrumwall, которое я изначально разработал в jquery и raw php в гибком наборе инструментов. С помощью agiletoolkit (aka atk4 on stackoverflow) вы определяете модели, которые сопоставляются с таблицами базы данных, html-шаблонами и представлениями, которые содержат заполнители, куда вы хотите, чтобы данные шли, и страницы, на которых вы добавляете модели, формы и сетки. Он предоставляет ссылки между javascript и php и имеет функции, включая ajax refreshes views.

Вы можете использовать функции html5, но только новейшие браузеры будут поддерживать это, поэтому у вас могут возникнуть проблемы, если пользователи не находятся в контролируемой среде (например, в одной компании, где есть стандартный веб-браузер).

Ответ 8

Комбинация DOM и jQuery - одна из самых мощных вещей, которые имеет Интернет. Вы не принимаете их всех.

Сделайте 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.

Ответ 9

Вы можете использовать (как уже есть) атрибуты данных в HTML через jQuery. Когда вы создаете 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.

Предостережение, упомянутое выше, о том, что ваши данные находятся в браузере, конечно, остается в силе, поэтому будьте осторожны.