+
 新版

ajax获取返回的数据后,通过jQuery解析的奇怪问题

hy86 发布于 2014/03/31 13:42
阅读 1K+
收藏 2

我在做一个chrome插件的过程中,通过jQuery解析一个返回的json格式的数据,该数据结构大致如下:

{"status":1,"content":"<div id=\"oper\">\r\n <input type=\"hidden\" name=\"cookieKey\" id=\"cookieKey\" value=\"45af3b6459c8abd878ef75e9f438b9ef\" \/>\r\n <img class=\"icursor\" onclick=\"this.src=this.src+'?t='+Math.random()\" src=\"\/member\/common\/iverify\" width=\"100\" height=\"24\" \/><\/div>"}
目的是想通过jQuery解析该数据中的content值,取出对应的隐藏域字段cookieKey值,但出人意料的是, 其中的img元素(验证码图片)竟然会被浏览器执行加载,导致该验证码图片被更新 。为了便于大家查看,我把其中的content字符串(html字符串)解析出来:
<div id="oper">
<input type="hidden" name="cookieKey" id="cookieKey" value="45af3b6459c8abd878ef75e9f438b9ef" />
<img class="icursor" onclick="this.src=this.src+'?t='+Math.random()" src="/member/common/iverify" width="100" height="24" />
</div>

我执行的代码:

var key;
	$.ajax({url:keyUrl,dataType:"json",async:false,
		success:function(data){
			if(data && data.status == 1){
				console.info("data.content:"+data.content);//就是上面描述的content字符串
				key = $("#cookieKey",data.content).val();//就是这个地方有问题
				console.info("1.get key succeed:"+key);
			}
		}
	});
当执行到key = $("#cookieKey",data.content).val();这句时,或者只执行$(data.content),浏览器会加载该内容中的img元素,不知为何?请问有没有办法禁止它加载?


加载中
0
leo108
leo108

你这样就直接生成dom了,浏览器就会加载。

你这个数据里有价值的信息就一个cookieKey,为啥不直接传cookieKey,然后在html这边拼接出来?

0
hy86
hy86

引用来自“leo108”的评论

你这样就直接生成dom了,浏览器就会加载。

你这个数据里有价值的信息就一个cookieKey,为啥不直接传cookieKey,然后在html这边拼接出来?

我写的是第三方网站的插件,传过来的数据结构不是我能控制的

0
倪闯
倪闯

先对content的值进行一下处理,将“<”和“>”分别用“&lt”和“&gt”替换,再取image的val。

0
M
MixedFlow


success: function (data) {
      if (data && data.status == 1) {
             console.info("data.content:" + data.content); 
var str = data.content;
             var match1 = str.match(/id="cookieKey" value="(\w+)"/);
             key = match1[1]
                           
                            
             //key = $("#cookieKey", data.content).val();//就是这个地方有问题
             console.info("1.get key succeed:" + key);
       }
}

$("#cookieKey", data.content) 估计是jquery要把data.content转义生成一个DOM。那就用正则式匹配出来。



0
hy86
hy86

引用来自“倪闯”的评论

先对content的值进行一下处理,将“<”和“>”分别用“&lt”和“&gt”替换,再取image的val。

s=data.content;
s=s.replace(/</g,"&lt;");
s=s.replace(/>/g,"&gt;");
console.info(s);
$(s);//这里报错哦

我这样处理后,Error: Syntax error, unrecognized expression: &lt;div id="oper"&gt;  ....



0
hy86
hy86

引用来自“MixedFlow”的评论


success: function (data) {
      if (data && data.status == 1) {
             console.info("data.content:" + data.content); 
var str = data.content;
             var match1 = str.match(/id="cookieKey" value="(\w+)"/);
             key = match1[1]
                           
                            
             //key = $("#cookieKey", data.content).val();//就是这个地方有问题
             console.info("1.get key succeed:" + key);
       }
}

$("#cookieKey", data.content) 估计是jquery要把data.content转义生成一个DOM。那就用正则式匹配出来。



嗯,现在我临时解决方案就是把它当字符串来处理了。谢谢你的正则思路。

如果不当成字符串,而坚持当成dom来处理的话,jquery的这种处理方式也太粗暴了吧,不知算不算它的BUG

pantrick
pantrick
怎么算bug?你思路的bug,jquery就是js,你如果一定按照dom处理,它当然按照dom对待,要遵循游戏规则
0
leo108
leo108

引用来自“leo108”的评论

你这样就直接生成dom了,浏览器就会加载。

你这个数据里有价值的信息就一个cookieKey,为啥不直接传cookieKey,然后在html这边拼接出来?

引用来自“阿J小虫”的评论

我写的是第三方网站的插件,传过来的数据结构不是我能控制的

那就用正则去拿那个cookieKey,也不是很难的事

0
M
MixedFlow

引用来自“MixedFlow”的评论


success: function (data) {
      if (data && data.status == 1) {
             console.info("data.content:" + data.content); 
var str = data.content;
             var match1 = str.match(/id="cookieKey" value="(\w+)"/);
             key = match1[1]
                           
                            
             //key = $("#cookieKey", data.content).val();//就是这个地方有问题
             console.info("1.get key succeed:" + key);
       }
}

$("#cookieKey", data.content) 估计是jquery要把data.content转义生成一个DOM。那就用正则式匹配出来。



嗯,现在我临时解决方案就是把它当字符串来处理了。谢谢你的正则思路。

引用来自“阿J小虫”的评论

如果不当成字符串,而坚持当成dom来处理的话,jquery的这种处理方式也太粗暴了吧,不知算不算它的BUG

1. 模拟写了代码运行,稍微追了下JQuery源码,运行到了这行:


return this.constructor( context ).find( selector );


2. 正好有两行注释:


// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)


3.

对应的应该就是该JQuery function情形.代码等效于 $(context).find(expr)

4. 

官方API里面有个用法:jQuery( html [, ownerDocument ] )

官方说明Description: Creates DOM elements on the fly from the provided string of raw HTML.

也就是3里面的$(context)创建了DOM元素,context就是你的HTML String。


0
hy86
hy86

引用来自“MixedFlow”的评论


success: function (data) {
      if (data && data.status == 1) {
             console.info("data.content:" + data.content); 
var str = data.content;
             var match1 = str.match(/id="cookieKey" value="(\w+)"/);
             key = match1[1]
                           
                            
             //key = $("#cookieKey", data.content).val();//就是这个地方有问题
             console.info("1.get key succeed:" + key);
       }
}

$("#cookieKey", data.content) 估计是jquery要把data.content转义生成一个DOM。那就用正则式匹配出来。



嗯,现在我临时解决方案就是把它当字符串来处理了。谢谢你的正则思路。

引用来自“阿J小虫”的评论

如果不当成字符串,而坚持当成dom来处理的话,jquery的这种处理方式也太粗暴了吧,不知算不算它的BUG

1. 模拟写了代码运行,稍微追了下JQuery源码,运行到了这行:


return this.constructor( context ).find( selector );


2. 正好有两行注释:


// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)


3.

对应的应该就是该JQuery function情形.代码等效于 $(context).find(expr)

4. 

官方API里面有个用法:jQuery( html [, ownerDocument ] )

官方说明Description: Creates DOM elements on the fly from the provided string of raw HTML.

也就是3里面的$(context)创建了DOM元素,context就是你的HTML String。

引用来自“MixedFlow”的评论


好的,谢谢

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部