chrome插件开发.在content_script异步加载页面后, 如何进行JS通信与调用的问题

使用场景

在开发Chrome插件时, 有一种需求:

要求在WEB页面显示一个浮动窗口(A), 在此窗口中允许用Ajax方式调用另一个服务器上的一个页面(B)

B页面上有独立的功能用JS写function来实现

已知条件

窗口A可以利用content-script.js动态生成

窗口A中放置一个按钮, 调用Onclick方法召唤出B页面, 样例代码如下

<button onclick="invokeContentScript(‘openalertWin()‘)">test</button>

具体实现的function

function openalertWin(){
    var domobj = $(‘#div_alert‘);
    if(""==domobj.text()){
        domobj.load(_domain+‘/nj/fun/setalert‘).show();
    }else{
        domobj.toggle(‘fast‘);
    }
}

页面B中

有一个按钮和一个JS function

<button onclick="funcB()">testB</button>

具体实现代码也在页面B中

function funcB(){
  alert("I am B");
}

碰到的问题

实际运行的时候, 发现B页面的按钮按下后会报错:

Uncaught ReferenceError: funcB is not defined 

funcB明明存在于页面B中, 但却无法被调用

解决办法

> 方法一, 修改窗口A加载B的方法

取消函数调用法, 改为直接Ajax加载, 代码如下:

<button onclick="$(‘#div_alert‘).load(‘https://xxxxx/nj/fun/setalert‘)">test</button>

发现页面B中的功能马上能正常运行

> 方法二, 迂回法则

这个方法比较复杂, 思路如下

1. 在窗口A中放置一个隐藏按钮A1

<button id="btn_A1" style="display:none" onclick="invokeContentScript(‘funcB()‘)">A1</button>

2.把页面B的function放到content-script.js中

3.页面B中的按钮修改为

<button onclick="$(‘#btn_A1‘).click()">testB</button>

完成

方法二缺点是页面B的功能代码被放到插件中, 不利于维护, 不建议使用

原文地址:https://www.cnblogs.com/visionsl/p/9930081.html

时间: 2024-11-05 18:55:17

chrome插件开发.在content_script异步加载页面后, 如何进行JS通信与调用的问题的相关文章

artdialog 异步加载页面 生成验证码

artdialog  异步加载一个页面 需求:例如现在好多网站的登录或注册 都是点击弹出一个层出来 然后在上面登录.注册 这个登录可能在网站的每个页面都会有,但是我们又不能在每个页面都这一段html加载出来不显示,到需要用的时候,在给shou出来,这样做于情于理都说!不!!过!!!去!!!!!! 恰好以前接触过artdialog  不多说上代码,(注意思维,代码是死的方法是活,解决需求不一定非要这个方法 ) 1.页面html代码 1 <head runat="server">

两种方法实现在HTML页面加载完毕后运行某个js

两种方法实现在HTML页面加载完毕后运行某个js 这篇文章主要介绍了通过两种方法实现在HTML页面加载完毕后运行某个js,需要的朋友可以参考下 js方法: 复制代码 代码如下: <script type="text/javascript"> window.onload=function(){ var userName="xiaoming"; alert(userName); } </script> 以下为jQuery方法,需要引用jQuery

PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题

PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题,PageSlider中加入CSS3动画的话,默认只有首屏是从无到有执行动画,其他屏都是显示下页面再执行动画 这就造成其他屏的动画展示效果不好,解决方法,让所有屏的背景可见,但是只要当前屏的元素可见; 上代码: .page { width: 100%; height: 100%; -webkit-backface-visibility: hidden; -webkit-perspective: 1000; div, ul,

使用Ajax异步加载页面时,怎样调试该页面的Js

前言-本人不是干前端的,所以有的名词不专业 在前端中,有时候会遇到这样的框架,http://172.17.11.151:8060/frontend/backend.html#1.html (通过解析URL,把1.html异步加载到指定位置),不知道这样的框架叫什么名字. 那我们就会遇到一个问题,调试1.html的时候怎么办,通过浏览器掉出控制台找不到1.Html页面,无法加断点啊. 解决办法 在1.html 你所要调试位置加上一句代码  debugger;  就可以了,就是这么爽 可以调试了,可

jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

转自:http://www.cnblogs.com/sunjie9606/archive/2012/09/13/2683636.html 现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout" 等 处理方法: 在html片段加载完毕后使用 Js代码 $.parser.parse(context) 即可重新渲染. 实现原理: 首先附上jquery.parser.js的源码 Js代码 (function($){ $.parser

jquery load(URL,FUNCTION(){}) 异步加载页面

$("#btnSearch").click(function () { var queryUrl = '/Report/LoadInsClassifFileNew'; if ($("#txtSearch").val() != "") { queryUrl = queryUrl + "?fileName=" + $("#drpSearch option:selected").val() + "&am

样式文件太大太多,首次加载页面后,样式错乱的解决办法

1.js控制页面只刷新一次 window.onload(){ if(location.href.indexOf('#reloaded')==-1){ location.href=location.href+"#reloaded"; location.reload(); } } 2.第二种只刷新一次$(function(){ if($.cookie("refresh")!="no"){ setTimeout(function(){ window.l

页面加载完成后执行的JS

$(document).ready(function() { alert("[email protected]2121212");}); window.onload = function(){ alert("[email protected]");} function init(){alert("[email protected]");}; </script> </head> <body >

在HTML页面加载完毕后运行某个js

js <script type="text/javascript"> window.onload=function(){ //执行} </script> jQ <script type="text/javascript"> $(document).ready(function(){ //执行}); $(function(){ //执行}); </script> 原文地址:https://www.cnblogs.com/