Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
xhr = new xmlHttpRequest(), вместо $.ajax({...}).
function get_xmlHttp(){
var xmlHttp;
try{
xmlHttp = new XMLHttpRequest();
}
catch(e){
var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP");
for (var i = 0; i < XmlHttpVersions.length && ! xmlHttp; i ++ ){
try{
xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
}
catch (e){
}
}
}
if( ! xmlHttp)
//errorHandler
else
return xmlHttp;
}
На мой взгляд гораздо лучше использовать data-* параметры, например
<div class="comment" data-id="123"></div>
domObj.id или $jqueryObj[0].id domObj.getAttribute("data-id" );
var callback = function() {//много страниц}
$.post(url, data, callback, 'json');
$.when($.ajax(...)).done(...).fail(....).always(...)
var cache = [];
function getData(id) {
return cache[id]||$.post('/ajax/',{id:id}).done(function(data){
cache[id] = data;
});
}
function useData() {
$.when(getData(1)).done(function(){
console.log(data);
});
}
useData();
$.get('/', function(data){console.log(data.a.b)});
$.get('/', function(data){console.log(data.a.b)}, 'json');
$.ajaxSetup({
dataType:'json'
});
$( '#one_long_selector' ).someAction();
...
$( '#one_long_selector' ).getSomeAttribute();
...
$( '#one_long_selector' ).writeSomeValue( value );
var _handler = $( '#one_long_selector' );
_handler.someAction();
...
_handler.getSomeAttribute();
...
_handler.writeSomeValue( value );
document.addEventListener('keyup', function(e) {
if(e.key == 'Esc' || e.key == 'Enter') { }
})
$.ajax({
type: "GET" //
...
})
Часто бывает необходимость добавить обработчики событий к элементам страницы (например, кнопка «удалить сообщение»). И зачастую можно встретить подобный подход:
$('.comment a.delete').click(function(){
//
});
Минусы этого подхода — в памяти создаются N абсолютно одинаковых обработчиков, поэтому если на странице 1000 комментариев — потребление памяти будет существенным.
var deleteCallback = function () { ... }
$('.comment a.delete').click(deleteCallback);
$('.comment a.delete').click(function(){...});
$('.comment a.delete').each(function(){
$(this).click(function(){...});
});
var handler = function(e) {
e.preventDefault();
this.a = (this.a || 0) + 1;
console.log(this.a);
}
$('a').unbind('click').click(handler);
selector.data использовать $.datavar id = $.data(this, 'id');Я предполагаю что this возвращает DOM элемент, но если вдруг у вас собственный селектор, то, вероятнее всего нужно будет получить из него DOM элемент, вот так, например:$('.my_class')[0]$('body').find('a').on('click', '.external', function(e) {
//функция будет вызвана при клике на любую ссылку с классом external
});<div class="b-comments">
<div class="b-comment">
<button class="b-delete" title="Удалить комментарий">Удалить</button>
</div>
<div class="b-comment">
<button class="b-delete" title="Удалить комментарий">Удалить</button>
</div>
<div class="b-comment">
<button class="b-delete" title="Удалить комментарий">Удалить</button>
</div>
</div>$('body').find('.b-comments').on('click', '.b-delete', function(e) {
//функция будет вызвана при клике на любую ссылку с классом external
});Что за магическое число 27?Написано же черным по белому
e.keyCode == 27На мой взгляд гораздо лучше использовать data-* параметрыЛучше то лучше, но искать его нужно по всему дереву. На мелких страничках все хорошо, но как только тегов становится десять тысяч, производительность будет плачевной.
e.keyCode === ESC_KEY<a href="#" data-id="123" class="delete">Удалить</a>
$('a.delete').on('click', function() {
var elem_id = $(this).attr('data-id');
// отправить ajax запрос с id = elem_id
});
if (e.keyCode == 8) вы бы решили, что это Tab без всяких сомнений. Или даже пускай сомнения возникли бы, но минутку бы потеряли на поиск нужной инфы, чтобы развеять сомнения. mov ah, DOS_GET_KEY
int 21h
mov ah, 1
int 21h
if (e.keyCode == 8)
if (e.keyCode == KEY_BACKSPACE)
if (e.keyCode == KEY_BACKSPACE)document.body.onkeydown = function(e){
console.log(e)
}
if (e.keyCode == 8)
elem.on(keydown, function(e){
switch (e.keyCode) {
case 53:
apple();
break;
case 66:
deleteComment();
break;
case 22:
banUser();
break;
}
})
e.on('keydown', function() {})
e.on('keypress', function() {})
e.on('keyup, function() {})
тогда получить идентификатор будет очень просто:
var id = $(this).attr('data-id')
Решение: в jQuery 1.7 есть метод on, который привязывает обработчики события, фильтруя элементы по селектору.Несмотря на то, что namespaced events были добавлены в jQuery 1.2 — ими мало кто пользуется (Мне кажется большинство людей просто не знают о них). for (var n=1; n <= 3; n++){
(function(n){
setTimeout(function(){console.log(n)}, n * 300)//или в вашем случае $.get
})(n)
}
<a href="/comment/delete/123" class="delete">Удалить</a>
$("a.delete").on("click", function() {
$.post($(this).attr("href"), {}, function() {});
return false;
})
$("a.delete").live("click", function() {
el = $(this)
$.post(el.attr("href"), {}, function(r) {
if (r.status == 1) {
el.parent.hide()
}
else {
$(".error", el.parent).html(r.error).show();
}
});
return false;
})
3. в click обработчике лучше писать event.preventDefault(), чем return false. Поскольку return false это event.preventDefault() + event.stopPropagation(). Например, если у вас дополнительно собирается карта кликов — клики по ссылкам удаления не будут засчитываться
Велосипеды на Javascript и jQuery