Til baka í janúar á þessu ári tilkynnti jQuery nýtt tappi skrásetning , svo nú virtist eins og a mikill tími til að skrifa námskeiði sameina að byggja upp jQuery tappi með ástríðu mína - realtime vefur tækni.

Realtime vefur tækni gerir það mjög auðvelt að bæta við lifandi efni á áður truflanir vefsíður. Lifandi efni getur leitt til að búa til síðu á lífi, halda notendum og fjarlægja þörfina fyrir að endurnýja síðuna reglulega. Realtime uppfærslur eru yfirleitt náð með því að tengjast gagnaupplýsingum, áskrift að gögnum sem þú vilt bæta við síðu og síðan uppfæra síðuna þegar gögnin koma. En hvers vegna getur þetta ekki náðst með því að einfaldlega merkja síðu til að bera kennsl á hvaða gögn skuli sýnd og hvar? Jæja, kannski getur það!

Tagline jQuery er skrifa minna, gera meira . The tagline fyrir jQuery Realtime tappi sem við erum að fara að byggja í þessari einkatími verður að skrifa minna, gera rauntíma.

Í þessari einkatími munum við búa til jQuery tappi sem gerir það mjög auðvelt að bæta við realtime efni á síðu með því einfaldlega að bæta við einhverjum merkjum. Í fyrsta lagi munum við fjalla um hvernig á að nota þjónustu sem kallast Pusher að gerast áskrifandi að rauntíma gögnum. Þá munum við skilgreina leið til að auðkenna HTML5 skjal með 'gögn- *' eiginleikum á þann hátt sem hægt er að leita eftir í realtime jQuery tappi okkar og breytt í realtime gögn áskrift. Að lokum munum við búa til jQuery tappann sem notar eiginleika til að gerast áskrifandi að gögnum og þegar í stað birta uppfærslur á síðunni.

Ef þú vilt bara að kafa beint í þig geturðu það skoðaðu kynningu í aðgerð eða þú getur hlaða niður kóðanum og hefja reiðhestur.

Pusher grunnatriði

Pusher er gestgjafi sem gerir það auðvelt að bæta við realtime efni og gagnvirka reynslu til vef- og farsímaforrita. Hér ætlum við einfaldlega að tengjast, gerast áskrifandi að einhverjum gögnum og síðan uppfæra síðu þegar gögnin koma inn.

Til að sýna fram á að búa til skrá sem heitir "example.html" og innihalda Pusher JavaScript bókasafnið frá Pusher CDN. Við vitum að við ætlum að nota jQuery 2.0.0 þannig að við ættum einnig að innihalda það núna:

Creating a realtime jQuery plugin | Webdesigner Depot

Tengdu

Þegar Pusher JavaScript bókasafnið hefur verið innifalið getum við tengst Pusher með því að búa til nýtt "Pusher" dæmi og fara í umsóknartakkann. Búðu til viðbótar "

Note: For the tutorial we’ll use an application key that I’ve provided but for your own applications you’ll need to sign up to Pusher to get your own.

You can check that you’re connected in three different ways. You can do it manually by checking the Pusher Debug Console, if you load the page with the Pusher Debug Console open you’ll see the connection logged. The Pusher JavaScript library provides a log property that you can assign a function to and then you can manually check to make sure a connection has been established by inspecting the browser’s JavaScript console. Or you can check the connection programmatically by monitoring the connection state of the Pusher instance.

pusher_001

The Pusher Debug console

Whatever you choose to do, you’ll now be connected.

Subscribe

Pusher uses the Publish & Subscribe pattern, so to receive data from Pusher you first need to subscribe to it. Pusher uses the term channels when it comes to subscriptions, so let’s subscribe to a channel called ‘test-channel’.

As with connection state, you can check the status of a subscription in a few ways; using the Pusher Debug Console, by checking the output from ‘Pusher.log’ or by binding to the ‘pusher:subscription_succeeded’ event.

pusher_002

Using Pusher.log to log pusher-js library information

Bind to events

Those of you who use jQuery will probably be familiar with the idea of binding to events. jQuery does provide shortcuts for some events (e.g. ‘.onclick( )’) but you can also bind to events using ‘.bind(, )’. Pusher follows this convention and you can bind to events to be informed when something updates; when the connection state changes, when a subscription succeeds or when new application data is received. For this example, and with the realtime plugin, we’re interested primarily in the latter.

Let’s bind to a ‘test-event’ on the channel:

When binding to an event you simply identify the event by name and pass in a reference to a function that will be called when that event occurs (is triggered) on the channel.

If you have a Pusher account you can test that the ‘handleEvent’ function is called by using the Pusher Event Creator; enter ‘test-channel’ as the channel name, ‘test-event’ as the event name and some data (‘{ “some” : “data” }’) into the event data text area and click the submit button. You’ll then see the debug information, along with the data you entered, logged to the JavaScript console.

pusher_003 

Triggering an event from the Pusher Event Creator and logging it in the JavaScript console

Since the realtime jQuery plugin that we’re building doesn’t publish (trigger) data (it just consumes it) we won’t cover that here. But if you’re interested in finding out more checkout the Pusher server docs.

Displaying realtime updates

The next thing to consider is displaying the realtime data updates to the user.

For this we’ll need an idea for a simple application; having worked in finance for a few years I’m generally keen to avoid any type of financial example, but Bitcoin has made it interesting and relevant. So, let’s create a very simple display for showing Bitcoin prices.

Note: We’re going to use some fake data. Let’s make sure this doesn’t result in more Bitcoin panic selling!

First, let’s create some HTML where we’ll display the realtime prices. We can pre-populate the display with prices known at the time the page was loaded:

Bitcoin Fake Prices

LastLowHighVolume
BTC/USD61.157 USD51 USD95.713 USD66271 BTC / 4734629 USD

Let’s update the JavaScript to subscribe to a more appropriately named channel called ‘btc-usd’ and bind to a ‘new-price’ event:

The ‘data’ sent to the ‘handleEvent’ function should also be in a more appropriate format – here’s the JSON:

{"last": "last value","low": "low value","high": "high value","volume": "volume value"}

Now that we know this we can change the ‘handleEvent’ function to update the appropriate cell in the table:

function handleEvent( data ) {var cells = $( '#bitcoin_prices tbody tr td' );cells.eq( 1 ).text( data.last );cells.eq( 2 ).text( data.low );cells.eq( 3 ).text( data.high );cells.eq( 4 ).text( data.volume );}

If you now trigger a ‘new-price’ event on the ‘btc-usd’ channel, using the JSON we defined, the page will update to show the new values.

There are ways of both making this code nicer and, as the page grows to show more data, optimise things. But, we’re going to make it so that realtime data will be added to the page simply by applying markup.

Before we progress, let’s first add a bit of styling to the example. In the ‘’ add the following CSS:

As you can undoubtedly tell, I’m no designer. So please feel free to improve on this.

pusher_004

The “styled” Bitcoin Fake Prices application

Finally, restructure things so we’re set up for building the plugin.

  1. Create an ‘examples’ directory and within it a ‘bitcoin’ directory.
  2. Move the ‘example.html’ file to ‘examples/bitcoin’, rename it ‘index.html’.
  3. Create a ‘src’ directory at the top-level of the project.

The directory structure should now look as follows:

/
examples/
bitcoin/
index.html
src/

We’re now ready to define our realtime markup and build the realtime jQuery plugin.

Realtime markup

The first thing to highlight is that this isn’t a new idea — I worked for a company called Caplin Systems and in 2001 they had a technology known as RTML that let you markup a page so that realtime updates could be applied. The purpose here is to use jQuery to parse the page and then interpret the markup, resulting in subscriptions, event binding and ultimately live content being added to the page.

For our plugin we’ll use HTML5’s data-* attributes. These attributes don’t directly affect the layout or presentation of the page so they’re a great choice for our realtime markup.

The questions we now need to answer about the markup are:

  • Where do we put the Pusher application key?
  • How do we identify what channels should be subscribed to?
  • How do we identify the events that should be bound to on a channel?
  • How do we know what data to display in the page, and where?

The first one is relatively easy. Since we need to include our plugin JavaScript file we can add a ‘data-rt-key’ attribute to the ‘

So, from the script tag you can see we’re going to connect to Pusher using the key identified by ‘data-rt-key’. We’re going to subscribe to the ‘btc-usd’ channel and bind to the ‘new-price’ event. When an event is received we’re going to update the appropriate table cell based on the value indicated by ‘data-rt-value’; if the value of the attribute is ‘last’ then the value of the ‘last’ property is taken from the received ‘data’ object and displayed in the cell.

Hopefully what we are trying to achieve is now pretty clear. Let’s start looking at how to create a jQuery plugin.

jQuery plugin basics

The jQuery plugin creation docs are pretty good so I won’t go into the details here. We’ll simply concentrate on building the functionality that we need in our plugin.

Before we write any code we should consider how we want to use the plugin. The normal way a plugin functions is that you use jQuery to query the page, and then you execute the plugin functionality against the matched elements.

$( 'a' ).toggle();

The above code would find all ‘’ elements and then execute the ‘toggle()’ functionality on them — probably hiding all anchors, so not the most useful example you’ll ever see.

So, let’s say we would want to use the plugin as follows:

Skulum líta á að búa til væntanlega virkni.

Realtime tappi

Fyrst skaltu búa til 'realtime.jquery.js' skrá innan 'src' möppunnar. Þessi skrá mun innihalda tappi virkni. Bættu síðan við eftirfarandi við skrána sem upphafspunkt við tappi okkar:

( function( $) {$.fn.realtime = function() {console.log( 'realtime!' );console.log( $( this ).html() );}  ;} (jQuery)); 

Við getum jafnvel prófað þetta núna. Í 'dæmi / bitcoin / index.html' fjarlægðu dæmi tappi '

Ef þú endurnýjar síðuna núna munt þú sjá 'realtime!' skráður í JavaScript hugga ásamt HTML frá '

'þáttur. Þetta er frábært þar sem það þýðir að tappi er að vinna; Við erum með góðum árangri að framkvæma tappi virkni okkar á borðið sem auðkenndur er af valnum sem við sendum í jQuery.

pusher_005

jQuery tappi og þriðja aðila bókasöfn

Realtime tappi okkar byggir á þriðja aðila bókasafn - Pusher JavaScript bókasafn. Í augnablikinu sem við höfum það innifalið statically innan HTML okkar, en við viljum ekki gera það kröfu um að nota tappi. Svo, við skulum hlaða það á virkan hátt. jQuery veitir leið til að gera þetta auðveldlega í formi '.getScript ()' virka.

Svo, við skulum hlaða útgáfu 2.0 af Pusher JavaScript bókasafninu. Við hleðum HTTPS vistaðri útgáfu þannig að vafrar séu ánægðir ef viðbótin okkar er notuð á síðu sem birtist yfir HTTPS (Chrome stillir nú þegar tilraunir til að hlaða HTTP-hýst skriftum í HTTPS síðum og Firefox mun gera í Firefox 23 ). Ég er að fara að vefja hleðslu bókasafnsins í aðgerð sem hér segir:

var libraryLoaded = false;function loadPusher() {$.getScript( "https://d3dy5gmtp8yhk7.cloudfront.net/2.0/pusher.min.js" ).done( pusherLoaded ).fail( function( jqxhr, settings, exception ) {console.log( 'oh oh! ' + exception );}  );} virka pusherLoaded (script, textStatus) {libraryLoaded = true; console.log ('pusher.min.js hlaðinn:' + textStatus);} loadPusher (); 

Ef þú hleður niður síðunni verður 'pusher.min.js hlaðinn: skilaboð' velgengin í stjórnborðinu.

Eins og við erum að þróa það er alltaf gott að hafa leið til að skrá þig inn upplýsingar svo að á þessum tímapunkti skulum við búa til einfalda "þig inn" virka sem við getum notað sem skráir þig bara inn á vélinni. Við munum nota þetta núna og einnig nota það til að skrá þig á Pusher atburði. The fullur uppspretta af the tappi er nú:

( function( $ ) {function log( msg ) {console.log( msg );}var libraryLoaded = false;function loadPusher() {$.getScript( "https://d3dy5gmtp8yhk7.cloudfront.net/2.0/pusher.min.js" ).done( pusherLoaded ).fail( function( jqxhr, settings, exception ) {log( 'oh oh! ' + exception );}  );} virka pusherLoaded (script, textStatus) {libraryLoaded = sönn; Pusher.log = log; log ('pusher.min.js hlaðinn:' + textStatus);} $. fn.realtime = virka () {log Realtime! '); Log ($ (this). Html ());}; hlaðaPusher ();} (jQuery)); 

Þú munt einnig taka eftir því að við höfum úthlutað 'log'-aðgerðinni að eigninni' Pusher.log '. Þetta þýðir að við getum séð innri Pusher bókasafnið skráningu eins og heilbrigður eins og okkar eigin.

Hvenær eigum við að tengjast?

Vegna ósamstilltu eðli hleðslu safnsins getum við ekki ábyrgst að það muni hlaðast þegar viðbótin okkar er kallað í aðgerð. Því miður gerir þetta hlutina svolítið flóknara en það er tilvalið en við munum reyna að leysa það eins einfaldan og mögulegt er.

Við þurfum að athuga hvort bókasafnið hefur hlaðið - þar af leiðandi 'libraryLoaded' fáninn - og bregðast á viðeigandi hátt; ef bókasafnið hefur hlaðið við getum tengst, ef það hefur ekki við þurfum að biðja framkvæmdina þar til það gerir það. Vegna þessa gerir það meira vit í að búa til Pusher dæmi þegar við þurfum raunverulega það, sem er þegar við viljum í raun að gerast áskrifandi að gögnum.

Skulum líta á hvernig við getum gert þetta:

var pending = [];function pusherLoaded( script, textStatus ) {libraryLoaded = true;while( pending.length !== 0 ) {var els = pending.shift();subscribe( els );}}function subscribe( els ) {}$.fn.realtime = function() {var els = this;if( libraryLoaded ) {subscribe( els );}else {pending.push( els );}};

Þegar tappi er kallaður skoðum við flipann 'libraryLoaded' til að sjá hvort Pusher JavaScript bókasafnið hefur verið hlaðið inn. Ef það er gott að fara og við getum gerst áskrifandi. Ef það er enn í bið þá þurfum við að biðja um áskriftina. Við gerum þetta með því að ýta á jQuery safnið ('els') á 'bið'

Nú, tengdu

Nú þegar við vitum að Pusher JavaScript bókasafnið hefur hlaðið og að síðunni vill gerast áskrifandi að gögnum getum við búið til dæmi okkar "Pusher". Vegna þess að við viljum aðeins eitt dæmi um "Pusher" á hverri síðu ætlum við að fylgja Singleton mynstur og hafa 'getPusher ()':

var pusher;function getPusher() {if( pusher === undefined ) {var pluginScriptTag = $("script[src$='jquery.realtime.js']");var appKey = pluginScriptTag.attr("data-rt-key");pusher = new Pusher( appKey );}return pusher;}

Þessi aðgerð grípur tappi handritið með því að leita að tagi með 'src' eiginleiki sem endar með 'jquery.realtime.js' og þá færðu gildi eiginleikans 'gögn-rt-lykill'. Það skapar þá nýtt "Pusher" dæmi sem liggur í lyklinum. Eins og áður hefur verið fjallað er um að búa til nýtt "Pusher" dæmi í tengslum við uppruna gagna okkar að vera stofnaður.

Gerast áskrifandi

Við getum nú notað 'getPusher ()' virka hvenær sem við viljum fá aðgang að 'Pusher' dæmiinu. Í okkar tilviki viljum við nota það þegar við flokka þætti til að ákvarða áskriftir.

Uppfæra aðgerðina "áskrift" á staðnum og bættu við viðbótaraðgerðum sem sýndar eru hér að neðan:

function subscribe( els ) {var channelEls = els.find( "*[data-rt-channel]" );log( 'found ' + channelEls.size() + ' channels' );channelEls.each( subscribeChannel );}function subscribeChannel( index, el ) {el = $( el );var pusher = getPusher();var channelName = el.attr( 'data-rt-channel' );var channel = pusher.subscribe( channelName );}function find( els, selector ) {var topLevelEls = els.filter( selector );var childEls = els.find( selector );return topLevelEls.add( childEls );}

The "finna" virka er gagnsemi virka til að fá einhverjar þættir úr núverandi safn sem passa tiltekið val með því að nota '.filter ()', ásamt afkomendum þeirra sem nota '.find ()'. Við notum þessa aðgerð til að finna hvaða þætti sem eru merktar til að tákna rásáskriftir ('gögn-rt-rás' eigindi) og fyrir hvert sem við kallum þá 'subscribeChannel'. Þessi aðgerð útdregur nafnið á rásinni sem á að vera áskrifandi að og notar gildið í kalli 'pusher.subscribe (channelName)' til að gerast áskrifandi að rásinni.

Binda

Við verðum síðan að finna hvaða þætti sem eru merktar til að tákna atburði ("gögn-rt-atburður" eigindi) til að vera bundin við:

function subscribeChannel( index, el ) {el = $( el );var pusher = getPusher();var channelName = el.attr( 'data-rt-channel' );var channel = pusher.subscribe( channelName );var eventEls = find( el, '*[data-rt-event]' );log( 'found ' + eventEls.size() + ' events' );eventEls.each( function( i, el) {bind( el, channel );} );}function bind( el, channel ) {el = $( el );var eventName = el.attr( 'data-rt-event' );channel.bind( eventName, function( data ) {displayUpdate( el, data );} );}function displayUpdate( el, data ) {}

Fyrir hverja viðburðareiningu finnum við að hringja í eigin eiginleikann "binda" sem binst við viðburðinn á rásinni með því að nota 'channel.bind (eventName, eventHandler)'. The atburður handler virka er lítill lokun sem gerir okkur kleift að framhjá gögnum uppfærslu, þegar móttekin, og atburður þáttur í 'displayUpdate' virka.

Ef við keyrum þetta núna getum við séð frá skógarhögginu um að tenging sé stofnuð, við erum að finna eina rás og gerast áskrifandi að henni og finna einn atburð til að tengjast.

pusher_006

jQuery realtime markup finna rás áskrift og atburði bindandi

Birta uppfærsluna

Þegar atburðarásinni er kallaður þurfum við að finna nafn hvers eignar á hlutanum "gögn" (td síðast, lágt, hátt og bindi) send með uppfærslunni og finndu hvaða þætti sem eru merktar með því nafni.

function bind( el, channel ) {el = $( el );var eventName = el.attr( 'data-rt-event' );channel.bind( eventName, function( data ) {displayUpdate( el, data );} );}function displayUpdate( el, data ) {for( var propName in data ) {var value = data[ propName ];var updateEls = find( el, '*[data-rt-value="' + propName + '"]' );log( 'found ' + updateEls.size() + ' "' + propName + '" elements to update' );updateEls.text( value );}}

Við lykkjum yfir 'gögn' mótmæla og fá nafn hvers eignar. Þegar við þekkjum eignanafnið ('propName') getum við fundið tengda þætti og uppfært textaverðmæti þeirra með nýju gögnum. Fyrir nú ætlum við ekki að styðja við hluti með einhvers konar stigveldi - við viljum bara eitt stig af lykil- og gildipörum.

Ef þú endurnýjar síðuna núna og kveikir á atburði frá Pusher Event Creator munu ný gögn birtast strax á síðunni.

Hefur þú unnið með lifandi gagnaþjónustu? Hvaða lærdóm lærðuðu? Láttu okkur vita í athugasemdunum.

Valin mynd / smámynd, lifandi gögn mynd um Shutterstock.