2016-04-19 80 views
0

似乎無法在JavaScript中模擬右鍵單擊。如何右鍵單擊javascript

我曾試圖就在這樣一個iframe單擊某個元素(段):

HTML

<button onclick="popup_context_menu_in_iframe()"> 
    popup menu 
</button> 
<br/><br/> 
<iframe srcdoc="<p>Hello world!</p>"> 
</iframe> 

腳本

function popup_context_menu_in_iframe() 
{ 
    var $element = $('iframe').contents().find('p');  
    var element = $element.get(0); 

    if (window.CustomEvent) { 
    element.dispatchEvent(new CustomEvent('contextmenu')); 
    } else if (document.createEvent) { 
    var ev = document.createEvent('HTMLEvents'); 
    ev.initEvent('contextmenu', true, false); 
    element.dispatchEvent(ev); 
    } else { // Internet Explorer 
    element.fireEvent('oncontextmenu'); 
    } 
} 

https://jsfiddle.net/sca60d64/2/

現在看來似乎實際上不可能使上下文菜單出現,所以我需要fi nd其他方式。

我首先要創建一個擴展的chrome來爲窗口對象添加一個函數,這個函數可以從任何使用額外功能的腳本中調用。

但是,鉻擴展令人驚訝似乎沒有提供一種在窗口對象中創建函數的方法。我沒有看過它是否讓我有能力彈出上下文菜單。

在放棄之前,我沒有對Chrome擴展做過很多實驗。

所以我需要另一種解決方案。

如果一個解決方案只適用於谷歌瀏覽器,或者如果不能保證它會在下一個版本中停止工作,那並不重要。

我應該鉤一個DLL的鉻進程?是嗎?

+0

這是可能的:http://stackoverflow.com/questions/7914684/trigger-right-click-using-pure-javascript – wf4

+0

似乎這是不可能做到這一點在我的iframe的例子,這個問題已編輯。 –

回答

1

這應該與此標記工作:

<div id="mything"> 
Howdy this is my thing 
</div> 

事件處理程序:(默認禁用)

var el=document.getElementById("mything"); 
el.addEventListener('contextmenu', function(ev) { 
    ev.preventDefault(); 
    alert('success!'); 
    return false; 
}, false); 

然後,當你執行這個 「sucess!」警報後跟文本更改爲「你好,這是我的事,這是取消」:

編輯事件處理程序:(不要禁用默認)

var el=document.getElementById("mything"); 
el.addEventListener('contextmenu', function(ev) { 
    ev.preventDefault(); 
    alert('success!'); 
    return true; 
}, true); 

然後,當您執行這一點,「 sucess!「警報後跟文本更改爲 」你好,這是我的事,這是不是取消「:

function simulateRightClick() { 
    var event = new MouseEvent('contextmenu', { 
    'view': window, 
    'bubbles': true, 
    'cancelable': true 
    }); 
    var cb = document.getElementById('mything'); 
    var canceled = !cb.dispatchEvent(event); 
    var cbtext = cb.textContent; 
    if (canceled) { 
    // A handler called preventDefault. 
    console.log("canceled"); 

    cb.textContent = cbtext + "this is canceled"; 
    } else { 
    // None of the handlers called preventDefault. 
    cb.textContent = cbtext + "this is NOT canceled"; 
    console.log("not canceled"); 
    } 
} 
simulateRightClick(); 

測試它在這裏:https://jsfiddle.net/MarkSchultheiss/bp29s0j4/

編輯:替代選擇:

var fcb = document.getElementById('myframe').contentWindow.document.getElementById('pid'); 
fcb.addEventListener('contextmenu', function(ev) { 
    ev.preventDefault(); 
    alert('successFrame!'); 
    return false; 
}, false); 

給定此標記:

<iframe id='myframe' srcdoc="<p id='pid'>Hello world!</p>"> 
</iframe> 
+0

對不起,這個問題不是關於如何禁用上下文菜單。我改變了標題。 –

+0

當你觸發該事件時,你做什麼取決於你。如果您不想禁用,請返回true,請記住默認菜單不會從腳本中出現(不可能)。 –

+0

我想模擬右鍵單擊事件,沒有收到它。 –

1

你可以通過本地消息傳遞,通過chrome擴展中的exe文件調用dll。我在這個答案中提供了本地消息傳遞過程的示例: See the answer of this question

我希望能夠有用。

+0

我想在沒有網頁腳本協作的情況下做到這一點。 –