Flask实践:计算器
MargretCole
8年前
<p style="text-align:center"><img src="https://simg.open-open.com/show/e4cd096d5e5f117436c02c08f2300683.png"></p> <h2><strong>什么是单页应用(SPA)?</strong></h2> <p>照字面理解,单页应用( <strong>S</strong> ingle <strong>P</strong> age <strong>A</strong> pplication)就是只有一个页面的应用,这意味着所有的操作和交互都要在单页里实现。借助上一篇文章介绍的AJAX技术,这种应用可以很容易实现。请求和数据交换都在后台处理,节省了重复加载页面浪费的时间,可以让用户体验更流畅。</p> <p>尽管如此,因为Heroku的网络问题,Demo体验起来并不流畅……你可以在本地安装,体验会更好。</p> <h2><strong>计算器</strong></h2> <p>这个计算器的视图函数和上篇文章里的那个差不多,只多了一个操作符。</p> <pre> <code class="language-python">@app.route('/_calculate') def calculate(): a = request.args.get('num1', '0') operator = request.args.get('operator', '+') b = request.args.get('num2', '0') if operator == '/': result = eval(a + operator + str(float(b))) else: result = eval(a + operator + b) return jsonify(result=result)</code></pre> <p>在模板里,使用三个隐藏字段(input)来存储两个操作数和一个操作符,当按下等于按钮后发送GET请求,获得计算结果后做相应的处理(完整代码见Github上的源码):</p> <pre> <code class="language-python">$('#resultButton').click(function() { // 等于按钮 $.getJSON($SCRIPT_ROOT + '/_calculate', { num1: $('#num1').val(), operator: $('#operator').val(), // 操作符 num2: $('#num2').val() }, function(data) { if (data.result.toString().length > 16) { // 验证计算结果长度 $('#output').html('Reach Digit Limit'); } else { $('#output').html(data.result); // 显示计算结果 } }); });</code></pre> <p>其实这个计算器用JavaScript实现就够了……没太多要说了,补一些用到的CSS技巧吧。</p> <h2><strong>让按钮更真实</strong></h2> <p>在这个计算器里,用到了几个处理技巧,可以让按钮更真实。</p> <p><strong>按下效果</strong></p> <p>其实是设置按钮的box-shadow,按下时把box-shadow设为none,同时按钮向下移动</p> <pre> <code class="language-python">button { box-shadow: 1px 2px #666; } button:active { box-shadow: none; transform: translateY(4px); }</code></pre> <p><strong>按钮上的字不可选择</strong></p> <p>双击按钮或是拖动按钮选择会出现蓝色背景色,设置user-select去掉这个特性</p> <pre> <code class="language-python">.un-selectable { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }</code></pre> <p><strong>去掉按钮被选中后的蓝色边线</strong></p> <pre> <code class="language-python">button:focus {outline:0;} /* 设为none效果相同,或加上 !important */</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/8d46e0d3cb177f88696c65942655af7f.png"></p> <p> </p> <p> </p> <p> </p> <p> </p>