Chrome插件中关于js函数的调用.

xiaohuh421 2014-03-28 04:00:58
我是想编写一个chrome插件, 自动调用某个页面中的js函数. (注: 页面是随便一个网站的页面, 比如百度).
或者说点击一个 input类型按钮, 可以实现吗?
...全文
4456 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuball 2016-05-12
  • 打赏
  • 举报
回复
引用 24 楼 jianpc 的回复:
[quote=引用 22 楼 u012900129 的回复:] 通过DOM在文档的<head>标签里面插入script标签,然后再嵌入代码的想法是可行的!毕竟我自己测试的话,成功地调用了原页面的函数~~表示又学到一招
你好,我通过jquery向head里append了一个js的function,看页面源代码应该是append上去了,但是执行新增的那个方法的时候,还是不行,提示找不到,这是为啥呢??谢谢啦。。[/quote] 同样问题!
jianpc 2014-09-26
  • 打赏
  • 举报
回复
引用 22 楼 u012900129 的回复:
通过DOM在文档的<head>标签里面插入script标签,然后再嵌入代码的想法是可行的!毕竟我自己测试的话,成功地调用了原页面的函数~~表示又学到一招
你好,我通过jquery向head里append了一个js的function,看页面源代码应该是append上去了,但是执行新增的那个方法的时候,还是不行,提示找不到,这是为啥呢??谢谢啦。。
letianou 2014-08-04
  • 打赏
  • 举报
回复
引用 22 楼 u012900129 的回复:
通过DOM在文档的<head>标签里面插入script标签,然后再嵌入代码的想法是可行的!毕竟我自己测试的话,成功地调用了原页面的函数~~表示又学到一招
收到!谢谢分享!
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 13 楼 u012900129 的回复:
嘿嘿,用点小技巧吧!executeScript的函数,第一个参数传的是tab.id,如果是null的话,应该是当前页面的样子。第二个参数是要注入的js文件(用{file:“sample.js”}对象表示)。 先得在manifest里面获取注入这个页面的权限,(简单起见,我直接在permission里面添加http://*/),然后在扩展程序管理界面 检查视图: _generated_background_page.html打开后台的console,通过执行两行代码:

chrome.tabs.query({active:true},function(tabs){alert(tabs[0].id);});
chrome.tabs.executeScript(11,{file:"sample.js"});
第一行会返回你当前显示页面的tab.id,我看到的是11,所以第二行的时候,把第一个参数改成11,在sample里面设个alert,然后就发现可以成功地alert了,说明sample.js被成功地导入了! 另外由于http://*/并没有获取到chrome://devtool的权限,所以你在做这个测试的时候,务必记得把当前标签页换成别的,比如百度!我之前就是因为直接在扩展程序管理界面做测试,然后报错说无法获取权限。
关键是我调用executeScript的时候, chrome在consloe中直接输出错误提示说 executeScript 未定义, 这是什么原因呢?
Leenham 2014-03-31
  • 打赏
  • 举报
回复
我最近正在学习这个,我正好看过关于这部分的开发手册。 表示,你的插件(1L硬是指正这是扩展程序也是有道理的!表示我和楼主一样,从来不分这个....)的脚本,和原页面的脚本是不可能交互的!他们从属于不同的环境,也就是不同的上下文,不共享任何js变量或者函数,所以你的插件脚本 不能调用原页面的脚本的变脸和函数------插件脚本属于一个叫isolated world的环境,和其它环境都是独立的。 之所以插件脚本可以定制网页外观,是因为它和原页面脚本共享DOM结构。他们只是都能够对DOM树进行操作罢了!比如原页面脚本可能定义背景色为红色,你再在自己的脚本里面设置成蓝色,最终显示成蓝色,只是对body对象进行了操作而已,但你并不可能说是调用原有的函数进行更改操作的! 打个比方,A可以用锄头在一块田地上种萝卜,B可以用铲子在这块田地上中白菜,最终这块地上种出来的是什么,由这二者的操作共同影响,但是,A是没有铲子的,B是不会用上锄头的,差不多是这个比喻吧~~~ ps:我也在学习编写chrome插件,希望可以多多交流呢~
Leenham 2014-03-31
  • 打赏
  • 举报
回复
引用 12 楼 xiaohuh421 的回复:
[quote=引用 11 楼 u012900129 的回复:] 刚才我试验了好久的executeScript接口,我目前测到的结果是: 通过executeScript注入的脚本和content_script脚本属于同一个上下文(共享js变量和函数),但是还是和原脚本的上下文不同!也就是说,这种方法应该还是不可能实现你要的效果。所不同的是,executeScript是动态加载的,而且需要在后台动态加载,而content_script是访问这个页面的时候就已经加载好的。 不过你说的,通过content_script调用动态的加载js文件,来实现调用原网页脚本的想法,我觉得很不错!可以试试,不过我目前还没试过啦~要吃饭了,回头去亲测一下
你调用executeScript能成功吗, 怎么用的, chrome版本是多少, 望指教, 我就卡在这里, 动不了.[/quote] 嘿嘿,用点小技巧吧!executeScript的函数,第一个参数传的是tab.id,如果是null的话,应该是当前页面的样子。第二个参数是要注入的js文件(用{file:“sample.js”}对象表示)。 先得在manifest里面获取注入这个页面的权限,(简单起见,我直接在permission里面添加http://*/),然后在扩展程序管理界面 检查视图: _generated_background_page.html打开后台的console,通过执行两行代码:

chrome.tabs.query({active:true},function(tabs){alert(tabs[0].id);});
chrome.tabs.executeScript(11,{file:"sample.js"});
第一行会返回你当前显示页面的tab.id,我看到的是11,所以第二行的时候,把第一个参数改成11,在sample里面设个alert,然后就发现可以成功地alert了,说明sample.js被成功地导入了! 另外由于http://*/并没有获取到chrome://devtool的权限,所以你在做这个测试的时候,务必记得把当前标签页换成别的,比如百度!我之前就是因为直接在扩展程序管理界面做测试,然后报错说无法获取权限。
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 11 楼 u012900129 的回复:
刚才我试验了好久的executeScript接口,我目前测到的结果是: 通过executeScript注入的脚本和content_script脚本属于同一个上下文(共享js变量和函数),但是还是和原脚本的上下文不同!也就是说,这种方法应该还是不可能实现你要的效果。所不同的是,executeScript是动态加载的,而且需要在后台动态加载,而content_script是访问这个页面的时候就已经加载好的。 不过你说的,通过content_script调用动态的加载js文件,来实现调用原网页脚本的想法,我觉得很不错!可以试试,不过我目前还没试过啦~要吃饭了,回头去亲测一下
你调用executeScript能成功吗, 怎么用的, chrome版本是多少, 望指教, 我就卡在这里, 动不了.
Leenham 2014-03-31
  • 打赏
  • 举报
回复
引用 10 楼 u012900129 的回复:
[quote=引用 7 楼 xiaohuh421 的回复:] 只是现在也有问题, 虽然chrome有这个接口, 但是写到插件里面, 运行时, 又提示说" executeScript"是未定义的
看手册的话,我觉得chrome.tabs.executeScript语句是不是应该写在后台脚本里面才行,你会不会写到content_script的脚本里面了,才不能通过?[/quote] 刚才我试验了好久的executeScript接口,我目前测到的结果是: 通过executeScript注入的脚本和content_script脚本属于同一个上下文(共享js变量和函数),但是还是和原脚本的上下文不同!也就是说,这种方法应该还是不可能实现你要的效果。所不同的是,executeScript是动态加载的,而且需要在后台动态加载,而content_script是访问这个页面的时候就已经加载好的。 不过你说的,通过content_script调用动态的加载js文件,来实现调用原网页脚本的想法,我觉得很不错!可以试试,不过我目前还没试过啦~要吃饭了,回头去亲测一下
Leenham 2014-03-31
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
只是现在也有问题, 虽然chrome有这个接口, 但是写到插件里面, 运行时, 又提示说" executeScript"是未定义的
看手册的话,我觉得chrome.tabs.executeScript语句是不是应该写在后台脚本里面才行,你会不会写到content_script的脚本里面了,才不能通过?
Leenham 2014-03-31
  • 打赏
  • 举报
回复
引用 8 楼 xiaohuh421 的回复:
http://hi.baidu.com/fl2011/item/6732e2f3da85bc11ce9f329b 可以通过content_script, 插入js代码到目标网页, 这样就可以使用executeScript调用本地函数了.
对哦,这个思路不错....被科普了~~
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
http://hi.baidu.com/fl2011/item/6732e2f3da85bc11ce9f329b 可以通过content_script, 插入js代码到目标网页, 这样就可以使用executeScript调用本地函数了.
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
只是现在也有问题, 虽然chrome有这个接口, 但是写到插件里面, 运行时, 又提示说" executeScript"是未定义的
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 5 楼 u012900129 的回复:
我最近正在学习这个,我正好看过关于这部分的开发手册。 表示,你的插件(1L硬是指正这是扩展程序也是有道理的!表示我和楼主一样,从来不分这个....)的脚本,和原页面的脚本是不可能交互的!他们从属于不同的环境,也就是不同的上下文,不共享任何js变量或者函数,所以你的插件脚本 不能调用原页面的脚本的变脸和函数------插件脚本属于一个叫isolated world的环境,和其它环境都是独立的。 之所以插件脚本可以定制网页外观,是因为它和原页面脚本共享DOM结构。他们只是都能够对DOM树进行操作罢了!比如原页面脚本可能定义背景色为红色,你再在自己的脚本里面设置成蓝色,最终显示成蓝色,只是对body对象进行了操作而已,但你并不可能说是调用原有的函数进行更改操作的! 打个比方,A可以用锄头在一块田地上种萝卜,B可以用铲子在这块田地上中白菜,最终这块地上种出来的是什么,由这二者的操作共同影响,但是,A是没有铲子的,B是不会用上锄头的,差不多是这个比喻吧~~~ ps:我也在学习编写chrome插件,希望可以多多交流呢~
虽然js确实不能直接调用页面中的变量和函数, 但是chrome.* API是提供了接口实现的. 比如chrome.tabs.executeScript接口 https://developer.chrome.com/extensions/tabs
Leenham 2014-03-31
  • 打赏
  • 举报
回复
通过DOM在文档的<head>标签里面插入script标签,然后再嵌入代码的想法是可行的!毕竟我自己测试的话,成功地调用了原页面的函数~~表示又学到一招
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 19 楼 u012900129 的回复:
就是导入JQuery库,JQuery的具体描述可以去google一下。我个人感觉是用JQuery可以简化很多js代码,写起来很方便...里面也定义了很多函数,读取、设置DOM元素的值balabala的操作都特别方便.....我也同样小白,正在学习的路上而已....
可以加个QQ, 方便联系交流. 希望向你学习下这方面的东西. 我的QQ是: 744780040
Leenham 2014-03-31
  • 打赏
  • 举报
回复
Q:894355570 留个联系方式,我也是在学习写插件,可以多多交流嘛~
Leenham 2014-03-31
  • 打赏
  • 举报
回复
引用 18 楼 xiaohuh421 的回复:
[quote=引用 17 楼 u012900129 的回复:] 不能,这就是为什么要有background.js,可以在manifest里面设置的。
"background": { "scripts": ["jquery.min.js", "background.js"] },
jquery.min.js 这个东西是什么呢, 我看好多都有这个脚本, 并且这个脚本的代码相当多. 没弄过JS, 这个应该是小白问题吧.[/quote] 就是导入JQuery库,JQuery的具体描述可以去google一下。我个人感觉是用JQuery可以简化很多js代码,写起来很方便...里面也定义了很多函数,读取、设置DOM元素的值balabala的操作都特别方便.....我也同样小白,正在学习的路上而已....
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 17 楼 u012900129 的回复:
不能,这就是为什么要有background.js,可以在manifest里面设置的。
"background": { "scripts": ["jquery.min.js", "background.js"] },
jquery.min.js 这个东西是什么呢, 我看好多都有这个脚本, 并且这个脚本的代码相当多. 没弄过JS, 这个应该是小白问题吧.
Leenham 2014-03-31
  • 打赏
  • 举报
回复
引用 16 楼 xiaohuh421 的回复:
[quote=引用 15 楼 u012900129 的回复:] 你用的是F12弹出来的console么?你应该用后台界面的console来调。 chrome右上角“三条杠按钮”==>工具===》扩展程序,然后点你的插件的_generated_background_page.html,就可以调用了。
那个executeScript必需在背景页面中才能调用吗, 在注入的js中不能调用吗?[/quote] 不能,这就是为什么要有background.js,可以在manifest里面设置的。
"background": { "scripts": ["jquery.min.js", "background.js"] },
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 15 楼 u012900129 的回复:
你用的是F12弹出来的console么?你应该用后台界面的console来调。 chrome右上角“三条杠按钮”==>工具===》扩展程序,然后点你的插件的_generated_background_page.html,就可以调用了。
那个executeScript必需在背景页面中才能调用吗, 在注入的js中不能调用吗?
加载更多回复(4)

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧