だからここに私の状況があります:
contentEditable 属性が付加されたクラス「.editable」に多数の DOM 要素があります。
要素ごとに を使用して Ajax POST をインスタンス化します
keydown()
が、ajax リクエストが送信される前に、keydown() が TAB または ENTER キーを与えるかどうかを確認し、そうであれば ajax POST は成功します。
私が現在抱えている問題は、TAB キーまたは ENTER キーを押したままにすると、複数の Ajax POST を送信してしまうことです。どうすればこれを止めることができますか?
注: ajax POST が完了した後もこれらのイベントを引き続き存在させたいため、.off() でイベントをデタッチしたくありません。
ヘルプや推奨事項をいただければ幸いです。
(function($, window, document) {
/* Namespace */
$.fn.SaveEditable = function() {
var settings = {
context: null,
position: null,
content: "(empty)",
element: "(empty)",
data_id: "(empty)"
};
var s, keyCode;
function init(e, options) {
s = $.extend({}, settings, options);
keyCode = e.keyCode || e.which;
//If Enter or Tab key is pressed
if(keyCode == 9 || keyCode == 13) {
e.preventDefault();
s.context.blur();
sendAjax();
}
} //End init
function sendAjax() {
$.ajax({
url: 'save.php',
type: 'POST',
data: { user_id: <?=$user_id;?>, sort_id: <?=$currentSort;?>, element: s.element, data_id: s.data_id, content: s.content },
success: function (data) {
if(data) {
var obj = jQuery.parseJSON(data);
//Do something with obj
}
$(".ajax-status")
.addClass("success")
.html("Updated content successfully");
},
error: function() {
$(".ajax-status")
.addClass("error")
.html("An error has occurred. Please try again.");
}
});
} //End sendAjax
/* Initilize */
return this.each(function(i, domEl) {
$(this).on({
keydown: function(e) {
init(e, {
context: $(this),
position: i,
content: $(this).text(),
element: $(this).data('element'),
data_id: $(this).data('id')
});
}
});
});
};
})(jQuery, window, document);
次に、次のように呼び出されます。
$('.editable').SaveEditable();