2016-10-29 98 views
1

我已經創建了一個基於https://robots.thoughtbot.com/how-to-make-a-chrome-extension一個Chrome擴展不工作(看年底完成的文件)jQuery的關()在Chrome擴展

我做了兩個改變。我使用JQuery 3.1.1最小化,而不是上面頁面中給出的較舊的JQuery 3.1.1;我改變了content.js:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     if(request.message === "clicked_browser_action") { 
      $(document).off("touchmove mousewheel mousemove scroll"); 
     } 
    } 
); 

當我點擊打開帶有一個適當的測試頁擴展的按鈕的$(document).off()命令無法正常工作。它沒有給出錯誤,它只是沒有做任何事情。

我查過了。如果我在想要影響的頁面上輸入$(document).off("touchmove mousewheel mousemove scroll");到控制檯,它工作正常。如果在擴展中運行,它不是。

我試着檢查document在擴展中是否正確,document.domain在擴展中的斷點(和頁面中的控制檯)中檢查時給出了正確的結果。我試着檢查jQuery._data(jQuery(document)[0]).events["touchmove"](和「mousewheel」,「mousemove」,「scroll」),它在控制檯中工作,但如果我斷點擴展名,我會得到一個錯誤(Cannot read property 'touchmove' of undefined)。當我進一步檢查,jQuery._data(jQuery(document)[0])給出如下:

在控制檯:

Object 
    events: Object 
    handle: function (e) 
    __proto__: Object 

在斷點:

Object 
    __proto__: Object 

我已經嘗試了一些其他的東西(例如,jQuery是訪問和工作,等等)。

任何人都可以幫忙嗎?

+0

您是否試圖關閉您在內容腳本中添加的事件偵聽器,或者已經存在於頁面腳本中的事件偵聽器(即屬於網頁的一部分)?這聽起來像你試圖關閉的事件在頁面腳本中。 – Makyen

+0

我試圖關閉頁面腳本中已經存在的事件監聽器(即,是網頁的一部分)。 –

回答

2

您的內容腳本與頁面腳本(網頁中已存在的腳本)的腳本位於不同的上下文/範圍內。爲了在頁面腳本上下文中執行代碼,您已經創建並向該頁面的DOM插入了一個<script>元素。

你可以更改您的代碼:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     if(request.message === "clicked_browser_action") { 
      let newScript = document.createElement('script'); 
      newScript.innerHTML='$(document).off("touchmove mousewheel mousemove scroll");'; 
      document.head.appendChild(newScript); 
     } 
    } 
); 

添加的腳本獲取運行,因爲它現在是DOM中的<script>元素。瀏覽器識別出<script>元素已被添加,並在插入該元素的腳本不再處理時立即對其進行評估(執行包含的代碼)。它對添加到DOM的任何其他元素基本上都是一樣的。由於它是頁面的一部分,因此<script>中的代碼將在頁面腳本上下文/作用域中運行。

+0

令人驚歎!這肯定似乎有效,我會很快將它標記爲答案(儘管您可能想要編輯$(document)行中的引號)。雖然(它確實,但是爲什麼?)......你能澄清一下嗎? –

+1

固定。我一直在做太多的降價編輯。它會被運行,因爲它是頁面中的'