我在做一个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元素,不知为何?请问有没有办法禁止它加载?
jQuery
你这样就直接生成dom了,浏览器就会加载。
你这个数据里有价值的信息就一个cookieKey,为啥不直接传cookieKey,然后在html这边拼接出来?
引用来自“leo108”的评论
你这样就直接生成dom了,浏览器就会加载。
你这个数据里有价值的信息就一个cookieKey,为啥不直接传cookieKey,然后在html这边拼接出来?
我写的是第三方网站的插件,传过来的数据结构不是我能控制的
先对content的值进行一下处理,将“<”和“>”分别用“<”和“>”替换,再取image的val。
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。那就用正则式匹配出来。
引用来自“倪闯”的评论
先对content的值进行一下处理,将“<”和“>”分别用“<”和“>”替换,再取image的val。
我这样处理后,Error: Syntax error, unrecognized expression: <div id="oper"> ....
引用来自“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
引用来自“leo108”的评论
你这样就直接生成dom了,浏览器就会加载。
你这个数据里有价值的信息就一个cookieKey,为啥不直接传cookieKey,然后在html这边拼接出来?
引用来自“阿J小虫”的评论
我写的是第三方网站的插件,传过来的数据结构不是我能控制的
那就用正则去拿那个cookieKey,也不是很难的事
引用来自“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源码,运行到了这行:
2. 正好有两行注释:
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”的评论
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源码,运行到了这行:
2. 正好有两行注释:
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”的评论
好的,谢谢