【问题标题】:Can't make onclick work on an injected button through content script in chrome extension无法通过 chrome 扩展中的内容脚本使 onclick 在注入的按钮上工作
【发布时间】:2016-04-27 09:36:57
【问题描述】:

我正在开发一个在网页上注入按钮的 chrome 扩展程序。我能够成功注入按钮,但是我无法在其上应用 onclick 函数。我在content.js写了按钮注入代码,如下

jQuery('body').append('<button onclick="myFxn();" class="vwsItBtn" style="height: 25px; width: 80px; position: absolute; opacity: 1; font-size: 12px; z-index: 867530999; display: block; padding-right: 4px !important; margin: 0px; border: 2px solid rgb(254, 208, 70); background-color: whitesmoke; border-radius: 4px; font-weight: bolder; text-shadow: #FED046 0px 0px 1px; color: #36373B; text-align-last: end;"><img id="myImgVw" style="width: 15px; display: inline-block; padding: 0px; left: 2px; position: absolute; vertical-align: middle !important; top: 3px;" src="'+chrome.extension.getURL("imgvwextsitbtn.png")+'"/> Schedule</button>');

jQuery(function(){
    function myFxn(){
        alert('This is working!');
    }
})

现在我收到一个未定义 myFxn 的错误。现在这个功能很简单,但是我该如何让它工作呢?

这是我第一次开发 chrome 扩展,我很确定还有其他方法可以做到这一点。请帮忙!!

【问题讨论】:

    标签: jquery google-chrome google-chrome-extension javascript-injection


    【解决方案1】:

    问题在于 myFxn() 函数是在 jQuery document.ready 处理程序的范围内声明的,而它需要是全局的,on* 属性才能访问它。试试这个:

    jQuery('body').append('<button onclick="myFxn();" class="vwsItBtn" style="height: 25px; width: 80px; position: absolute; opacity: 1; font-size: 12px; z-index: 867530999; display: block; padding-right: 4px !important; margin: 0px; border: 2px solid rgb(254, 208, 70); background-color: whitesmoke; border-radius: 4px; font-weight: bolder; text-shadow: #FED046 0px 0px 1px; color: #36373B; text-align-last: end;"><img id="myImgVw" style="width: 15px; display: inline-block; padding: 0px; left: 2px; position: absolute; vertical-align: middle !important; top: 3px;" src="'+chrome.extension.getURL("imgvwextsitbtn.png")+'"/> Schedule</button>');
    
    function myFxn(){
        alert('This is working!');
    }
    

    更好的是,将您的样式放入单独的样式表中,以使您的 HTML 更简单,更好地与样式分开,并且不要使用过时的 on* 事件属性,而是使用不显眼的 Javascript 来附加您的事件处理程序。由于您已经在使用 jQuery,这里有一个如何做到这一点的示例:

    .vwsItBtn {
        height: 25px; 
        width: 80px; 
        position: absolute; 
        opacity: 1; 
        font-size: 12px; 
        z-index: 867530999; 
        display: block; 
        padding-right: 4px !important; 
        margin: 0px; 
        border: 2px solid rgb(254, 208, 70); 
        background-color: whitesmoke; 
        border-radius: 4px; 
        font-weight: bolder; 
        text-shadow: #FED046 0px 0px 1px; 
        color: #36373B; 
        text-align-last: end;
    }
    #myImgVw {
        width: 15px; 
        display: inline-block; 
        padding: 0px; left: 2px; 
        position: absolute; 
        vertical-align: middle !important; 
        top: 3px;
    }
    
    jQuery(function($) {
        $('body').append('<button class="vwsItBtn"><img id="myImgVw" src="' + chrome.extension.getURL("imgvwextsitbtn.png") + '"/>Schedule</button>');
    
        $('.vwsItBtn').click(function() {
            alert('This is working!');
        });
    });
    

    【讨论】:

    • 我之前已经尝试过了,但这是错误:(index):1 Uncaught ReferenceError: myFxn is not defined
    • 这行得通,犯了一个愚蠢的错误。非常感谢。你的回答告诉了我正确的方法!
    • 没问题,很乐意提供帮助。
    • 了解为什么第一个解决方案仍然不起作用很重要。内容脚本live in an isolated context;创建具有 onclick 属性的元素将在页面的上下文中创建一个处理程序,而该处理程序是在内容脚本上下文中创建的。第二种解决方案通过将所有内容保留在内容脚本上下文中来避免此问题。
    • @Xan 感谢您的信息。如果您查看我对此答案的第二条评论,我正在考虑类似的事情,后来在理解此答案后意识到您提到的内容
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2023-02-06
    • 2022-11-07
    • 1970-01-01
    • 2012-04-12
    • 2023-03-19
    相关资源
    最近更新 更多