0

ウィンドウのpopstateイベントにバインドするAJAX呼び出しがあります。クエリ文字列から引数を解析していることを除いて、これは機能します。問題は、ページが読み込まれるときにajax呼び出しがウィンドウにバインドされるため、URLが読み込まれるときに引数が変更されないことです。ウィンドウにリスナーを追加すると、バインドするのではなくajax呼び出しを実行できれば、毎回クエリ文字列が再解析されると思います。

たとえば、ページがdomain.com?x=1&y=2をロードする場合、私の呼び出しはx=1とy=2を送信します。ただし、ポップステートが起動してdomain.com?x=1&y=2&z=3になると、x=1とy=2が送信されます。

これが私の電話です

var ajax_path = Drupal.settings.views.ajax_path;
$.each(Drupal.settings.views.ajaxViews, function (i, settings) {
    var view = '.facetapi-facetapi-links';
    element_settings = {
        url: ajax_path,
        submit: settings,
        setClick: false,
        event: 'popstate',
        selector: view,
        progress: { type: 'throbber' }
    };
    var viewData = {};
    $.extend(
        viewData,
        settings,
        Drupal.Views.parseQueryString(document.URL),
        Drupal.Views.parseViewArgs(document.URL, settings.view_base_path)
    );
    $.extend(viewData, Drupal.Views.parseViewArgs(document.URL, settings.view_base_path));
    element_settings.submit = viewData;
    var ajax = new Drupal.ajax(false, window, element_settings);
});

私が考えていたのはこれをやっていることでしたが、どうすればいいのかわかりません。または、Drupal.ajax.prototype.beforeSendを何らかの方法で使用することは可能ですか?

window.addEventListener("popstate", function(e) {
    //execute ajax here so it reparses document.url
}
4

1 に答える 1

0

私はこの解決策を思いつきました。カスタムイベントを使用しているので、イベントを手動でトリガーできます

window.addEventListener("popstate", function(e) {        
    $(window).unbind('custom');
    $.each(Drupal.settings.views.ajaxViews, function (i, settings) {
        element_settings = {
            url: Drupal.settings.views.ajax_path,
            submit: settings,
            setClick: false,
            event: 'custom',
            selector: '.facetapi-facetapi-links',
            progress: { type: 'throbber' }
        };

        var viewData = {};
        $.extend(
            viewData,
            settings,
            Drupal.Views.parseQueryString(document.URL),
            // Extract argument data from the URL.
            Drupal.Views.parseViewArgs(document.URL, settings.view_base_path)
        );

        $.extend(viewData, Drupal.Views.parseViewArgs(document.URL, settings.view_base_path));

        element_settings.submit = viewData;

        var ajax = new Drupal.ajax(false, window, element_settings);
        console.log(element_settings);
    });
    $(window).trigger('custom');
});
于 2012-10-01T23:57:23.443 に答える