有这么一道题
<!DOCTYPE html> <head> <title>前端工程师面试题</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <!-- <script type="text/javascript" src="https://files.cnblogs.com/darkangle/list.js"></script> --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script type="text/javascript" src="forTestJQ.js"></script> <style> *{padding:0;margin:0;} a{outline:none;text-decoration:none;} body{font: 14px/1.5 arial} .w960{width:560px;margin:0 auto;} .hd{background: #059ed3;color:#fff;} .hd,.ft{padding:5px;} .ft{background:#ccc;text-align:right;} .row{padding:5px;border-bottom:solid 1px #eee;} .row div{display:inline} .row a{float:right;} .ft a{color:green;font-weight:bold} code{display:block;border:solid 1px #666;padding:10px;background:#ffffc0;} h3{margin:10px 0;color:#ff9900;} input{border:solid 1px #c0c0c0;line-height:1.5em;height:1.5em} </style> </head> <body> <div class="w960"> <h3>第一题:请使用Javascript实现以下动态效果</h3> <p>可以使用任何你喜欢的方式和库,尽量使用你认为优雅的实现,并在代码完成说简要说明此方案的优点和不足。</p> <div id=\'msg\'></div> <div id="datalist"> <div class="hd"> 现在一共有: <strong class="item_count"></strong> 个条目 </div> <div class="list"> <div class="row"> <div>这是第一条</div> <a href="javascript:;">修改</a> </div> <div class="row"> <div>这是第二条</div> <a href="javascript:;">修改</a> </div> <div class="row"> <div>花儿为什么这样红?</div> <a href="javascript:;">修改</a> </div> <div class="row"> <div>你知道小月月是哪个不?</div> <a href="javascript:;">修改</a> </div> <div class="row"> <div>人生就是一个杯具</div> <a href="javascript:;">修改</a> </div> </div> <div class="ft"> <a href="javascript:;">新增条目</a> </div> </div> </div> </body> </html>
我的答案
$(function() { countItems(); changeListener(); newItem(); inputBlur(); //okButton(); }); function countItems() { var total = 0; $(\'#datalist .list .row\').each(function(index, val) { /* iterate through array or object */ total++; }); $(\'strong.item_count\').text(total); } function changeListener() { //所有通过动态方式增添的元素得选择器都在on()中得第二个参数中 //$(\'xxx\')这里面只对静态元素有效 $(\'#datalist .list \').on(\'click\', \'.row a\',function(event) { // 为了使动态创建的元素也能应用 event.preventDefault(); var self = $(this); var str = $(this).prev(\'div\').text(); $(this).prev(\'div\').text(\'\'); //创建新元素 http://blog.sina.com.cn/s/blog_6f816c050100mzf2.html // pre.append(next) inner.appendTo(wrapper) $(\'<input>\', { type: \'text\', val: str, }).appendTo(self.prev(\'div\')); //这里用$(this)也是可以的 是因为appendTo()里面并不是function 所以$(this)并不会指向input }); } function newItem() { $(\'#datalist .ft a\').click(function(event) { /* Act on the event */ var item = \'<div class="row"><div><input type="text" value="" /></div><a class="ok" href="javasript:;">ok</a></div>\'; $(item).insertAfter(\'#datalist .list .row:last\'); //前面这里还可以写为 $(\'<p>xxx<p>\').insertAfter(\'xxxx\') }); } function inputBlur() { $(\'#datalist .list \').on(\'focusout\',\'.row input\', function(event) { event.preventDefault(); var self=$(this); self.parent().next(\'a\').text(\'修改\') var str = self.val(); self.parent().text(str);//之后input已经被消去 $(\'#msg\').text(self.parent().text());//之后再用self就没有用了 因为元素已经被消去了 }); } function okButton() { $(\'#datalist .list \').on(\'click\', \'.row a.ok\',function(event) { alert(\'ok\'); // var str=$(this).prev().children(\'input:first\').val(); // $(this).prev().text(str); // $(this).prev().children(\'input\').remove(); }); }
其中 $(\'#datalist .list \').on(\'focusout\',\'.row input\', function(event) {
通过 https://api.jquery.com/on/ 看到动态元素的blur和focus 应该使用 focuesout 和 focusin