【问题标题】:jquery - issue getting script tags after two .filter()'sjquery - 在两个 .filter() 之后获取脚本标签的问题
【发布时间】:2015-07-08 21:44:57
【问题描述】:

我有一个想要解析标签的 ajax 响应,我只想在特定的 div id 中查找脚本标签。下面将捕获并运行页面中的每个 javascript:

success: function(data) {
    var dom = $(data);
    dom.filter('script').each(function(){
        var obj = $(this);                                          
        $('#my_div').append(obj);
    });
},

当我尝试先按 div id 过滤,然后按脚本过滤时,它不会附加任何内容。我显然可以访问响应 html,我可以看到 'js_outer_div' div 中应该有多个标签:

var dom = $(data);
dom.filter('js_outer_div').filter('script').each(function(){
    var obj = $(this);                                          
    $('#my_div').append(obj);
});

不幸的是,我无法控制响应 html。有没有办法先按 div 过滤,然后按我想要的脚本过滤?

编辑:示例 html 响应:

... 
<div id="i9-content-div">
<script xmlns:efactions="http://www.enginframe.com/2009/efactions" xmlns:grid="http://www.enginframe.com/2000/GRID" type="text/javascript">
...
</script>
<script type="text/javascript">
...
</script>
</div>

【问题讨论】:

  • 我不确定您是否在过滤器中正确选择?不是dom.filter('#js_outer_div')dom.filter('.js_outer_div') 有类吗?不过我很确定。

标签: javascript jquery ajax filter tags


【解决方案1】:

我可以看到'js_outer_div' div中应该有多个标签

如果js_outer_div 是一个类名,那么filter 方法应该是:

dom.filter('.js_outer_div')...

但是不,它不能解决问题。 filter 方法过滤集合中的顶级元素。 jQuery 集合不是平面的,它保留了元素层次结构。您应该使用find 方法。由于find 方法选择集合中包装元素的后代,您可以生成div 元素并使用html 方法使用data 变量设置其内容。现在find 方法可以工作,无论目标div.js_outer_div 是否是顶级元素。

$('<div/>').html(data).find('.js_outer_div script').each(...)

【讨论】:

  • 谢谢。看起来这很有效,但我不知道它是否过滤了正确的脚本。有什么我可以打印来检查我正在运行的脚本吗?也许是脚本文本的控制台日志?
  • @EvanDefend 欢迎您。 console.log($('&lt;div/&gt;').html(data).find('.js_outer_div script')) 记录选定的scripts。
  • 今天早上看了,结果很迷茫。似乎$('&lt;div/&gt;').html(data).find('#js_outer_div script'); 行导致data 中的每个脚本标记都执行(虽然感到困惑,因为在控制台中每个脚本都有一个'GET',以前从未见过。).each 函数本身似乎什么都不做,我在那里放了一个 alert() 但它永远不会触发。知道这意味着什么吗?
【解决方案2】:

您可以使用find 代替filter

var dom = $(data);
dom.find('js_outer_div script').each(function(){
    var obj = $(this);                                          
    $('#my_div').append(obj);
});

现在这实际上不会选择任何东西,除非你在某处有一个&lt;js_outer_div&gt; 标签。想必你需要在 find 语句中将js_outer_div 改为.js_outer_div#js_outer_div

【讨论】:

  • js noob 在这里,很抱歉忘记提及我想按 div id 查找/过滤。我试过:dom.find('#js_outer_div script').each(function(){ 有和没有#,但它似乎仍然不起作用。我错过了什么吗?
  • 你能发布一个返回数据的例子吗?
  • 我编辑了我的帖子以包含一些示例 html 响应行。在记录 dom.find('#js_outer_div script') 后,它看起来返回一个带有“prevObject”的对象,其中包含 data 中的所有脚本(不仅仅是 'id=js_outer_div' div 中的脚本)以及 js_outer_div div。很抱歉我在调试方面做得不好,就像我说我是 js 新手。
  • 搞砸之后,看起来dom.find('#js_outer_div') 正在返回正确的 div,但去掉了脚本标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多