我不能确切地知道这是因为我的清单设置,或者如果有什么用.对事件和产生内容的网页回事/动态修改内容,但我碰到的一个绊脚石.
这是基本的想法:我希望能够点击任何链接,其中包含与模式匹配的URL,无论用户在哪里/他们正在查看哪个页面(并执行其他操作而不是导航到链接) .我遇到的问题是我的监听器无法在内容加载(jQuery $(document).ready)之后修改其内容的任何页面上工作(例如gMail).我正在整个地方注入我的javascript,它仍然不能正常工作.
这是监听器代码(在main.js中):
$('a[href^="http://www.google.com/calendar/event?action=TEMPLATE"]').on('click', function(event)
{
event.preventDefault();
SKDMmain(this);
});
Run Code Online (Sandbox Code Playgroud)
这是我的background.html中的代码:(在页面加载时以及更改选项卡/窗口时注入我的脚本,因此它应该在那里.注意:上面包含了jQuery,以及所有本地.js我需要的文件)
<script type="text/javascript">
$(document).ready( function(){
chrome.tabs.executeScript(null,{file:"main.js"});
});
chrome.tabs.onActiveChanged.addListener( function(tabID,somethingElse){
chrome.tabs.executeScript(tabID,{file:"main.js"});
});
chrome.windows.onFocusChanged.addListener( function(windowID){
if ( windowId != chrome.windows.WINDOW_ID_NONE ) {
chrome.tabs.executeScript(null,{file:"main.js"});
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
但是在像gMail 这样的页面中,监听器不会捕获事件.我最初把它作为一个内容脚本,但我最近把它转移到使用背景和编程注入,但似乎都没有正常工作.
这是我的清单,供参考:
{
"name": "SkedjoolMi",
"version": "0.5",
"description": "Automated Google Calendar event scheduling",
"background_page": "background.html",
"permissions": [
"tabs","http://*/","https://*/"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["jquery-1-7-1.js"],
"run_at": "document_end",
"all_frames": true
}
]
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*kis 66
$('a[href^="http:.......').on('click', function() { ...
Run Code Online (Sandbox Code Playgroud)
仅适用于呈现页面时已存在的锚点 - 不动态添加锚点.以上完全相同
$('a[href^="http:.......').bind('click', function() { ...
Run Code Online (Sandbox Code Playgroud)
以下是您使用on动态添加内容的方式:
$(document).on("click", 'a[href^="http://www.google.com/calendar/event?action=TEMPLATE"]', function() ...
Run Code Online (Sandbox Code Playgroud)
这会创建一个委托事件.将检查文档后代(即所有内容)中发生的所有点击,以查看点击源是否与您的选择器匹配.如果确实如此,您的活动将会激活.这就是它适用于动态添加内容的原因.
理想情况下,如果您可以保证所有这些锚点都在某个容器内部,比如一个带有id的div foo,那么follow会更有效:
$('#foo').on("click", 'a[href^="http://www.google.com/calendar/event?action=TEMPLATE"]', function() ...
Run Code Online (Sandbox Code Playgroud)