1

我有一个 Chrome 扩展程序,当单击浏览器操作时,它将在“body”上绑定mousedown 事件侦听器。而当再次点击浏览器动作时,会解除mousedown事件的绑定。

但是由于某种原因,即使日志显示代码已执行,unbind 也无法正常工作。我也尝试过 bind()/unbind() 方法,但无济于事。

任何帮助表示赞赏。谢谢!

清单.json

{
  "name": "My Extension",
  "description": "View Font Info",
  "manifest_version": 2,
  "version": "1",
  "permissions": ["tabs", "http://*/*", "https://*/*"],

  "browser_action": {
    "default_icon": "f.png"
  },

  "background": {
    "scripts": ["background.js"]
  }
}

背景.js

var toggle = false;
chrome.browserAction.onClicked.addListener(function(tab) {
  toggle = !toggle;
  if(toggle){
    chrome.browserAction.setIcon({path: "f.png", tabId:tab.id});

    chrome.tabs.executeScript(tab.id, {file:"jquery.js"}, function(){
      chrome.tabs.executeScript(tab.id, {file: "on.js"});
    });
  }
  else{
    chrome.browserAction.setIcon({path: "", tabId:tab.id});

    chrome.tabs.executeScript(tab.id, {file:"jquery.js"}, function(){
      chrome.tabs.executeScript(tab.id, {file: "off.js"});
    });
  }
});

on.js(绑定事件的脚本)

console.log("On");
$("body").on('mousedown.custom', function(e){
    e.preventDefault();
    // do something...
}); 

off.js(解除绑定事件的脚本)

console.log('off');
$("body").off('mousedown.custom');
4

1 回答 1

1

在鼠标点击上执行整个 jQuery 库对我来说似乎是多余的。它也可以解释您的问题(因为您在 ON 和 OFF 时都这样做)。尝试在单击事件处理程序之外加载和执行 jQuery,或者至少确保它不会运行两次。

此外,您与内容脚本进行通信的方式也不理想。您不需要不同的文件,只需使用message passing.

背景.js

var isjQueryLoaded = {};

function executeAfterjQuery(tabId, fn) {
    if (isjQueryLoaded[tabId]) {
      fn();
    } else {
      isjQueryLoaded[tabId] = true;
      chrome.tabs.executeScript(tabId, { file:"jquery.js" }, fn);
    }
}

var toggle = false;

chrome.browserAction.onClicked.addListener(function (tab) {
  toggle = !toggle;
  var path  = toggle ? "f.png" : "";
  var state = toggle ? "on" : "off";
  chrome.browserAction.setIcon({ path: path, tabId:tab.id });
  executeAfterjQuery(tab.id, function () {
    chrome.tabs.sendMessage(tab.id, { state: state });
  });
});

脚本.js

function on() {
  // ...
}

function off () {
  // ...
}

chrome.extension.onMessage.addListener(
  function (message, sender, sendResponse) {
    (message.state == "on") ? on() : off();
  });
于 2013-05-19T10:30:12.437 回答