在Jquery数据表搜索框中添加提示文本的问题

使用watermark.js这样的插件在Jquery数据表的搜索字段中添加灰色提示文本不是一个选项,我必须自定义编写它。 我几乎在那里,但面对下面的代码片段解释这个小而奇怪的问题。

function toggleHintText() { // alert("The hint text should show up"); var textSuggest = "Please input search parameter"; var searchField = $('input:text'); searchField .attr("value", textSuggest ); searchField .addClass("activeHint"); searchField .focus(function() { if(searchField .attr("value") == textSuggest) { searchField .attr("value", ""); } }); searchField .keyup(function() { if(searchField .attr("value") == "") { searchField .addClass("activeHint"); } else { searchField .removeClass("activeHint"); } }); searchField .blur(function() { if(searchField .attr("value") == "") { searchField .attr("value", hinttext); searchField .addClass("activeHint"); } }); 

}

此方法称为onload,如下所示

 $(document).ready(function() { populateTableData(); toggleHintText(); } ); 

================================================== =========================================

我面临的问题是,如果没有方法开头的警报,提示文本就不会显示在搜索框中。 警报是否有利于document.ready的工作? 从document.ready调用两个方法会搞乱toggleHint方法吗? 我的一个要求是保留用户输入搜索文本,如果他在搜索查询后点击表格行然后点击自定义后退按钮,这就是我必须从document.ready调用它的原因。

请提前通知并表示感谢。

尝试使用.queue() .delay() .keyup()

 $(document).ready(function() { var data = $("#example"); data.DataTable(); $("input[type=search]") .on("keyup", { // if input , delay until no input for 1.2 seconds "delay": 1200 }, function(e) { var elem = $(this); var update = function update() { // wait 1.2 seconds to update `val` with "hint" if ($.now() - e.timeStamp > e.data.delay && e.target.value.length > 0 && !/^\s/.test(e.target.value)) { var val = e.target.value.toLowerCase(); // filter `.DataTable().data()` // return items where first index matches `val` var res = $.grep(data.DataTable().data(), function(value, key) { return val === value[0].slice(0, val.length).toLowerCase() || new RegExp(val, "i").test(value[0]) }) // sort returned data .sort() // filter returned data `res` for match to `val` .filter(function(hint) { return hint[0].toLowerCase().slice(0, val.length) === val || new RegExp(val, "i").test(hint) })[0]; elem.val(res[0]) .css({ "color": "grey", "fontStyle": "italic" }); } else { return elem.queue("update", update) } }; var defer = function defer(next) { // if input before 1.2 seconds , // empty `"update"` queue , delay calling // update until no input for 1.2 seconds elem.queue("update", []) elem.delay(e.data.delay, "update") .queue("update").push(update); return next() }; // if input, do stuff if (e.target.value.length > 0) { elem .queue("update", defer) .dequeue("update") } else { elem .queue("update", []) } }).keyup() }); 
    
Name Position Office Age Start date Salary
Name Position Office Age Start date Salary
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
Jena Gaines Office Manager London 30 2008/12/19 $90,560
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
Michael Silva Marketing Designer London 66 2012/11/27 $198,500
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
Bradley Greer Software Engineer London 41 2012/10/13 $132,000
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
Suki Burks Developer London 53 2009/10/22 $114,500
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
Timothy Mooney Office Manager London 37 2008/12/11 $136,200
Jackson Bradshaw Director New York 65 2008/09/26 $645,750
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
Bruno Nash Software Engineer London 38 2011/05/03 $163,500
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
Thor Walton Developer New York 61 2013/08/11 $98,540
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
Hermione Butler Regional Director London 47 2011/03/21 $356,250
Lael Greer Systems Administrator London 21 2009/02/27 $103,500
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
Donna Snider Customer Support New York 27 2011/01/25 $112,000

«警报是否有利于document.ready的工作?»

当然。 但不赞成document.ready但赞成“dinamically loaded table data.ready”。

查看您的第二个代码段:

  • 首先调用populateTableData():我想通过Ajax请求从可能的远程服务器异步读取数据。

  • 然后,调用toggleHintText()来实现对表行的切换效果,我发现在Ajax请求(或类似的异步操作)完成后,populateTableData()中实现的一些回调将会立即追加。

Javascript是单线程的(这意味着您的代码在单个线程中执行,因此没有任何并发​​),但并不完全没有并发性,因为异步操作由其他并发线程工作或等待必要的操作完成然后(触发完成事件),在javascript主任务循环中推送一个任务(附加到该元素的事件处理程序)。

alert()调用会停止javascript主循环执行,但不会停止参与异步任务的并发线程。

这样,它可以成功完成Ajax请求操作(即使没有因“警报暂停”而导致服务器超时失败)并触发完成事件。

…但是在javascript任务循环继续之前,不会执行附加到该事件的回调。

在填充表数据之前,您的toggleHintText()函数称为SURE,如果没有alert(),其余代码将找不到该表中的任何元素(或者至少没有找到populateTableData()填充的任何新元素)。

因此,如果没有alert(),您的代码将无效。

但我不确定为什么即使有警报也能正常工作。 我发现你的浏览器可以实现警报停止作为某种“暂停的nextTick()”并尽快执行,至少是待处理的事件处理程序(但我认为这在javascript规范中并不严格正确)。

要避免此问题,需要在确定在表中填充数据时调用toggleHintText()。 那是:

  • 从填充(假设的)Ajax请求完成数据的事件处理程序中调用它。

  • 在那一刻触发您自己的元素并将toggleHint()作为它的事件处理程序附加。

或者,您可以修改toggleHintText()事件处理程序以附加到表本身(或整个文档),而不是以后动态加载的元素,然后检查事件目标。

这就是过时的.live()jquery方法所做的,现在只需使用.on()和目标选择器即可实现。 例如:

在你的代码中:

 var searchField = $('input:text'); ... searchField.focus(function() {...}); 

……最后一行相当于:

 searchField.on("focus", function(){}); 

您可以使用以下命令替换它(例如):

 $("body").on("focus", 'input:text', function(){...}); 

这样,事件处理程序直接附加到文档的主体和每个焦点事件,它将检查目标是否匹配给定的选择器(无论元素是否在事件处理程序附加之前创建)。

总结:您不能将事件处理程序附加到尚不存在的元素。

另一方面,您有一些元素操作,如添加类和属性。 在创建元素之前不能这样做,但是,类似地,您可以将事件处理程序附加到其“创建”事件。

但是,不幸的是,这个事件实际上并不存在。 但是有一些技术可以通过dom change事件实现它。 看到有关liveQuery插件的这个问题 。