2011-08-23 151 views
2

http://jsbin.com/ezecun/edit#javascript,htmlonkeyup方式太慢

我必须这样写,因为它是动态制作的,下面列出的实际代码。我在jsbin中简化了一下。基本上它需要很长的时间来更新数组,使其不可用。

感谢您的关注。

CODE: PHP

echo "<label style='float:left'>Comments: </label> <textarea onKeyUp=\"editItemInCart(this.value,'comments',".$itemNum.")\" onChange=\"editItemInCart(this.value,'comments',".$itemNum.")\" >".$cart['comments']."</textarea><br />"; 

的JavaScript

function editItemInCart(newValue,fieldName,itemNum) { 
    jQuery.ajax({ 
     type:"POST", 
     url: "editItem.html", 
     data: "newvalue=" + newValue + "&fieldname=" + fieldName + "&itemNum=" + itemNum, 
    }) 
    //alert(newValue + fieldName + itemNum); 
} 
+0

你对此有何看法? –

+2

这不是关键事件,但脚本必须等待服务器响应AJAX查询。您是否测量了editItem.html处理查询需要多长时间? – JJJ

+0

我希望它使用基于这两个事件的新值更新数组。 页面不到一秒钟,没问题。我认为在等待不活动的时候增加一个延迟,然后更新会更好,所以它不会一直发射。 – oneadvent

回答

2

你真的想张贴在每个类型的键或当用户输入完?在处理一封信之前,大多数人可以输入整个单词。你需要一个计数。事情是这样的:根据您的意见

var count = 0; 
function doEditItemInCart(newValue,fieldName,itemNum) 
{ 
    count++; 
    setTimeout("editItemInCart('"+newValue+"','"+fieldName+"',"+itemNum+","+count+")",200); 
} 
function editItemInCart(newValue,fieldName,itemNum,cnt) { 
if (count == cnt) { 
     count = 0; 
     jQuery.ajax({ 
      type:"POST", 
      url: "editItem.html", 
      data: "newvalue=" + newValue + "&fieldname=" + fieldName + "&itemNum=" + itemNum, 
     }) 
     //alert(newValue + fieldName + itemNum); 
    } 
} 
+0

好的,这个效果好多了,它仍然是一个延迟,只是没有那么糟糕。我想我需要在某处放置一个“保存”的分区,以便客户知道。已标记回答。 – oneadvent

0

,这听起来像你想的debounce事件keyup。我推荐Ben Alman的jQuery throttle/debounce plugin

var itemNum = $('#item_num_id').val(); 
$('#textarea_id').keyup($.debounce(250, editItemInCart(this.value,'comments', itemNum))); 

上述代码消除了内联事件处理程序,使您可以很好地区分标记和代码。

+0

我真的不想添加另一个库,即使是一个小库。我标记的答案使用了我已有的代码。虽然谢谢! – oneadvent