Jquery .load删除<script> ... </script>内容

时间:2012-05-21 14:10:22

标签: javascript jquery event-handling load

当我调用.load函数时,它会给我带来HTML代码,但它会清除<script>内容,来自cards.tpl.php的代码:

<script type="text/javascript">
     //anything
</script>
<div style="float:right" class="blah">
<!-- anything -->
</div>
来自index.php的

代码:

<div id="cards">
     <?php include 'tpl/cards.tpl.php'; ?>
</div>
...
<script type="text/javascript">
    $('#drawCard').click(function(){
            $('#cards').load("tpl/cards.tpl.php",function(){
            });
    });
</script>

当PHP包含内容时,它包含<script>,但是当我点击#drawCard时,JavaScript只会给我带来div。我刚看到.load实际上删除了脚本标签但是它们被执行了,执行后是否保留绑定事件?

修改

好的,最后我得到了解决这一问题背后的问题。使用load()来调用包含事件绑定代码的<script></script>将给您带来大量的麻烦。不要做它!如果您的真正问题是在使用$ .load()函数后处理绑定问题,那么我建议您执行以下操作:

使用livequery('click')替换所有click(),on('click')事件和一个名为livequery的插件,它100%工作。

没有考虑到一个新问题,但为什么JQuery会告诉你用on()替换live()什么时候它不会按预期工作?

编辑JAAulde

<div id="cards">
    <!-- this content is replaced -->
    <div value="t1" class="impar tecnologia unselected investigated notUsed">stuff</div>
    </div>
    <!-- end of content replaced-->
</div>

并使用此jQuery代码:

$("#cards").on('click','.unselected',(function(e){}));

这在加载之前有效,在

之后不起作用

2 个答案:

答案 0 :(得分:0)

jQuery从插入到DOM中的内容中删除所有脚本,并将它们放在HEAD中执行(然后,由于某种原因,之后将它们从HEAD中删除)。请放心,您发送的所有脚本都已插入并执行。

要回答您的编辑,.live()巧妙地使用了事件冒泡,它将对集合上指定事件的处理委托给document对象。

jQuery在引入.live() (docs)时已弃用.delegate(),因为后者允许您指定要委派的容器,而不是始终使用document。这是首选,因为它允许您限制此类委托事件的影响(较少的泡沫事件处理,链条到处理程序的较短行程,较少的选择器匹配/过滤等)。

在事件API的统一中,

.delegate()本身已被.on() (docs)取代。如果将选择器作为第二个参数传递给.on(),则告诉jQuery将参数1中指定的事件委托给与给定选择器匹配的元素。

因此,对.live()的所有调用都应替换为.on()的适当范围调用。

答案 1 :(得分:-1)

你缺少来自card.tpl的$(文件).ready(...)。

我回顾你的历史,(在我请你把它清理之后:-p)回到你发布的原始代码,我发现了这个:

<script type="text/javascript">
   $('#toggleMax').click(function(){
      // code
   });
   // more code
</script>

然后我编写了类似的东西并且它有效。我唯一改变的是将你的代码包装在document.ready中:

<script type="text/javascript">
   $(function() {  // Note the document.ready call here.
       $('#toggleMax').click(function(){
          // code
       });
       // more code
   });
</script>