jQuery實(shí)現(xiàn)Ajax功能分析【與Flask后臺(tái)交互】
本文實(shí)例講述了jQuery實(shí)現(xiàn)Ajax功能。分享給大家供大家參考,具體如下:
jQuery 是一個(gè)小型的 JavaScript 庫(kù),它通常被用來(lái)簡(jiǎn)化 DOM 和 JavaScript 操作。通過(guò)在服務(wù)器和客戶端之間交換 JSON 數(shù)據(jù)是使得 Web 應(yīng)用動(dòng)態(tài)化的完美方式。
JSON 本身是一個(gè)很清量級(jí)的數(shù)據(jù)傳輸格式,非常近似于 Python 的原始數(shù)據(jù)類型 (數(shù)字、字符串、字典和鏈表等),這一數(shù)據(jù)格式被廣泛支持,而且非常容易解析。 它幾年前開始流行,然后迅速取代了 XML 在 Web 應(yīng)用常用數(shù)據(jù)傳輸格式中的地位。
如果您使用 Python 2.6 以上版本,JSON 的解析庫(kù)是開箱即用的。在 Python 2.5 中您則必須從 PyPI 安裝 simplejson 庫(kù)。
加載 jQuery
為了使用 jQuery 您需要先下載它,然后將其放置在您應(yīng)用的靜態(tài)文件夾中,并確認(rèn)他被加載了。理想的情況下是,您有一個(gè)用于所有頁(yè)面的布局模板。要加載 jQuery 您只需要在這個(gè)布局模板中 <body> 標(biāo)簽的最下方添加一個(gè) script 標(biāo)簽。
<script type=text/javascript src="{{ url_for('static', filename='jquery.js') }}"></script>
另一個(gè)加載 jQuery 的技巧是使用 Google 的 AJAX Libraries API :
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script> <script>window.jQuery || document.write('<script src="{{ url_for('static', filename='jquery.js') }}">\x3C/script>')</script>
在以上配置的情況下,您需要將 jQuery 放置到靜態(tài)文件夾當(dāng)中作為一個(gè)備份。瀏覽器將會(huì)首先嘗試直接從 Google 加載 jQuery。如果您的用戶至少一次訪問(wèn)過(guò)使用 Google 提供的的 jQuery 版本的話,瀏覽器就會(huì)緩存這個(gè)代碼,這樣您的網(wǎng)站就可以從中獲得加載更快的好處了。
我的站點(diǎn)在哪?
您知道您的應(yīng)用在哪里運(yùn)行么?如果您在開發(fā)過(guò)程當(dāng)中,那么答案非常簡(jiǎn)單: 它運(yùn)行在本地端口,而且就在這個(gè) URL 的根路徑位置。但是如果您后來(lái)決定將您的應(yīng)喲ing移動(dòng)到一個(gè)不同的未知怎么辦?比如 http://example.com/myapp ? 在服務(wù)器這邊,這從來(lái)不是一個(gè)問(wèn)題,原因是我們使用的 url_for()
函數(shù)可以幫我們回答這個(gè)問(wèn)題。但是如果我們?cè)谑褂?jQuery 我們不應(yīng)該將指向應(yīng)用的路徑硬編碼到程序中,而是將它動(dòng)態(tài)化。該如何做到這點(diǎn)呢?
一個(gè)簡(jiǎn)單的技巧可能是為我們的頁(yè)面添加一個(gè) script 標(biāo)簽,然后設(shè)定一個(gè)全局變量作為一個(gè)應(yīng)用根路徑的前綴。如下所示:
<script type=text/javascript> $SCRIPT_ROOT = {{ request.script_root|tojson|safe }}; </script>
這里的 |safe 是必要的。這樣 Jinja 才不會(huì)將 JSON 編碼的字符串以 HTML 的規(guī)則過(guò)濾處理掉。通常這種過(guò)濾是必要的,但是在 script 標(biāo)簽塊當(dāng)中有著不同于原先的過(guò)濾規(guī)則。
可能有用的信息
在 HTML 中, script 標(biāo)簽被聲明為 CDATA 。這意味著 HTML 轉(zhuǎn)義實(shí)體將不會(huì)被解析。在 </script>
出現(xiàn)之前的所有內(nèi)容都被當(dāng)做腳本處理。這也意味著在 script 標(biāo)簽的內(nèi)容之中不應(yīng)該出現(xiàn) </
字樣。|tojson
足以在這里完成正確的事情,他將會(huì)為您過(guò)濾掉斜杠({{ "</script>"|tojson|safe }}
將會(huì)被渲染成 "<\/script>"
)。
JSON 視圖函數(shù)
現(xiàn)在讓我們創(chuàng)建一個(gè)服務(wù)端函數(shù),這個(gè)服務(wù)端函數(shù)接收兩個(gè)數(shù)字形式的 URL 參數(shù), 然后將這兩個(gè)數(shù)字相加并以 JSON 對(duì)象的形式返回給應(yīng)用。這是一個(gè)相當(dāng)可笑的例子, 您通常會(huì)在服務(wù)端直接實(shí)現(xiàn)這個(gè)功能。但是這是一個(gè)方便展示如何配合使用 jQuery 和 Flask 最簡(jiǎn)單的例子了:
from flask import Flask, jsonify, render_template, request app = Flask(__name__) @app.route('/_add_numbers') def add_numbers(): a = request.args.get('a', 0, type=int) b = request.args.get('b', 0, type=int) return jsonify(result=a + b) @app.route('/') def index(): return render_template('index.html')
正如您所見,我們?cè)谶@里添加了一個(gè) index 函數(shù),這個(gè)函數(shù)用于渲染一個(gè)模板。 這個(gè)模板將會(huì)按照上面的提供的方法加載 jQuery ,并且包含一個(gè)小表單用于提供加法運(yùn)算的兩個(gè)數(shù),同時(shí)表單還提供了用于激發(fā)服務(wù)器端函數(shù)的一個(gè)鏈接。
注意,這里我們使用不會(huì)拋出錯(cuò)誤的 get()
方法。 如果對(duì)應(yīng)的鍵不存在,一個(gè)默認(rèn)值(這里是 0)將hi被返回。更進(jìn)一步,我們還可以將值轉(zhuǎn)換為一個(gè)特定類型(就像我們這里的 int 類型)。這對(duì)于由腳本(APIs,JavaScript等)激發(fā)的代碼來(lái)說(shuō)是個(gè)非常順手的工具,因?yàn)樵谶@種情況下您不需要特別的錯(cuò)誤報(bào)告。
HTML 部分
您的 index.html 要么繼承一個(gè)已經(jīng)加載了 jQuery 且設(shè)定了 $SCRIPT_ROOT 環(huán)境變量的 layout.html 模板,要么自己在上方完成了這些事。以下是我們的小應(yīng)用 (index.html) 所需的 HTML 代碼。請(qǐng)注意這里我們也將腳本直接寫入了 HTML。通常來(lái)講,將腳本代碼放置到一個(gè)獨(dú)立的腳本文件里是一個(gè)更好的點(diǎn)子。
<script type=text/javascript> $(function() { $('a#calculate').bind('click', function() { $.getJSON($SCRIPT_ROOT + '/_add_numbers', { a: $('input[name="a"]').val(), b: $('input[name="b"]').val() }, function(data) { $("#result").text(data.result); }); return false; }); }); </script> <h1>jQuery Example</h1> <p><input type=text size=5 name=a> + <input type=text size=5 name=b> = <span id=result>?</span> <p><a href=# id=calculate>calculate server side</a>
我們不會(huì)過(guò)多介紹 jQuery 使用的細(xì)節(jié),僅僅對(duì)以上代買做一個(gè)快速的解釋:
$(function() { ... })
將會(huì)在瀏覽器加載完頁(yè)面的基礎(chǔ)內(nèi)容之后立即執(zhí)行。$('selector')
選擇一個(gè)用于操作的元素。element.bind('event', func)
指定元素被單擊時(shí)運(yùn)行的函數(shù),如果這個(gè)函數(shù)返回 false ,那么單擊操作的默認(rèn)行為將被取消。在本例中,點(diǎn)擊操作的默認(rèn)行為是導(dǎo)航到 # 鏈接標(biāo)簽。$.getJSON(url, data, func)
發(fā)送一個(gè) GET 請(qǐng)求給 url ,其中 data 對(duì)象的內(nèi)容將以查詢參數(shù)的形式發(fā)送。一旦數(shù)據(jù)抵達(dá),它將以返回值作為參數(shù)執(zhí)行給定的函數(shù)。請(qǐng)注意,我們?cè)谶@里可以使用我們先前設(shè)定的 $SCRIPT_ROOT 變量。
如果您還沒有完全了解這個(gè)例子,可以從 github 上下載 本例源碼 。
更多關(guān)于jQuery相關(guān)內(nèi)容可查看本站專題:《jquery中Ajax用法總結(jié)》、《jQuery擴(kuò)展技巧總結(jié)》、《jQuery常用插件及用法總結(jié)》、《jQuery常見經(jīng)典特效匯總》及《jquery選擇器用法總結(jié)》
希望本文所述對(duì)大家jQuery程序設(shè)計(jì)有所幫助。
- python和flask中返回JSON數(shù)據(jù)的方法
- 用ReactJS和Python的Flask框架編寫留言板的代碼示例
- python flask解析json數(shù)據(jù)不完整的解決方法
- Python Flask前后端Ajax交互的方法示例
- 原生JS實(shí)現(xiàn)Ajax跨域請(qǐng)求flask響應(yīng)內(nèi)容
- Flask框架踩坑之a(chǎn)jax跨域請(qǐng)求實(shí)現(xiàn)
- Flask 讓jsonify返回的json串支持中文顯示的方法
- 詳談在flask中使用jsonify和json.dumps的區(qū)別
- python flask框架實(shí)現(xiàn)傳數(shù)據(jù)到j(luò)s的方法分析
相關(guān)文章
基于jquery的一個(gè)浮動(dòng)框(擴(kuò)展性比較好 )
在用Maxthon的時(shí)候無(wú)意看到一個(gè)浮動(dòng)框,把它改成基于jquery的,擴(kuò)展性比較好,發(fā)來(lái)分享下。2010-08-08jQuery中offsetParent()方法用法實(shí)例
這篇文章主要介紹了jQuery中offsetParent()方法用法,實(shí)例分析了offsetParent()方法的功能、定義及返回匹配元素所有祖先元素中第一個(gè)采用定位的祖先元素時(shí)的使用技巧,需要的朋友可以參考下2015-01-01jQuery動(dòng)畫效果-fadeIn fadeOut淡入淺出示例代碼
jQuery動(dòng)畫效果淡入淺出想必大家都有見到過(guò)吧,其實(shí)很很簡(jiǎn)單,通過(guò)fadeIn fadeOut方法便可輕松實(shí)現(xiàn),具體如下,喜歡的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08jquery簡(jiǎn)單插件制作(fn.extend)完整實(shí)例
這篇文章主要介紹了jquery簡(jiǎn)單插件制作(fn.extend)方法,結(jié)合完整實(shí)例形式分析了jQuery fn.extend擴(kuò)展插件的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-05-05一個(gè)簡(jiǎn)單的jQuery計(jì)算器實(shí)現(xiàn)了連續(xù)計(jì)算功能
這篇文章主要介紹了一個(gè)簡(jiǎn)單的jQuery計(jì)算器主要實(shí)現(xiàn)了連續(xù)計(jì)算功能,需要的朋友可以參考下2014-07-07