2011-04-01 49 views
2

我正在構建將與現有Web應用程序交互的Chrome擴展。當用戶在應用程序的「內置」或「默認」操作之前按下現有應用程序上的「按鈕」時(該按鈕實際上是帶有附加的JS onClick事件的<div>),我需要執行一個操作。在Chrome擴展程序的網絡應用默認操作之前執行自定義onClick操作

據我所知,你不能強制onClick處理程序以任何順序被解僱,所以我不能只使用jQuery的.click()添加一個新的onClick事件(b/c有可能會在我之前發起默認操作)。

我一直在嘗試一些其他方法 - 所有這些都失敗了。我試圖做什麼,甚至可能給予Chrome的isolated worlds

這裏有沒有適合我的工作,我採取的方法:

  1. 解決方法:刪除所有點擊處理,除了礦,再火的其他處理程序後,我完成了我的行動
    問題:我一直無法獲得現有點擊處理程序的列表
  2. 解決方案:隱藏默認的<div>按鈕,並將我的按鈕放在那裏。點擊事件發射後,顯示現有的按鈕,然後觸發原來的事件(我猜我需要顯示它之前,我可以觸發事件嗎?)
    問題:按鈕wasn'迴應我創建的活動。
  3. 解決方案:在我定期在後臺執行操作之前,在用戶按下按鈕時幾乎可以保證完成。
    問題:它格式化屏幕上的文本,我寧願不格式化,直到用戶按下按鈕時,它可能會錯過基於輪詢定時器等一些格式...

注:這是完全可能這些方法之一應該已經工作,但是一個錯誤阻止了它的工作。如果是這種情況,請讓我知道!

回答

0

比方說這個元素所在的網站:

<div id="test" onclick="originalHandler()">test</div> 

<script> 
function originalHandler() { 
    alert("original"); 
} 
</script> 

然後在內容腳本我可以這樣做:

var el = document.getElementById("test"); 
var oldEvent = el.onclick; 
el.onclick = myHandler; 

function myHandler() { 
    alert("mine"); 

    //run original 
    oldEvent(); 
} 
+0

不打算...看到我的答案。 – mattsven 2011-04-02 02:46:15

+0

@NeXXeuS我測試過,它工作。 – serg 2011-04-02 05:15:22

+0

在Chrome擴展中? – mattsven 2011-04-02 05:28:28

1

我一直在這個經歷過了一段時間,我發現了一個有趣的事實:Chrome爲內容腳本提供了一個單獨的DOM來使用(當然這很聰明)。您爲任何元素定義的事件處理程序在缺省事件發生後運行。我會說有沒有辦法解決這個,但我發現一個不錯的,有點,有點「哈克」的方式來做到這一點:

var removeClickHandler = function(){ 
    // If you MUST use jQuery I would 
    // suggest doing it in a closed scope 
    // so that it doesn't interfere with anything 
    // else using either 'jQuery' or '$', like this: 
    /* 
     (function(){ 
      [...Insert jQuery 1.5.5 here...] 
      var target = $("#myTargetElement"); 
      target.unbind("click"); 
      target.bind("click", function(){ 
       alert("HAHA! What then??!! Its MY CLICK HANDLER NOW!!"); 
      }); 
     })(); 
    */ 
    // Otherwise, use plain JS...but using a closed scope is 
    // still a good idea, for example, this keeps 'target' from leaking out: 
    (function(){ 
     var target = document.getElementById("#myTargetElement"); 
     target.onclick = function(){ 
      alert("HAHA! What then??!! Its MY CLICK HANDLER NOW!!"); 
     }; 
    })(); 
}; 

window.location = "javascript: ("+removeClickHandler+")();"; 

記住,鉻提起這些安全措施是有原因的,所以請非常小心你如何使用這個。

0

感謝您的想法傢伙。我嘗試了這兩種解決方案,如果不是我正在處理的Web應用(GMail)的複雜性,他們可能會工作。我很難確定默認點擊處理程序的輸入是什麼(並且因此如何重新創建它們)。

相反,我用這個解決方案去(這是不完美的,但它能夠完成任務):

  1. 在頁面加載我隱藏現有的按鈕,並添加自己的,而不是
  2. 當用戶點擊我的按鈕我執行我的動作,然後隱藏我的按鈕,然後顯示默認按鈕
  3. 我在受影響的字段上偵聽onFocus事件。如果用戶就返回到我已經處理過之後我撤消我的加工領域,再次顯示我的按鈕,隱藏的默認按鈕
  4. 重複步驟2-3,根據需要

最終的結果是,用戶需要點擊按鈕兩次,一次「準備」和一次「發送」。

如果任何人有任何運氣獲得任何其他解決方案的工作(在GMail發送按鈕)讓我知道,我會更新選定的答案。

相關問題