代码之家  ›  专栏  ›  技术社区  ›  zaius

AJAX浏览器刷新,响应中包含脚本标签

  •  3
  • zaius  · 技术社区  · 16 年前

    我在jQuery AJAX调用中遇到了一些问题。当我请求一个没有javascript的页面时,我的代码工作得很好,但当我的代码中有script标签时,事情开始变得奇怪。

    具体谈谈我的问题;我有一个选项卡控件,我试图在其中嵌入walkscore小部件。由于它在客户端很重,我只想在用户点击它所在的选项卡后实际加载它。walkscore AJAX页面看起来像这样:

    <script type="text/javascript">
      var ws_address = "1 Market St, San Francisco";
      var ws_width = "500";
    </script>
    <script type="text/javascript" src="http://www.walkscore.com/tile/show-tile.php?wsid=MY_WSID">
    </script>
    

    --编辑--

    好吧,我已经玩了一段时间,把问题缩小了一点。让我同时给出一个更好的解释:

    我有两个文件,index.html和walkscore.html

    function widget() {
      var widget = $('#walkscore');
      $.get('/walkscore.html', function(data) {
        $('#loading').slideUp(function() {
          widget.html(data);
          loaded[name] = true;
          widget.slideDown();
        });
      });
    }
    

    --编辑--

    这似乎与文档有关。我复制了walkscore javascript,并将所有出现的document.write替换为jquery.html,它似乎工作正常。我(显然)是个菜鸟。这是document.write的预期行为吗?为什么当我在页面加载中包含脚本时,它不会这样做?

    6 回复  |  直到 16 年前
        1
  •  1
  •   Artem Barger    16 年前

        2
  •  1
  •   sth    16 年前

    这与文档有关。请在回复中填写。我在Firefox中通过以下操作解决了这个问题:

    <script type="text/javascript">
    
      // save default document.write function so we can set it back
      var write_func_holder = document.write;
    
      // redefine document.write to output text target div
      document.write = function(text) {
        $('#ad_container').html($('#ad_container').html() + text);
      }
    </script>
    
    <script language="JavaScript" type="text/javascript" src="javascriptfile">
    </script>
    
    <script type="text/javascript">
      // reset document.write function
     document.write = write_func_holder;
    </script>
    

    我在Safari中仍然遇到一个问题,浏览器刷新到一个只有文档内容的空白页面。write和IE6、IE7根本不做任何事情。不过,Firefox可以工作。

    我希望这能帮助人们找出问题所在,进而解决IE6/7和Safari的问题

        3
  •  1
  •   zaius    16 年前

    加载页面后写作

    如果在页面加载完成后调用document.write(),则页面的整个静态(非脚本生成)内容将被write方法的参数替换。当从事件处理程序调用写方法时,这种情况最常见——无论该方法是在事件处理程序所调用的函数中还是单独在处理程序中——因为事件处理程序是在页面加载完成后触发的。这一点很重要,因为静态内容替换并不总是理想的结果。内容过载的另一种常见情况与将内容写入新窗口有关。在这种情况下,目标是覆盖空白页。 ( source )

    http://www.webxpertz.net/forums/showthread.php?threadid=11658

        4
  •  1
  •   noah    16 年前

    writeCapture.js 处理所有边缘情况。

        5
  •  0
  •   Gideon    16 年前

        6
  •  0
  •   jmoz    15 年前

    不管怎样,这是我的故事,以防有人搜索相关内容。

    <script type="text/javascript" src="http://www.retweet.com/static/retweets.js"></script>
    

    仔细检查的外部脚本如下:

    if(!url)
    {
     var url=window.location.href;
    }
    if(!size)
    var size="big";
    var height="75";
    var width="54"
    if(size=="small")
    {
      height="22";
      width="120";
    }
    if(!username)  
      var username="none";
    url=url.replace("?", "*");
    var src="http://www.retweet.com/widget/button/"+size+"/"+username+"/"+url;
    document.write('<iframe src="'+src+'" height="'+height+'" width="'+width+'" frameborder="0" scrolling="no"></iframe>');
    

    很明显,这在文件上炸开了。