jjzjj

javascript - JQuery History.js 插件不替换 HTML4 和 HTML5 浏览器中一页的状态

coder 2024-05-17 原文

我正在使用 JQuery History.js plugin在 HTML5 浏览器中启用 History API 并在 HTML4 浏览器中模拟。我正在使用 Ajaxify script实现这个插件。我稍微更改了此脚本,如下所示:

var History, $, document;
function PrepareVariables() {
    History = window.History,
    $ = window.jQuery,
    document = window.document;
}

function InitHistory() {
    // Prepare Variables
    var
    /* Application Specific Variables */
    //contentSelector = '#content,article:first,.article:first,.post:first',
    contentSelector = '#navcontent';
    $content = $(contentSelector), //.filter(':first'),
    //contentNode = $content.get(0),
    $menu = $('#menu,#nav,nav:first,.nav:first').filter(':first'),
    activeClass = 'active selected current youarehere',
    activeSelector = '.active,.selected,.current,.youarehere',
    menuChildrenSelector = '> li,> ul > li',
    completedEventName = 'statechangecomplete',
    /* Application Generic Variables */
    $window = $(window),
    $body = $(document.body),
    rootUrl = History.getRootUrl(),
    scrollOptions = {
        duration: 800,
        easing: 'swing'
    };

    // Ensure Content
    if ($content.length === 0) {
        $content = $body;
    }

    // Internal Helper
    $.expr[':'].internal = function (obj, index, meta, stack) {
        // Prepare
        var
        $this = $(obj),
            url = $this.attr('href') || '',
            isInternalLink;

        // Check link
        isInternalLink = url.substring(0, rootUrl.length) === rootUrl || url.indexOf(':') === -1;

        // Ignore or Keep
        return isInternalLink;
    };

    // HTML Helper
    var documentHtml = function (html) {
        // Prepare
        var result = String(html)
            .replace(/<\!DOCTYPE[^>]*>/i, '')
            .replace(/<(html|head|body|title|meta|script)([\s\>])/gi, '<div class="document-$1"$2')
            .replace(/<\/(html|head|body|title|meta|script)\>/gi, '</div>');

        // Return
        return $.trim(result);
    };

    // Ajaxify Helper
    $.fn.ajaxify = function () {
        // Prepare
        var $this = $(this);

        // Ajaxify
        //$this.find('a:internal:not(.no-ajaxy)').click(function (event) {
        $this.find("a[data-isnav='0']").click(function (event) {
            // Prepare
            var
            $this = $(this),
                url = $this.attr('href'),
                title = ($this.attr('title') || null);

            // Continue as normal for cmd clicks etc
            if (event.which == 2 || event.metaKey) {
                return true;
            }

            // Ajaxify this link
            History.pushState(null, title, url);
            event.preventDefault();
            return false;
        });

        // Chain
        return $this;
    };

    // Ajaxify our Internal Links
    $body.ajaxify();

    // Hook into State Changes
    $window.bind('statechange', function () {
        // Prepare Variables
        var
        State = History.getState(),
            url = State.url,
            relativeUrl = url.replace(rootUrl, '');


        // Start Fade Out
        // Animating to opacity to 0 still keeps the element's height intact
        // Which prevents that annoying pop bang issue when loading in new content
        $content.animate({
            opacity: 0
        }, 800);

        // Ajax Request the Traditional Page
        callAjax("GetContent", {
            URL: url /*typeOfHeader: contentType, argsdata: argdata*/
        },
        false,

        function () {
            var ops = $('#ops');
            if (ops != null) ops.html('');
            ShowProgress('');
            //var now = (new Date()).getTime();                    //Caching
            //if (headerCache.exist(url)) {
            //    tDiff = now - headerCacheTime;
            //    if (tDiff < 3000) {
            //        setContentData(headerCache.get(url));
            //        return true;
            //    }
            //}
        },

        function (d) {
            //headerCache.set(url, d, null);
            //cacheName = url;
            HideProgress();
            setContentData(d);
        }, null);

        // end ajax

    }); // end onStateChange
}
(function (window, undefined) {

    // Prepare our Variables
    PrepareVariables();

    // Check to see if History.js is enabled for our Browser
    if (!History.enabled) {
        return false;
    }

    // Wait for Document
    $(function () {
        InitHistory();
    });
    // end onDomLoad

})(window); // end closure
function UpdateHistory() {
    var title = (document.title.trim().length > 0 ? document.title : null);
    var url = window.location.href.replace(/^.*\/\/[^\/]+/, '');
    var History = window.History;
    History.replaceState(null, title, url);
    $('a[data-isnav="0"').click(function () {
        // Prepare
        var
        $this = $(this),
            url = $this.attr('href'),
            title = ($this.attr('title') || null);

        // Continue as normal for cmd clicks etc
        if (event.which == 2 || event.metaKey) {
            return true;
        }

        // Ajaxify this link
        History.pushState(null, title, url);
        event.preventDefault();
        return false;
    });
}

function setContentData(d) {
    var data = d.data;

    // Fetch the scripts
    //$scripts = $dataContent.find('.document-script');
    //if ($scripts.length) {
    //    $scripts.detach();
    //}

    // Fetch the content
    contentHtml = data;
    if (!contentHtml) {
        document.location.href = url;
        return false;
    }

    // Update the menu
    //$menuChildren = $menu.find(menuChildrenSelector);
    //$menuChildren.filter(activeSelector).removeClass(activeClass);
    //$menuChildren = $menuChildren.has('a[href^="' + relativeUrl + '"],a[href^="/' + relativeUrl + '"],a[href^="' + url + '"]');
    //if ($menuChildren.length === 1) { $menuChildren.addClass(activeClass); }

    // Update the content
    $content.stop(true, true);
    $content.html(contentHtml).ajaxify().css('opacity', 100).show(); /* you could fade in here if you'd like */

    //Intialize other content
    initContent();

    // Update the title
    //document.title = $data.find('.document-title:first').text();
    //try {
    //    document.getElementsByTagName('title')[0].innerHTML = document.title.replace('<', '&lt;').replace('>', '&gt;').replace(' & ', ' &amp; ');
    //}
    //catch (Exception) { }

    // Add the scripts
    //$scripts.each(function () {
    //    var $script = $(this), scriptText = $script.text(), scriptNode = document.createElement('script');
    //    if ($script.attr('src')) {
    //        if (!$script[0].async) { scriptNode.async = false; }
    //        scriptNode.src = $script.attr('src');
    //    }
    //    scriptNode.appendChild(document.createTextNode(scriptText));
    //    contentNode.appendChild(scriptNode);
    //});

    // Complete the change
    if ($body.ScrollTo || false) {
        $body.ScrollTo(scrollOptions);
    } /* http://balupton.com/projects/jquery-scrollto */
    $window.trigger(completedEventName);

    // Inform Google Analytics of the change
    if (typeof window._gaq !== 'undefined') {
        window._gaq.push(['_trackPageview', relativeUrl]);
    }

    // Inform ReInvigorate of a state change
    if (typeof window.reinvigorate !== 'undefined' && typeof window.reinvigorate.ajax_track !== 'undefined') {
        reinvigorate.ajax_track(url);
        // ^ we use the full url here as that is what reinvigorate supports
    }
}

它工作正常,使用 Ajax 添加到页面上的内容使用 UpdateHistory() 函数添加到之前的状态。在某些页面上,状态已成功更新,但在某个页面上,第二次访问该页面时未更新内容。我搜索了所有类似的问题,但无法获得任何解决方案。一开始我以为问题出在 Internet Explorer 上,但后来我在 Firefox 上试了一下,但没有成功。请告诉我可能是什么原因?

更新

它适用于以下网址:

http://localhost:13956/AppStore/App/2012/Install

但不适用于:

http://localhost:13956/AppStore

最佳答案

第一页好像没有保存。尝试在 InitHistory() 中调用 UpdateHistory()History.pushState(null, title, url)

关于javascript - JQuery History.js 插件不替换 HTML4 和 HTML5 浏览器中一页的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593843/

有关javascript - JQuery History.js 插件不替换 HTML4 和 HTML5 浏览器中一页的状态的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  6. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  7. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

  8. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

  9. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  10. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

随机推荐