Код рефакторинга для удаления uuid - PullRequest
0 голосов
/ 31 января 2011

Здравствуйте, у меня есть некоторый код, сгенерированный внутри тега JSP, который использует функцию данных jQuery для связывания данных с div.

Я использовал UUID, чтобы связать скрипт jQuery с div на странице.Однако этот подход уродлив и неудобен, и мне было интересно, есть ли способ его реорганизации, чтобы не требовать UUID.

Код выглядит следующим образом.

    for(DomainObject domainObject : domainObjects){
//...
        String uuid = UUID.randomUUID().toString();

        out.println("<div id='" +uuid + "' class='" + divClass + "'>");

        // Write out the details of this domain object.
        out.println(/*...*/);

        // Associate data with the div
        out.println("<script type='text/javascript'>$('#"+uuid+"').data('domainObject'," + jsonSerializer.exclude("class").serialize(domainObject) + ")</script>");
        out.println("</div>");
//...
    }

Ответы [ 3 ]

3 голосов
/ 31 января 2011

Если вы можете использовать jQuery 1.4.3, существует очень простой способ связать данные с элементом в dom.Начиная с версии 1.4.3, jQuery будет проверять элементы на наличие любых атрибутов данных и автоматически делать их доступными через .data ("ключ")

<div class='myClass' data-domainObject='{"Name": "I am in your data!"}'>
    Domain Object
</div>

$(function(){
    alert($(".myClass").data("domainObject").Name);
});

Пример jsfiddle

Поскольку, похоже, вы просто используете тег script для добавления данных в элемент, эта опция может подойти и выглядеть примерно так (заметьте, у меня нет опыта работы с jsp):

for(DomainObject domainObject : domainObjects){
//...

        out.println("<div class='" + divClass + "' data-domainObject='" + jsonSerializer.exclude("class").serialize(domainObject)+ "'>");

        // Write out the details of this domain object.
        out.println(/*...*/);
        out.println("</div>");
//...
    }
1 голос
/ 31 января 2011

Два способа (примеры используют JSTL / EL)

  1. Вместо этого используйте ID объекта домена, если есть.

    <div id="do_${domainObject.id}">
    ...
    <script>$('#do_${domainObject.id}').foo();</script>
    
  2. Используйте счетчик циклов.

    <c:forEach items="${domainObjects}" var="domainObject" varStatus="loop">
        <div id="do_${loop.index}">
        ...
        <script>$('#do_${loop.index}').foo();</script>
    </c:forEach>
    

Обратите внимание, что идентификатор должен начинаться с буквенного символа.Идентификаторы, начинающиеся с цифры, являются незаконными.UUID может возвращать идентификаторы, начинающиеся с цифры.

0 голосов
/ 31 января 2011

Не уверен, что в этом такого ужасного.Может быть, вы просто хотите более короткий идентификатор?

UUID уникален универсально.Это намного превышает требования к идентификаторам элементов на странице HTML - они уникальны на странице.

Легко и уместно создавать уникальные идентификаторы страницы длиной 1 или 2 цифры.Ваш JSP должен заменить randomUUID() на randomPageId(), что возвращает последовательность d1, d2, d3 или что-то еще.

...