ورود

View Full Version : جلوگیری از اجرای یک متد در حین سرچ در ajax



sara_t
جمعه 22 اردیبهشت 1396, 19:47 عصر
سلام دوستان

من یه متد سرچ نوشتم و با ajax در یک تکست باکس ازش استفاده میکنم که هر کلمه ای که سرچ میشه پیشنهادهایی رو نشون بده.و زمانیکه صفحه لود میشه تمام ایتمها رو به من نشون بده.کد زیر رو نوشتم اما زمانیکه سرچ میکنم و میخام از یک طرف در گ کنم به سمت دیگه.دوبار کلمه رو درگ میکنه.چطور میتونم مانع از اجرای loadproduct در زمانیکه که autosearch اتفاق میفته بشم؟


@section scripts{
<script type="text/javascript" language="javascript">
$(document).ready(function () {
loadProducts();
function loadProducts() {
var str = "";
getData(str);
}
$('#autoSearch').on("input", function () {
var str = $('#autoSearch').val();
// if ($.trim(str).length) {
getData(str);
// }
});
function getData(str) {

alireza_s_84
شنبه 23 اردیبهشت 1396, 03:17 صبح
ابتدا یه متغیر برای نگهداری وضعیت لود داده ها تعریف کنید:
$(document).ready(function () {var isLoad = false; // نگهداری وضعیت ارتباط با سرور
loadProducts();
.
.
.
}

در بدنه تابع loadProducts باید چک کنید که وضعیت در چه حالتی هست:
function loadProducts() { if(isLoad === true)
return;


var str = "";
getData(str);
}
در تابع getData باید قبل از ارسال درخواست ایجکس مقدار isLoad رو true و بعد از اتمام عملیات (در متد always یا complete) مقدار اون رو true کنید.

sara_t
شنبه 23 اردیبهشت 1396, 09:32 صبح
من الان که دقیقتر بررسی کردم حتی اگر تابع loadproduct رو کامنت کنم مشکلم هنوز پابرجاست.در واقع تا زمانیکه در inputbox کلمه ای سرچ بشه و نتایجی نشون بده.و من یکی از نتایج رو درگ کنم مشکلی نیس.مشکل زمانی پیش میاد که در input مقادیر رو پاک میکنم که در این حالت کل اطلاعات دیتابیس رو به من نشون میده و درست هست فقط طمانیکه میخام یه عنصر رو درگ کنم دوبار پشت هم درگ میشه.ممنون میشم بگید مشکل از کجاست؟


@{
ViewBag.Title = "SelectStuff";
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
<style type="text/css">
table, td {
background-color: azure;
border: double;
}
#dvright, #dvleft {
background-color: azure;
height: 200px;
width: 300px;
}
</style>
<table>
<tr>
<td>
<h1>Product List</h1>
</td>
<td>
<h1>Selected Products</h1>
</td>
</tr>
<tr>
<td>
<input id="autoSearch" list="lstproducts" placeholder="جستجو..." />
<div id="dvleft">
<ul id="lstproducts"></ul>
</div>
</td>
<td>
<div id="dvright">
<ul id="lstselectedproducts"></ul>
</div>
</td>
</tr>
</table>


@section scripts{
<script type="text/javascript" language="javascript">
$(document).ready(function () {
// loadProducts();
// function loadProducts() {

// var str = "";
// getData(str);
// }
$('#autoSearch').on("input", function () {

var str = $('#autoSearch').val();
// if ($.trim(str).length) {
getData(str);
// }
});
function getData(str) {
var items = "";
$.ajax({
url: "/Admin/GetData",
data: { "str": str },
type: "GET",
}).done(function (resp) {
$.each(resp, function (idx, val) {
items += "<li draggable='true'>" + val.Name + val.Id + "</li>";
});
$("#lstproducts").html(items);
setEvents();
}).error(function (err) {
alert("Error! " + err.status);
});
function setEvents() {
var lstProducts = $('li');
//Set Drag on Each 'li' in the list
$.each(lstProducts, function (idx, val) {
$('li').on('dragstart', function (evt) {
evt.originalEvent.dataTransfer.setData("Text", evt.target.textContent);
evt.target.draggable = false;
});
});
//Set the Drop on the <div>
$("#dvright").on('drop', function (evt) {
evt.preventDefault();
var data = evt.originalEvent.dataTransfer.getData("Text");
var lst = $("#lstselectedproducts");
var li = "<li>" + data + "</li>" + "<input type='text'/>";
li.textContent = data;
lst.append(li);
});
//The dragover
$("#dvright").on('dragover', function (evt) {
evt.preventDefault();
});
}
}
});
</script>
}


اینم از متد getdata:

public ActionResult GetData(string str)
{
var query1 = (from p in db.Stuffs
orderby p.Id ascending
where p.Name.Contains(str)
select p).Take(10);
var query2 = (from p in db.Stuffs
orderby p.Id ascending
select p);
if (str == "")
{
return Json(query2.ToList(), JsonRequestBehavior.AllowGet);
}
else
{
return Json(query1.ToList(), JsonRequestBehavior.AllowGet);
}
}

sara_t
شنبه 23 اردیبهشت 1396, 09:35 صبح
اینم عکس از تصویر اشکال برنامه من:
145201

alireza_s_84
شنبه 23 اردیبهشت 1396, 10:30 صبح
کدهای شما به ازای هر آیتم دوبار ایونت رو ثبت میکنه من مرتبشون کردم:

$(document).ready(function () {
// loadProducts();
// function loadProducts() {


// var str = "";
// getData(str);
// }
$('#autoSearch').on("input", function () {
var str = $('#autoSearch').val();
// if ($.trim(str).length) {
getData(str);
// }
});


function getData(str) {
var items = "";
$.ajax({
url: "/Admin/GetData",
data: { "str": str },
type: "GET",
}).done(function (resp) {
$.each(resp, function (idx, val) {
items += "<li draggable='true' class='dragable'>" + val.Name + val.Id + "</li>";
});
$("#lstproducts").html(items);
setEvents();
}).error(function (err) {
alert("Error! " + err.status);
});
}


$(document).on("dragstart", "li.dragable", function (evt) {
evt.originalEvent.dataTransfer.setData("Text", evt.target.textContent);
evt.target.draggable = false;
});


$(document).on("drop", "li.dragable", function (evt) {
evt.preventDefault();
var data = evt.originalEvent.dataTransfer.getData("Text");
var lst = $("#lstselectedproducts");
var li = "<li>" + data + "</li>" + "<input type='text'/>";
//li.textContent = data;
lst.append(li);
});


$("#dvright").on('dragover', function (evt) {
evt.preventDefault();
});


});

sara_t
شنبه 23 اردیبهشت 1396, 11:29 صبح
بسیار ممنون که کدها رو بررسی کردین.
اما من کد شما رو که کپی میکنم برنامه اصلن کار نمیکنه.

sara_t
شنبه 23 اردیبهشت 1396, 12:58 عصر
در واقع اشکال برنامه اینجاست که هربر سرچ میکنم ودوباره پاک کنم و همه لیست ظاهر بشن این مقادیر میمونن
یعنی اگر یکبار سرچ کنم و بعد پاک کنم ومجدد سرچ کنم دوبار کلمات ذخیره میشن و بعدم درگ میشن.واگر یکبار دیگه این سرچ رو تکرار کنم هر درگ من 4تا میشه.

alireza_s_84
دوشنبه 25 اردیبهشت 1396, 12:22 عصر
کد زیر رو جایگزین کنید. در این کد بجای درگ کردن با کلیک آیتم باید به لیست مقابل اضافه بشه:

$(document).ready(function () {
$('#autoSearch').on("input", function () {
var str = $('#autoSearch').val();
getData(str);
});


var $lstproducts = $("#lstproducts");
var $lst = $("#lstselectedproducts");


function getData(str) {
var items = "";
$.ajax({
url: "/Admin/GetData",
data: { "str": str },
type: "GET",
}).done(function (resp) {
$lstproducts.empty();
$.each(resp, function (idx, val) {
var $li = $('<li>' + val.Name + val.Id + '</li>');
$li.on('click', function (event) {
event.preventDefault();
var text = $li.val();
var node = $('<li>' + text + '<input type="text" /></li>');
$lst.append(node);
});


$lstproducts.append($li);
});
}).error(function (err) {
alert("Error! " + err.status);
});
}


});

sara_t
دوشنبه 25 اردیبهشت 1396, 22:37 عصر
ممنون از پاسختون
اما بازم این کد مشکل چندبار نویسی در سرچ رو داره و همینکه در لیست selected مقادیر مثه مرغ و غیره رو نمینویسه.

sara_t
دوشنبه 25 اردیبهشت 1396, 22:41 عصر
من کدها رو تغببر دادم و الان برنامه درست شده یعنی هم سرچ میکنه هم اینکه درگ کردن رو بدرستی انجام میده.اما الان یه مشکل دارم اونم اینه که چطور تو این کد میتونم input رو هم اضافه کنم که در Selectedproduct اینپوت باکس هم نوشته بشه.


<style type="text/css">
table, td {
background-color: azure;
border: double;
}
#dvright, #dvleft {
background-color: azure;
height: 600px;
width: 300px;
}
#draggable {
width: 400px;
height: 20px;
text-align: center;
background: white;
}
.dropzone {
width: 600px;
height: 200px;
background: blueviolet;
margin-bottom: 10px;
padding: 10px;
}
</style>

<table>
<tr>
<td>
<h1>Product List</h1>
</td>
<td>
<h1>Selected Products</h1>
</td>
</tr>
<tr>
<td>
<input id="autoSearch" list="lstproducts" placeholder="جستجو..." />
<div id="dvleft">
<div class="dropzone">


<ul id="lstproducts"></ul>

</div>
</div>

</td>
<td>
<div class="dropzone"></div>
@using (Html.BeginForm("AddStuffFood", "Admin", FormMethod.Post, new { enctype = "multipart/form-data", id = "myUploadForm" }))
{
<div id="dvright" >
<ul id="lstselectedproducts"></ul>
</div>
<section id="content">
<div class="container">

<div class="col-lg-12">
<div class="row">
<div class="editor-field marginbot20 ">
@Html.TextBoxFor(model => model.Food.Title, new { placeholder = "نام غذا", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.Title)
</div>
<div class="editor-field marginbot20">
@Html.TextBoxFor(model => model.Food.Type, new { placeholder = "نوع غذا", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.Type)
</div>
<div class="editor-field marginbot20">
@Html.TextAreaFor(model => model.Food.FullText, new { placeholder = "دستور پخت", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.FullText)
</div>
<div class="editor-field marginbot20 ">
@Html.TextBoxFor(model => model.Food.TimetoCook, new { placeholder = "مدت زمان پخت", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.TimetoCook)
</div>
<div class="editor-field marginbot20 ">
@Html.TextBoxFor(model => model.Food.TimetoPrepare, new { placeholder = "مدت زمان آماده سازی ", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.TimetoPrepare)
</div>
<div class="editor-field marginbot20 ">
@Html.TextBoxFor(model => model.Food.ForMember, new { placeholder = " تعداد نفرات", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.ForMember)
</div>
<div class="editor-field marginbot20 ">
@Html.TextBoxFor(model => model.Food.LevelFood, new { placeholder = "سطح مهارت", @class = "form-control input-lg" })
@Html.ValidationMessageFor(model => model.Food.LevelFood)
</div>
<div class="margintop20">
@Html.Upload("UploadImage")
@Html.ValidationMessageFor(model => model.Food.Image)
</div>
</div>

</div>
</div>

</section> <button class="btn btn-theme btn-block btn-lg">افزودن</button>
}
</td>
</tr>
</table>




$('#autoSearch').on("input", function () {

var str = $('#autoSearch').val();

getData(str);

});
function getData(str) {
var items = "";
$.ajax({
url: "/Admin/GetData",
data: { "str": str },
type: "GET",
}).done(function (resp) {
$.each(resp, function (idx, val) {
// items += " <li >" + val.Name + val.Id + "</li>";
items += "<li id='draggable' draggable='true' ondragstart='event.dataTransfer.setData('text/plain',null)'>" + val.Name + val.Id + "</li>"+ "<input type='text'draggable='true' ondragstart='event.dataTransfer.setData('text/plain',null)'/>";
});
$("#lstproducts").html(items);

}).error(function (err) {
alert("Error! " + err.status);
});

}

var dragged ;
/* events fired on the draggable target */
document.addEventListener("drag", function (event) {
}, false);
document.addEventListener("dragstart", function (event) {
// store a ref. on the dragged elem
dragged = event.target;
//alert(event.target);
// make it half transparent
event.target.style.opacity = .5;
}, false);
document.addEventListener("dragend", function (event) {
// reset the transparency
event.target.style.opacity = "";
}, false);
/* events fired on the drop targets */
document.addEventListener("dragover", function (event) {
// prevent default to allow drop
event.preventDefault();
}, false);
document.addEventListener("dragenter", function (event) {
// highlight potential drop target when the draggable element enters it
if (event.target.className == "dropzone") {
event.target.style.background = "purple";
}
}, false);
document.addEventListener("dragleave", function (event) {
// reset background of potential drop target when the draggable element leaves it
if (event.target.className == "dropzone") {
event.target.style.background = "";
}
}, false);
document.addEventListener("drop", function (event) {
// prevent default action (open as link for some elements)
event.preventDefault();
// move dragged elem to the selected drop target
if (event.target.className == "dropzone") {
event.target.style.background = "";
dragged.parentNode.removeChild(dragged);
event.target.appendChild(dragged);
}
}, false);