Jquery load()不会在div中加载脚本标记

时间:2015-12-14 13:26:06

标签: javascript jquery html jquery-load

第1页有一个带有id(#navigation)的菜单,其中一个名为Page2的链接和一个ID为id(global_content)的DIV,用于显示单击链接Page2时的内容。在同一页面(第1页)中,我编写了一个jquery加载函数,因此当我单击链接时,它应显示内容而不重新加载页面。加载事件工作正常,内容显示,但没有 的脚本标记。

这是第1页中的代码

<script>
jQuery(document).ready(function() {

    //jQuery('#navigation li a').click(function(){
    jQuery('#navigation li').on('click', 'a', function(){

    var toLoad = jQuery(this).attr('href')+' #global_content';
    jQuery('#global_content').fadeOut('fast',loadContent);
    jQuery('#load').remove();
    jQuery('#wrapper').append('<span id="load">LOADING...</span>');
    jQuery('#load').fadeIn('normal');
    function loadContent() {
        jQuery('#global_content').load(toLoad, function() {
        jQuery('#global_content').fadeIn('fast', hideLoader());

        });
    }
    function showNewContent() {
        jQuery('#global_content').show('normal',hideLoader());
    }
    function hideLoader() {
        jQuery('#load').fadeOut('normal');
    }
    return false;

    });
}); </script>

这是第2页中的代码

<div id="wall-feed-scripts">

  <script type="text/javascript">

    Wall.runonce.add(function () {

      var feed = new Wall.Feed({
        feed_uid: 'wall_91007',
        enableComposer: 1,
        url_wall: '/widget/index/name/wall.feed',
        last_id: 38,
        subject_guid: '',
        fbpage_id: 0      });

      feed.params = {"mode":"recent","list_id":0,"type":""};

      feed.watcher = new Wall.UpdateHandler({
        baseUrl: en4.core.baseUrl,
        basePath: en4.core.basePath,
        identity: 4,
        delay: 30000,
        last_id: 38,
        subject_guid: '',
        feed_uid: 'wall_91007'
      });
      try {
        setTimeout(function () {
          feed.watcher.start();
        }, 1250);
      } catch (e) {
      }

    });

  </script>
</div>

<div class="wallFeed">
some content
</div>

但我得到的输出是

<div id="wall-feed-scripts"></div>

 <div class="wallFeed">
    some content
    </div>

你能帮帮忙吗?

2 个答案:

答案 0 :(得分:5)

您可以直接使用jQuery.load stripping <script> tags来绕过jquery.ajax的限制,这是shorthand methods loadget,{{ 1}}等.. 我们将使用jquery.html来使用post来更新DOM。

innerHTML

如您所见,我们在响应中应用选择器var toLoad = this.href, toLoadSelector = '#global_content'; ... function loadContent() { jQuery.ajax({ url: toLoad, success: function(data,status,jqXHR) { data = jQuery(data).find( toLoadSelector ); jQuery('#global_content').html(data).fadeIn('fast', hideLoader()); } }); } toLoadSelector),仅插入页面的所需部分。

<强>更新

更好的方法是向'#global_content'函数引入一些参数,以便更容易重用。这是一个更新(和测试)的版本:

loadContent

关于这些变化的几点说明:

<script>
jQuery(function($) {

    $('#navigation li a').on('click', function() {
        loadContent( '#global_content', this.href, '#global_content' );
        return false;
    });

    function loadContent(target, url, selector) {

        $(target).fadeOut('fast', function() {

            showLoader();

            $.ajax({
                url: url,
                success: function(data,status,jqXHR) {
                    $(target).html($(data).find(selector).addBack(selector).children())
                    .fadeIn('fast', hideLoader());
                }
            });

        });
    }

    function showLoader() {
        $('#load').remove();
        $('#wrapper').append('<span id="load">LOADING...</span>').fadeIn('normal');
    }

    function hideLoader() {
        $('#load').fadeOut('normal');
    }
});
</script>

相同
jQuery(function() { ... })

在功能中指定jQuery(document).ready( function() { ... } ) 使function($)可用jQuery,从而节省了一些输入内容。

现在,关于这个表达式:

$

不幸的是,$(data).find(selector).addBack(selector).children() 不会返回任何结果:只有后代匹配。这意味着如果 Page2 $("<div id='foo'>").find('#foo') div直接置于#global_content下,则无效。添加addBack(selector)可以匹配顶级元素本身。有关详细信息,请参阅this so question

<body>确保 Page2 中的.children()标记本身不包含在内,否则 Page1 会有

<div id='global_content'>

这在技术上是非法的,因为<div id="global_content"> <div id="global_content"> 在文档中必须是唯一的。

答案 1 :(得分:1)

我最近有类似的问题。如评论中所述,jQuery在通过load()加载内容时忽略脚本标记。有人提到你应该使用$.getScript(),但这不会在严格模式下工作,因为通过getScript()加载的内容是通过eval()加载的,无法访问全局范围。因此getScript()会破坏您的JavaScript。唯一的方法是使用vanilla javascript。

// $.getScript() uses eval() which makes it impossible to define functions in 
// the global namespace in strict mode. Hence the closure thing here...
(function (callback) {
    var script = document.createElement("script");
    script.setAttribute("src", "./app/js/sequences/autoloader.php");
    script.addEventListener('load', callback);
    document.body.appendChild(script);
})(function () {
    // Callback funtion here
});