jquery-pjax官方翻譯

pjax = pushState + ajax

pjax是一個jQuery插件,它使用ajax和pushState為永久鏈接愈捅,頁面標題和工作返回按鈕提供快速瀏覽體驗遏考。
pjax的工作原理是通過ajax從服務(wù)器獲取HTML片段,再替換原容器元素內(nèi)容改鲫。
然后用pushState更新瀏覽器中的當前URL诈皿。
這么做出于以下兩個原因:

  • 沒有頁面資源(如:js css)被重新執(zhí)行或請求;
  • 如果服務(wù)器配置為pjax像棘,就只是渲染局部而避免了全局渲染

這個項目的狀態(tài)

jquery-pjax is largely unmaintained at this point. It might continue to
receive important bug fixes, but its feature set is frozen and it's unlikely
that it will get new features or enhancements.

jquery-pjax在很大程度上是無法維護的稽亏。 它可能會繼續(xù)接收重要的錯誤修復(fù),但是它的功能集是凍結(jié)狀態(tài)的缕题,而且不太可能會得到新的功能或增強截歉。

安裝

pjax依賴于jQuery 1.8或更高版本。

npm

$ npm install jquery-pjax

獨立腳本

下載并在您的網(wǎng)頁中包含jquery.pjax.js

curl -LO https://raw.github.com/defunkt/jquery-pjax/master/jquery.pjax.js

用法

$.fn.pjax

pjax的最簡單和最常見的用法是這樣的:

$(document).pjax('a', '#pjax-container')

這將啟用頁面上所有鏈接的pjax烟零,并將容器指定為#pjax-container瘪松。

If you are migrating an existing site, you probably don't want to enable pjax
everywhere just yet. Instead of using a global selector like a, try annotating
pjaxable links with data-pjax, then use 'a[data-pjax]' as your selector. Or,
try this selector that matches any <a data-pjax href=> links inside a <div data-pjax> container:
如果您正在遷移現(xiàn)有網(wǎng)站,則可能不希望到處都啟用pjax锨阿。 不要使用像“a”這樣的全局選擇器宵睦,可以將需要的鏈接添加為data-pjax墅诡,然后使用'a[data-pjax]' 作為選擇器。
要么说庭,試試下面這個選擇器刊驴,它匹配任何 在一個 <div data-pjax>容器內(nèi)部的<a data-pjax href=>鏈接:

$(document).pjax('[data-pjax] a, a[data-pjax]', '#pjax-container')

服務(wù)端配置

Ideally, your server should detect pjax requests by looking at the special
X-PJAX HTTP header, and render only the HTML meant to replace the contents of
the container element (#pjax-container in our example) without the rest of
the page layout. Here is an example of how this might be done in Ruby on Rails:

def index
  if request.headers['X-PJAX']
    render :layout => false
  end
end

If you'd like a more automatic solution than pjax for Rails check out Turbolinks.

Check if there is a pjax plugin for your favorite server framework.

Also check out RailsCasts #294: Playing with PJAX.

Arguments

The synopsis for the $.fn.pjax function is:

$(document).pjax(selector, [container], options)
  1. selector is a string to be used for click event delegation.
  2. container is a string selector that uniquely identifies the pjax container.
  3. options is an object with keys described below.
pjax options
key default description
timeout 650 ajax timeout in milliseconds after which a full refresh is forced
push true use pushState to add a browser history entry upon navigation
replace false replace URL without adding browser history entry
maxCacheLength 20 maximum cache size for previous container contents
version a string or function returning the current pjax version
scrollTo 0 vertical position to scroll to after navigation. To avoid changing scroll position, pass false.
type "GET" see $.ajax
dataType "html" see $.ajax
container CSS selector for the element where content should be replaced
url link.href a string or function that returns the URL for the ajax request
target link eventually the relatedTarget value for pjax events
fragment CSS selector for the fragment to extract from ajax response

You can change the defaults globally by writing to the $.pjax.defaults object:

$.pjax.defaults.timeout = 1200

$.pjax.click

This is a lower level function used by $.fn.pjax itself. It allows you to get a little more control over the pjax event handling.

This example uses the current click context to set an ancestor element as the container:

if ($.support.pjax) {
  $(document).on('click', 'a[data-pjax]', function(event) {
    var container = $(this).closest('[data-pjax-container]')
    var containerSelector = '#' + container.id
    $.pjax.click(event, {container: containerSelector})
  })
}

NOTE Use the explicit $.support.pjax guard. We aren't using $.fn.pjax so we should avoid binding this event handler unless the browser is actually going to use pjax.

$.pjax.submit

Submits a form via pjax.

$(document).on('submit', 'form[data-pjax]', function(event) {
  $.pjax.submit(event, '#pjax-container')
})

$.pjax.reload

Initiates a request for the current URL to the server using pjax mechanism and replaces the container with the response. Does not add a browser history entry.

$.pjax.reload('#pjax-container', options)

$.pjax

Manual pjax invocation. Used mainly when you want to start a pjax request in a handler that didn't originate from a click. If you can get access to a click event, consider $.pjax.click(event) instead.

function applyFilters() {
  var url = urlForFilters()
  $.pjax({url: url, container: '#pjax-container'})
}

Events

All pjax events except pjax:click & pjax:clicked are fired from the pjax
container element.

<table>
<tr>
<th>event</th>
<th>cancel</th>
<th>arguments</th>
<th>notes</th>
</tr>
<tr>
<th colspan=4>event lifecycle upon following a pjaxed link</th>
</tr>
<tr>
<td><code>pjax:click</code></td>
<td>??</td>
<td><code>options</code></td>
<td>fires from a link that got activated; cancel to prevent pjax</td>
</tr>
<tr>
<td><code>pjax:beforeSend</code></td>
<td>??</td>
<td><code>xhr, options</code></td>
<td>can set XHR headers</td>
</tr>
<tr>
<td><code>pjax:start</code></td>
<td></td>
<td><code>xhr, options</code></td>
<td></td>
</tr>
<tr>
<td><code>pjax:send</code></td>
<td></td>
<td><code>xhr, options</code></td>
<td></td>
</tr>
<tr>
<td><code>pjax:clicked</code></td>
<td></td>
<td><code>options</code></td>
<td>fires after pjax has started from a link that got clicked</td>
</tr>
<tr>
<td><code>pjax:beforeReplace</code></td>
<td></td>
<td><code>contents, options</code></td>
<td>before replacing HTML with content loaded from the server</td>
</tr>
<tr>
<td><code>pjax:success</code></td>
<td></td>
<td><code>data, status, xhr, options</code></td>
<td>after replacing HTML content loaded from the server</td>
</tr>
<tr>
<td><code>pjax:timeout</code></td>
<td>??</td>
<td><code>xhr, options</code></td>
<td>fires after <code>options.timeout</code>; will hard refresh unless canceled</td>
</tr>
<tr>
<td><code>pjax:error</code></td>
<td>??</td>
<td><code>xhr, textStatus, error, options</code></td>
<td>on ajax error; will hard refresh unless canceled</td>
</tr>
<tr>
<td><code>pjax:complete</code></td>
<td></td>
<td><code>xhr, textStatus, options</code></td>
<td>always fires after ajax, regardless of result</td>
</tr>
<tr>
<td><code>pjax:end</code></td>
<td></td>
<td><code>xhr, options</code></td>
<td></td>
</tr>
<tr>
<th colspan=4>event lifecycle on browser Back/Forward navigation</th>
</tr>
<tr>
<td><code>pjax:popstate</code></td>
<td></td>
<td></td>
<td>event <code>direction</code> property: "back"/"forward"</td>
</tr>
<tr>
<td><code>pjax:start</code></td>
<td></td>
<td><code>null, options</code></td>
<td>before replacing content</td>
</tr>
<tr>
<td><code>pjax:beforeReplace</code></td>
<td></td>
<td><code>contents, options</code></td>
<td>right before replacing HTML with content from cache</td>
</tr>
<tr>
<td><code>pjax:end</code></td>
<td></td>
<td><code>null, options</code></td>
<td>after replacing content</td>
</tr>
</table>

pjax:send & pjax:complete are a good pair of events to use if you are implementing a
loading indicator. They'll only be triggered if an actual XHR request is made,
not if the content is loaded from cache:

$(document).on('pjax:send', function() {
  $('#loading').show()
})
$(document).on('pjax:complete', function() {
  $('#loading').hide()
})

An example of canceling a pjax:timeout event would be to disable the fallback
timeout behavior if a spinner is being shown:

$(document).on('pjax:timeout', function(event) {
  // Prevent default timeout redirection behavior
  event.preventDefault()
})

Advanced configuration

Reinitializing plugins/widget on new page content

The whole point of pjax is that it fetches and inserts new content without
refreshing the page. However, other jQuery plugins or libraries that are set to
react on page loaded event (such as DOMContentLoaded) will not pick up on
these changes. Therefore, it's usually a good idea to configure these plugins to
reinitialize in the scope of the updated page content. This can be done like so:

$(document).on('ready pjax:end', function(event) {
  $(event.target).initializeMyPlugin()
})

This will make $.fn.initializeMyPlugin() be called at the document level on
normal page load, and on the container level after any pjax navigation (either
after clicking on a link or going Back in the browser).

Response types that force a reload

By default, pjax will force a full reload of the page if it receives one of the
following responses from the server:

  • Page content that includes <html> when fragment selector wasn't explicitly
    configured. Pjax presumes that the server's response hasn't been properly
    configured for pjax. If fragment pjax option is given, pjax will extract the
    content based on that selector.

  • Page content that is blank. Pjax assumes that the server is unable to deliver
    proper pjax contents.

  • HTTP response code that is 4xx or 5xx, indicating some server error.

Affecting the browser URL

If the server needs to affect the URL which will appear in the browser URL after
pjax navigation (like HTTP redirects work for normal requests), it can set the
X-PJAX-URL header:

def index
  request.headers['X-PJAX-URL'] = "http://example.com/hello"
end

Layout Reloading

Layouts can be forced to do a hard reload when assets or html changes.

First set the initial layout version in your header with a custom meta tag.

<meta http-equiv="x-pjax-version" content="v123">

Then from the server side, set the X-PJAX-Version header to the same.

if request.headers['X-PJAX']
  response.headers['X-PJAX-Version'] = "v123"
end

Deploying a deploy, bumping the version constant to force clients to do a full reload the next request getting the new layout and assets.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市僚焦,隨后出現(xiàn)的幾起案子芳悲,更是在濱河造成了極大的恐慌名扛,老刑警劉巖茧痒,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弄企,死亡現(xiàn)場離奇詭異拘领,居然都是意外死亡樱调,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菩颖,“玉大人晦闰,你說我怎么就攤上這事呻右。” “怎么了眉撵?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵纽疟,是天一觀的道長污朽。 經(jīng)常有香客問我蟆肆,道長炎功,這世上最難降的妖魔是什么柬赐? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任州藕,我火速辦了婚禮酝陈,結(jié)果婚禮上沉帮,老公的妹妹穿的比我還像新娘贫堰。我一直安慰自己其屏,他們只是感情好缨该,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布贰拿。 她就那樣靜靜地躺著,像睡著了一般妙真。 火紅的嫁衣襯著肌膚如雪荚守。 梳的紋絲不亂的頭發(fā)上健蕊,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天缩功,我揣著相機與錄音,去河邊找鬼嫡锌。 笑死,一個胖子當著我的面吹牛蛛倦,可吹牛的內(nèi)容都是我干的溯壶。 我是一名探鬼主播甫男,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼板驳,長吁一口氣:“原來是場噩夢啊……” “哼若治!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礼烈,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤此熬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡碉,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鲫寄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年地来,在試婚紗的時候發(fā)現(xiàn)自己被綠了未斑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片币绩。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡缆镣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出董瞻,到底是詐尸還是另有隱情,我是刑警寧澤挟秤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布煞聪,位于F島的核電站逝慧,受9級特大地震影響啄糙,放射性物質(zhì)發(fā)生泄漏纯露。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拐格。 院中可真熱鬧捏浊,春花似錦撞叨、人聲如沸牵敷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奕锌。三九已至惊暴,卻和暖如春辽话,著一層夾襖步出監(jiān)牢的瞬間卫病,已是汗流浹背蟀苛。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工幽告, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冗锁。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓冻河,卻偏偏與公主長得像叨叙,于是被迫代替她去往敵國和親擂错。 傳聞我的和親對象是個殘疾皇子廷蓉,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容