亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 JavaScript 打開錨上下文菜單?

如何使用 JavaScript 打開錨上下文菜單?

MMMHUHU 2023-04-27 15:10:15
我正在嘗試僅使用 JavaScript 打開錨點上下文菜單,例如對于此 HTML:<html>  <head></head>  <body>    <a href="https://stackoverflow.com" id="anchor-el"> Anchor </a>  </body></html>我想僅使用 JavaScript 打開帶有本機“在鏈接新選項卡中打開”和“在新窗口中打開鏈接”選項的上下文菜單。到目前為止我已經試過了,它似乎成功地contextmenu向錨點發送了一個事件,但上下文菜單實際上并沒有顯示......document.getElementById('anchor-el').dispatchEvent(new MouseEvent('contextmenu', { bubbles: true }))
查看完整描述

5 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

根據我對你的問題的理解,你希望用結果“替換”正常的click事件結果contextmenu......但是只有那個上下文菜單的前兩個項目。


這使它成為您必須定義的自定義菜單。所以這里有一些東西......


let contextElements = document.querySelectorAll(".context-anchor")

let myContext = document.querySelector(".context")

let contextItems = document.querySelectorAll(".context-item")

let contextHref


// To add event a listener on each .context-anchor element in order to show a "simulated context menu"

contextElements.forEach(function(ce){

? ce.addEventListener("click", function(e){

? ? e.preventDefault()

? ??

? ? // Get the click coord to open the context menu at the right place

? ? let clickCoords = {x: e.pageX, y: e.pageY}

? ? // Get the href of the clicked link

? ? contextHref = ce.href

? ??

? ? // Create a mouse event

? ? let event = document.createEvent('MouseEvents');

? ? event.initEvent('mycontextmenu', false, true);

? ??

? ? // Be ready to handle it

? ? this.addEventListener('mycontextmenu', function (e) {

? ? ? myContext.style.top = clickCoords.y

? ? ? myContext.style.left = clickCoords.x

? ? ? myContext.style.display= "block"

? ? }, false);

? ??

? ? // Dispatch it

? ? this.dispatchEvent(event);

? })

})


// Listener for the options of that "simulated context menu"

contextItems.forEach(function(ci){

? ci.addEventListener("click", function(e){

? ? if(this.getAttribute("data-destination") === "tab"){

? ? ? window.open(contextHref,"_blank")

? ? }else{

? ? ? window.open(contextHref,"custom",`width=${0.99*screen.width},height=${0.94*screen.height}`)

? ? }

? })

})


// To hide the "simulated context menu" when there is a click anywhere else than on a .context-anchor element

document.addEventListener("click", function(e){

? if(myContext.style.display==="block" && e.target.classList.toString().split(" ").indexOf("context-anchor")<0){

? ? myContext.style.display= "none"

? }

})

.context{

? display: none;

? position: absolute;

? top: 0;

? left: 0;

? border: 1px solid lightgrey;

? background: white;

? margin: 1em;

? box-shadow: 2px 2px 2px grey;

? min-width: 15em;

}


.context-item{

? font-family: "arial";

? padding: 0.5em 2em;

}


.context-item:hover{

? background: lightgrey;

}

<a class="context-anchor"> Anchor </a><br>

<br>

<a > Normal anchor </a>


<!-- The simulated context menu -->

<div class="context">

? <div class="context-item" data-destination="tab">Open link in a new tab</div>

? <div class="context-item" data-destination="window">Open link in a new window</div>

</div>

注意window.open由于明顯的原因在 SO 片段中被阻止。

這絕對是很多代碼來創建一個奇怪和不常見的瀏覽器行為。所以我不會推薦任何人使用它。




查看完整回答
反對 回復 2023-04-27
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

如果您想在菜單中打開“在新標簽頁中打開”和“在新窗口中打開”選項,為什么只使用 HTML?


<html>

  <head></head>

  <body>

    <a href="https://stackoverflow.com" id="anchor-el" target="_blank" title="If you run this snippet and click on this link, it won't work because you need to run it in your own editor"> Anchor </a>

  </body>

</html>


每當單擊時,上面的代碼將在新選項卡中打開。右鍵單擊時,還會有一個在新選項卡中打開和在新窗口中打開的選項。


“target”屬性指定鏈接將在何處打開;下面是一些例子:


target="_blank" - "Opens in new tab"

target="_self" - "Opens in the same tab"

target="_parent" - "Opens in the parent frame"

target="_top" - "Opens in the full body of the window"


查看完整回答
反對 回復 2023-04-27
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

如果我理解正確的話,你必須創建一個自定義的contextmenu. 所以這是一個例子。


const menu = document.querySelector('[data-id=anchor-el]')

const anchor = document.getElementById('anchor-el');


anchor.addEventListener('contextmenu', e => {

  e.preventDefault();

  menu.style.top = e.pageX;

  menu.style.top = e.pageY;

  menu.style.display = 'block';

});


menu.querySelector('li#newTab').addEventListener('click', (evt) => {

  evt.preventDefault();

  console.log('clicked open in new tab');

  window.open(anchor.href);

});

menu.querySelector('li#newWin').addEventListener('click', (evt) => {

  evt.preventDefault();

  console.log('clicked open in new window');

  window.open(anchor.href, '_blank', 'toolbar=0,location=0,menubar=0');

});


document.body.addEventListener('click', (evt) => {

  evt.preventDefault();

  evt.stopPropagation();

  menu.style.display = 'none';

});

[data-id="anchor-el"] {

  width: 15rem;

  display: flex;

  margin: 0;

  padding: 0;

  align-items: stretch;

  align-content: space-evenly;

  flex-direction: column;

  justify-content: space-evenly;

  box-shadow: 0 0.25rem 0.325rem 0.175rem rgba(0, 0, 0, 0.2);

  position: relative;

  display: none;

}


[data-id="anchor-el"] ul li {

  width: 100%;

  list-style: none;

  margin: 0;

  padding: 0.5rem;

  position: relative;

  color: #000;

  font-weight: 500;

  font-size: 1rem;

  cursor: pointer;

}


[data-id="anchor-el"] ul li:hover {

  color: #f00;

}

<a href="https://stackoverflow.com" id="anchor-el"> Anchor </a>


<div>


  <div type="context" data-id="anchor-el">

    <ul>

      <li label="Open in new tab" id="newTab">Open in new tab</li>

      <li label="Open in new window" id="newWin">Open in new window</li>

    </ul>

  </div>


</div>


查看完整回答
反對 回復 2023-04-27
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

document.getElementById("anchor-el").addEventListener("click", function() {

    var link = document.getElementById('anchor-el').getAttribute("href");

    window.open(link,'_blank');

});


查看完整回答
反對 回復 2023-04-27
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

打開本機系統上下文菜單,例如默認的右鍵單擊上下文菜單是不可能的。

您當然可以使用 jQuery 創建自己的上下文菜單,例如:

https://swisnl.github.io/jQuery-contextMenu/


作為如何使用庫的示例:

 $(function() {

        $.contextMenu({

            selector: '#example', 

            trigger: 'left',

            callback: function(key, options) {

                var m = "clicked: " + key;

                window.console && console.log(m) || alert(m); 

            },

            items: {

                "edit": {name: "Edit", icon: "edit"},

                "cut": {name: "Cut", icon: "cut"},

               copy: {name: "Copy", icon: "copy"},

                "paste": {name: "Paste", icon: "paste"},

                "delete": {name: "Delete", icon: "delete"},

                "sep1": "---------",

                "quit": {name: "Quit", icon: function(){

                    return 'context-menu-icon context-menu-icon-quit';

                }}

            }

        });

        

        /* prevent the default switching to the target site */

        $("#example").on("click", function(event) { 

            event.preventDefault(); 

        });

    });

<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.7.1/jquery.contextMenu.min.css" rel="stylesheet"/>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.7.1/jquery.contextMenu.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.7.1/jquery.ui.position.js"></script>


<a href="https://google.com" id="example">click me</a>


查看完整回答
反對 回復 2023-04-27
  • 5 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號