#javascript #jquery #ajax
#javascript #jquery #ajax
Вопрос:
Поэтому я действительно предпочитаю использовать ненавязчивый javascript встроенному javascript. Я нахожу, что с ним намного проще работать.
Проблема, с которой я продолжаю сталкиваться, заключается в том, что я не знаю, как получить данные для каждого конкретного элемента, с которым я хочу работать.
Например:
У меня есть список, и я генерирую следующий HTML (здесь это псевдокод)
<%for e in list%>
<a href="#" class="delete"><%=e%></a> <!-- <%= e.id %> ??-->
<%end%>
Итак, я хочу прикрепить javascript к каждому из этих тегов <a>, которые будут вызывать ajax post, но мне нужен «id», чтобы удалить правильный элемент из серверной части.
$('a.delete').click(function() {
// Ajax request using "e.id"
});
Некоторые вещи, которые я пробовал:
- Создание href и использование
attr
метода для отправки ajax-запроса на этот URL. (Мне не очень нравится это для запросов POST, но это работает. - Использование
rel
атрибута для хранения нужных мне данных. - С использованием атрибутов HTML5
data
. (Я не знаю о доступности этого во всех браузерах, и поскольку нам нужно поддерживать IE6 , мне не очень нравится идея использовать это.) - Создание формы для каждого тега <a> и ее сериализация. (Это кажется большим количеством дополнительного кода, но он также кажется действительно чистым.)
Каковы наилучшие методы для достижения этого?
Комментарии:
1. Вы можете присвоить им идентификатор. <a id=»link_1″>1</a>, <a id=»link_2″>2</a> и т.д.
2. ни один из них не был ответом?
Ответ №1:
Используйте id
атрибут для хранения строки с идентификатором следующим образом:
<%for e in list%>
<a id="link_<%= e.id %>" href="#" class="delete"><%=e%></a>
<%end%>
И считывание идентификатора путем разделения на что-то вроде символа подчеркивания:
$('#list a').click(function(){
//old var id = $(this).attr('id').split('_')[1];
var id = this.id.split('_')[1]; //thx @mu
$.ajax({
url: 'http://www.someurl.com/delete.aspx?id=' id,
//...more
})
});
Комментарии:
1. Вы также могли бы сделать
var id = this.id.split('_')[1];
, нет необходимости создавать объект jQuery только для доступа к егоid
атрибуту.
Ответ №2:
Я часто сохраняю такого рода данные в теге вот так:
Метод атрибутивного тега
<div id="list">
<a href="/link" post_id="68">Some post</a>
</div>
Затем в jQuery сделайте что-то вроде:
$('#list').delegate('a.delete', 'click', function(event) {
event.preventDefault(); // Stop default click event
// ajax stuff here
// $(this).attr('post_id') = 68
});
Обновление: .attr('post_id')
Не работает в IE6.
Альтернативные методы? Хм….
Все они используют вышеупомянутую функцию делегирования.
В выделенном элементе, используя класс или идентификатор, для определения данных элементов:
<div id="list">
<a href="/link"><span class="hide post_id">66</span>Some post</a>
</div>
- Доступ с помощью:
$('span.post_id', this).text()
Вероятно, одна из худших идей для простых идентификаторов, но если вам нужно хранить сложные данные, то добавление их внутрь элемента может быть вариантом.
В href…
<div id="list">
<a href="/link/66">Some post</a>
</div>
- Доступ с помощью:
$(this).attr('href').match(//([0-9] )$/)[1]
Очевидно, что этот метод зависит от вашего URL. Это один из самых ненавязчивых методов, предполагающий, что ваша структура URL не слишком сложна или часто меняется.
Это идентификатор. Это уникально. Давайте определим:
<div id="list">
<a href="/link" id="post_66">Some post</a>
</div>
- Доступ с помощью:
$(this).attr('id').split('_')[1]
Преимущество этого метода в том, что вы также можете стилизовать элементы на основе определенных идентификаторов — иногда это полезно. Это также имеет наибольший смысл. Ваш идентификатор уникален. Эта ссылка привязки относится к этому сообщению, к этому уникальному идентификатору, поэтому использование атрибута id имеет смысл.
Комментарии:
1. Хорошее решение, но ненавязчиво ли оно?
2. @pixelbobby: Я полагаю, использование
id="post-68"
было бы менее навязчивым. Или, возможно,data-id="68"
для HTML5 и jQuery 1.5 .3. @mu слишком короткий: да, я просто немного перечитал Википедию, чтобы убедиться, что я понял вопрос en.wikipedia.org/wiki/Unobtrusive_JavaScript
Ответ №3:
Вы можете прикрепить идентификатор к каждому <a>
элементу вот так <a href=".." id="delete_<%e.id%>" >
, затем, когда вы прикрепляете событие к этой ссылке, вы можете найти идентификатор через string indexOf и использовать соответствующую функцию ajax.
Ответ №4:
Прошло некоторое время, и я нашел решение этой проблемы, которым я доволен. Возможно, это не идеально, но это лучшая альтернатива, которую я нашел на данный момент.
Честно говоря, все эти ответы верны — они будут работать просто отлично. На данный момент это просто вопрос эстетики и YMMV.
Итак, в том же псевдокоде шаблона:
<% for e in list %>
<a href="#" class="delete"
data-method="delete"
data-url="<%= delete_url(e.id) %>"><%= e %></a>
<% end %>
И какой-нибудь jQuery, который будет делать то, что я хочу:
$('a.delete').on('click', function(e) {
var self = $(this);
var method = self.data('method');
var url = self.data('url');
$.ajax({
url: url,
type: method
}).done(function() {
alert('woot - success');
});
});
Я думаю, data
что элементы в настоящее время являются лучшим способом узнать, как взаимодействовать с веб-сервисом. Это позволяет нам использовать те же помощники URL, которые мы использовали бы при рендеринге представления.