42

まず、location.pushState/のポリフィルを提供するライブラリpopState( History.jsHash.jsjQuery hashchange ) があることを知っているので、それらにリンクしないでください。

RIA で次のことを実現するには、より強力なライブラリが必要です。

  1. ユーザーがリンクをクリックする
  2. ライブラリは通知され、Ajax を介してコンテキストをロードします (完全なリロードはありません!)
  3. すべての<a>要素はクリック ハンドラーで活用されます。
  4. 読み込まれたコンテンツがページに挿入され、現在のコンテンツが置き換えられます
  5. 1 に進みます。

また、以前に読み込まれたコンテンツは、ユーザーが戻ったときに復元する必要があります。

例として、Internet Explorer <10 およびその他のブラウザーでGoogle+をクリックします。

さらに近いものはありますか?IE8、FF10、Safari 5、Chrome 18 のサポートが必要です。また、MIT や Apache などの寛容なライセンスが必要です。

4

7 に答える 7

21

Sammy.js ( http://sammyjs.org ) (MIT ライセンス) は、次の 2 つの主要な柱を使用して、やりたいことに最も焦点を当てていると思います。

  1. ルート
  2. イベント

ドキュメントから引用することもできますが、それは非常に簡単です。

  • 実行するものに関連するクライアント側のルートをセットアップします。例: ajax を介してビューを更新します。

  • イベントをリンクしてルートを呼び出します。たとえば、リンクをクリックすると上記のルートが呼び出されます。(これは実際にはアプリの決定であるため、定義されたイベントで e.preventDefault が呼び出されていることを確認する必要があります。そのため、使用するライブラリによって抽象化することはできません)

関連ドキュメント

ルートの例: ( http://sammyjs.org/docs/tutorials/json_store_1から)

 this.get('#/', function(context) {
    $.ajax({
      url: 'data/items.json',
      dataType: 'json',
      success: function(items) {
        $.each(items, function(i, item) {
          context.log(item.title, '-', item.artist);
        });
      }
    });
  });

または次のようなもの

 this.get('#/', function(context) {
     context.app.swap(''); ///the 'swap' here indicates a cleaning of the view
                              //before partials are loaded, effectively rerendering the entire screen. NOt doing the swap enables you to do infinite-scrolling / appending style, etc. 
     // ...
   });

もちろん、他のクライアント側の MVC フレームワークもオプションになる可能性があります。これにより、さらに配管が不要になりますが、この状況ではやり過ぎになる可能性があります。

かなり良い(そしてまだかなり最近の)比較:

http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/ (私は Spine.js を自分で使用しています)。

最後に、少し前に書いた回答を含めて、クライアント側の更新などのベストプラクティス全体 (私が見ているように) を詳細に説明すると便利だと思いました。

アクセシビリティとこれらすべての JavaScript フレームワーク

于 2012-07-13T09:24:19.377 に答える
9

現在、アプリケーションの1つでPathJSを使用しています。それは私が下した最高の決断でした。特定のユースケースについては、 HTML5の例をご覧ください。

サンプルを機能させるコードの一部(ソースから):

<script type="text/javascript">
        // This example makes use of the jQuery library.

        // You can use any methods as actions in PathJS.  You can define them as I do below,
        // assign them to variables, or use anonymous functions.  The choice is yours.
        function notFound(){
            $("#output .content").html("404 Not Found");
            $("#output .content").addClass("error");
        }

        function setPageBackground(){
            $("#output .content").removeClass("error");
        }        

        // Here we define our routes.  You'll notice that I only define three routes, even
        // though there are four links.  Each route has an action assigned to it (via the 
        // `to` method, as well as an `enter` method.  The `enter` method is called before
        // the route is performed, which allows you to do any setup you need (changes classes,
        // performing AJAX calls, adding animations, etc.
        Path.map("/users").to(function(){
            $("#output .content").html("Users");
        }).enter(setPageBackground);

       Path.map("/about").to(function(){
            $("#output .content").html("About");
        }).enter(setPageBackground);

       Path.map("/contact").to(function(){
            $("#output .content").html("Contact");
        }).enter(setPageBackground);

        // The `Path.rescue()` method takes a function as an argument, and will be called when
        // a route is activated that you have not yet defined an action for.  On this example
        // page, you'll notice there is no defined route for the "Unicorns!?" link.  Since no
        // route is defined, it calls this method instead.
        Path.rescue(notFound);

        $(document).ready(function(){
            // This line is used to start the HTML5 PathJS listener.  This will modify the
            // `window.onpopstate` method accordingly, check that HTML5 is supported, and
            // fall back to hashtags if you tell it to.  Calling it with no arguments will
            // cause it to do nothing if HTML5 is not supported
            Path.history.listen();

            // If you would like it to gracefully fallback to Hashtags in the event that HTML5
            // isn't supported, just pass `true` into the method.

            // Path.history.listen(true);

            $("a").click(function(event){
                event.preventDefault();

                // To make use of the HTML5 History API, you need to tell your click events to
                // add to the history stack by calling the `Path.history.pushState` method. This
                // method is analogous to the regular `window.history.pushState` method, but
                // wraps calls to it around the PathJS dispatched.  Conveniently, you'll still have
                // access to any state data you assign to it as if you had manually set it via
                // the standard methods.
                Path.history.pushState({}, "", $(this).attr("href"));
            });
        });
    </script>

PathJSには、ルーティングライブラリの最も必要な機能がいくつかあります。

  • 軽量
  • HTML5 History API、「onhashchange」メソッド、および適切な劣化をサポートします
  • ルートルート、レスキューメソッド、パラメータ化されたルート、オプションのルートコンポーネント(動的ルート)、およびアスペクト指向プログラミングをサポートします
  • 十分にテスト済み(./testsディレクトリで利用可能なテスト)
  • すべての主要なブラウザと互換性があります(Firefox 3.6、Firefox 4.0、Firefox 5.0、Chrome 9、Opera 11、IE7、IE8、IE9でテスト済み)
  • すべてのサードパーティライブラリから独立していますが、すべてのサードパーティライブラリとうまく連携します

最後のポイントが最も魅力的だと思いました。あなたはここでそれらを見つけることができます

これがお役に立てば幸いです。

于 2012-07-19T13:15:50.413 に答える
8

の組み合わせを提案したい

ルーターとしてのcrossroads.jshttp ://millermedeiros.github.com/crossroads.js/

ブラウザの履歴とハッシュURLを処理するためのハッシャー(フォールバックソリューションがたくさんあります): https ://github.com/millermedeiros/hasher/( http://millermedeiros.github.com/js-signals/ に基づく)

これには(ajaxコンテンツなどをロードするために)数行のコードが必要ですが、ルートを処理するときに他の可能性のロードとロードを提供します。

これはjQueryを使用した例です(上記のライブラリはどれもjQueryを必要とせず、私はただ怠惰です...)

http://fiddle.jshell.net/Fe5Kz/2/show/light

HTML

<ul id="menu">
    <li>
        <a href="foo">foo</a>            
    </li>
    <li>
        <a href="bar/baz">bar/baz</a>
    </li>
</ul>

<div id="content"></div>

JS

//register routes
crossroads.addRoute('foo', function() {
    $('#content').html('this could be ajax loaded content or whatever');
});

crossroads.addRoute('bar/{baz}', function(baz) {

    //maybe do something with the parameter ...
    //$('#content').load('ajax_url?baz='+baz, function(){
    //    $('#content').html('bar route called with parameter ' + baz);
    //});

    $('#content').html('bar route called with parameter ' + baz);
});


//setup hash handling
function parseHash(newHash, oldHash) {
    crossroads.parse(newHash);
}
hasher.initialized.add(parseHash);
hasher.changed.add(parseHash);
hasher.init();


//add click listener to menu items
$('#menu li a').on('click', function(e) {
    e.preventDefault();
    $('#menu a').removeClass('active');
    $(this).addClass('active');

    hasher.setHash($(this).attr('href'));
});​
于 2012-07-13T08:12:29.510 に答える
5

MicrosoftのBigShelfサンプルSPA(シングルページアプリケーション)を見たことがありますか?それはあなたが求めていることのほとんどを達成する方法をカバーしているように聞こえます。

これは、History.jsを利用して、クリック処理のためにNavHistoryおよびKnockout.jsと呼ばれるナビゲーションを簡単に制御するカスタムラッパーオブジェクトです。

これがどのように機能するかについての非常に簡略化されたワークフローを次に示します。最初に、NavHistoryhistory.jsをラップし、プッシュ状態またはハッシュ変更があるときに実行されるコールバックを登録するオブジェクトを初期化する必要があります。

var nav = new NavHistory({
    params: { page: 1, filter: "all", ... etc ... },
    onNavigate: function (navEntry) {
        // Respond to the incoming sort/page/filter parameters
        // by updating booksDataSource and re-querying the server
    }
});

次に、リンクボタンなどにバインドできるコマンドを使用して1つ以上のKnockout.jsビューモデルを定義します。

var ViewModel = function (nav) {
  this.search = function () {
    nav.navigate({ page: 2, filter: '', ... }); // JSON object matching the NavHistory params
  };
}

最後に、マークアップで、Knockout.jsを使用してコマンドをさまざまな要素にバインドします。

<a data-bind="click: search">...</a>

リンクされたリソースは、これらすべてがどのように機能するかを説明する上で、はるかに詳細です。残念ながら、それはあなたが探しているような単一のフレームワークではありませんが、これを機能させることがいかに簡単であるかに驚くでしょう。

もう1つ、BigShelfの例に従って、私が構築しているサイトは完全にクロスブラウザー互換であり、IE6 +、Firefox、Safari(モバイルとデスクトップ)、Chrome(モバイルとデスクトップ)です。

于 2012-07-17T22:10:32.070 に答える
3

AjaxTCR Libraryすべてのベースをカバーしているようで、これまでに見たことのない堅牢な方法が含まれています。BSD ライセンス (オープン ソース イニシアチブ) の下でリリースされています。

たとえば、次の 5 つのAjaxTCR.history();方法があります。

init(onStateChangeCallback, initState);

addToHistory(ID、データ、タイトル、URL、オプション);

すべて取得();

getPosition();

enableBackGuard (メッセージ、即時);

上記addToHistory();には、Web サイトでのディープ ハッシュ リンクを可能にするのに十分なパラメータがあります。

.com.cookie().storage()、および.template()のより多くのアイキャンディーは、セッション データ要件を処理するのに十分なメソッドを提供します。

十分に文書化されたAjaxTCR API Web ページには、ダウンロード可能なドキュメントを含む大量の情報があります。

ステータスの更新:
この Web サイトには、すぐに使用できるフロントエンド(クライアント) およびバックエンド(サーバー) プロジェクト ファイルを含むダウンロード可能な.zip ファイルを含むサンプル Web ページ セクションもあります。

特に、すぐに使用できる次の例があります。
一方向 Cookie
HttpOnly Cookie
履歴盗用
履歴エクスプローラー

API メソッドの多くを使用するためのプロセスを完成させる他のかなりの数の例があり、小さな学習曲線をより速く完了することができます。

于 2012-07-13T08:48:22.240 に答える
3

いくつかの提案

注: ExtJs History は、への重複 (冗長) 呼び出しを最適化するために拡張されましたadd()

于 2012-07-13T07:55:12.917 に答える
1

PJAX は、あなたが説明しているプロセスです。

より高度な pjax 手法では、ユーザーがリンクにカーソルを合わせると、コンテンツのプリロードが開始されます。

これは優れた pjax ライブラリです。 https://github.com/MoOx/pjax

後続のリクエストで更新する必要があるコンテナをマークします。

new Pjax({ selectors: ["title", ".my-Header", ".my-Content", ".my-Sidebar"] })

したがって、上記では、、、、およびのみtitle.my-headerajax.my-content呼び出し.my-sidebarのコンテンツに置き換えられます。

注意事項

ページの準備が整ったときに JS がどのように読み込まれて検出されるかに注意してください。JavaScript は新しいページでリロードされません。同じ理由で、分析呼び出しが呼び出されるタイミングにも注意してください。

于 2015-10-14T15:31:01.170 に答える