jQuery .on不使用动态DOM/HTML

Bra*_*ego 23 jquery

我不能确切地知道这是因为我的清单设置,或者如果有什么用.对事件和产生内容的网页回事/动态修改内容,但我碰到的一个绊脚石.

这是基本的想法:我希望能够点击任何链接,其中包含与模式匹配的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)

  • 我知道这有点老了,但只是因为有人遇到我遇到的问题,$(文件).on(...对我不起作用.我不得不将文件改为$(窗口).on( ......而且工作正常. (3认同)