【问题标题】:SyntaxHighlighter with $().load Not Working带有 $().load 的 SyntaxHighlighter 不起作用
【发布时间】:2014-02-08 01:18:36
【问题描述】:

编辑:为了清晰和实际使用而进行的编辑。实际使用甚至可能使这种情况变得更容易?

我正在构建一个样式指南,我想为将要使用该指南的人包含常见样式/模式的源代码。我的计划是将所有繁重的 HTML 代码模块抽象到外部文件中,并使用 jQuery 将它们拉入,然后使用 SyntaxHighlighter 突出显示屏幕上显示的内容。下面的 HTML 显示了我的意图和我想做的事情。

我暂时删除了所有 JavaScript,因为它不会为手头的问题增加任何价值。我会更新我想出的任何东西。

<div class="sg-section">
    <div class="sg-section-body">
        <div data-load="markup/pagination.html"></div>
    </div>
    <div class="sg-section-code">
        <small>Source Code</small>
        <pre class="brush: js">
            <!-- This is where I want to print out the contents  -->
            <!-- of the 'sg-section body' above and show it's source -->
        </pre>
    </div>
</div>

我可以使用简单的 $('[data-load]'.each(); 语句加载数据,但我很难将结果打印到 sg-section-code 并突出显示。

结论:切换到Prism。工作精美。

【问题讨论】:

    标签: javascript jquery syntaxhighlighter


    【解决方案1】:

    已编辑:

      function loadScript(placeholder){
        var $p = $(placeholder);
        var deferred = $.Deferred();
        $p.load($p.attr('data-load'),function(response){
            $p.parent().append(response).end().remove();   
            deferred.resolve();
        });
        return deferred;
    } 
    

    要删除占位符并直接从外部 html 插入代码,这应该可以解决您只显示占位符而不显示实际代码的问题。

    你的问题是 load 是一个异步方法,你不知道什么时候调用 SyntaxHighlight.all();

    所以,我想到的解决方案是使用 jQuery.Deferred 对象。让load 告诉你它何时完成加载所有外部脚本。

    首先提取方法loadScript

    function loadScript(placeholder){
      var $p = $(placeholder);
      var deferred = $.Deferred();
      $p.load($p.attr('data-load'),function(){
        deferred.resolve();
      });
      return deferred;
    }
    

    然后将所有任务压入一个数组,最后使用$.when().then()通知所有脚本加载完毕,然后调用SyntaxHighlighter.all();

    $(function(){
      var q = [];
      $('[data-load]').each(function(item){
        q.push(loadScript(item));
      });
      $.when.apply($, q).done(function(){
        SyntaxHighlighter.all();
      });
    });
    

    【讨论】:

    • jsfiddler 抱歉,请尝试 loadScript(this) 而不是 item
    • 是的,第二个参数是一个回调,当远程加载成功时调用,deferred.resolve();表示加载完成
    • $.when 是一种等待所有延迟对象解决的方法,它将在它的 done() 方法中启动回调,所以我的想法是等到所有外部 html 加载然后启动 SyntaxHighlighter.all ()
    • @AmitJoki 是的,有什么问题?
    • @AmitJoki 你有没有调试到SyntaxHighlighter.all() 看看它在使用 $.load 的“完成回调”之前做了什么?
    【解决方案2】:
    $(document).ready(function(){
    
        // Get Markup Pages
        $("[data-load]").each(function (index) {
            $(this).load($(this).attr("data-load"),function(){SyntaxHighlighter.all()});
        });
    });
    

    这应该可以工作,因为 SyntaxHighlighter.all(); 在 test.html 加载后执行

    【讨论】:

    • @EHorodyski,我不这么认为,它在 jquery 文档中给出。看这里api.jquery.com/load
    • @AmitJoki 你知道SyntaxHighlighter.all() 在循环中每次都会被调用吗?如果有10个元素,它会被调用10次,而'SyntaxHighlighter.all()'这个方法应该只被调用一次,你不觉得这很糟糕吗?
    • @AmitJoki 不要把问题想得太简单,你的解决方案行得通,不好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多