javascript - 输入类型 "date"不可编辑

标签 javascript google-chrome google-chrome-extension

当我创建上下文类型为 "editable" 的上下文菜单项时,当在 <input> 上打开上下文菜单时,它会显示标签。

chrome.contextMenus.create({
    ...
    contexts: ["editable"]
    ...
});

<input> 时它起作用。是一个普通的文本框,但是当它具有诸如 date 之类的类型时或time ,菜单不再显示:

<input type="date">    <!-- Nope -->

为什么会这样?有没有办法让它出现(仅在可编辑元素上,包括不同类型的 <input> )?

最佳答案

根据source code只有非只读、非禁用的文本输入元素是“可编辑”

解决方案:动态更改上下文菜单项的上下文

使用鼠标/键盘事件处理程序为所有/指定的 URL 声明内容脚本,该事件处理程序检查焦点元素并向后台脚本发送消息到 update上下文菜单项的context相应地变为“page”“editable”

  • manifest.json:

    "permissions": ["contextMenus"],
    "content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["content.js"],
        "run_at": "document_start"
    }],
    "background": {
        "scripts": ["background.js"],
        "persistent": false
    },
    
  • content.js:

    window.addEventListener('mousedown', toggleContextMenu);
    window.addEventListener('keydown', toggleContextMenu);
    
    function toggleContextMenu(e) {
    
        if (e.button == 2 ||
            // "Apps Menu" key
            e.keyCode == 93 && !e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {
    
            var tag = e.target.localName;
            var type = e.target.type;
    
            var forceMenu =
                tag == 'input' && /^(date|time|month|color)$/.test(type) ||
                tag == 'select';
    
            chrome.runtime.sendMessage(forceMenu ? 'page' : 'editable');
        }
    }
    
  • 背景.js:

    chrome.contextMenus.create({
        id: 'hello',
        title: 'Hello',
        contexts: ['editable']
    }, function() {
        var ignoreErrors = chrome.runtime.lastError;
    });
    
    chrome.contextMenus.onClicked.addListener(function(info, tab) {
        if (info.menuItemId == 'hello') {
            console.log('Hello');
        }
    });
    
    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
        chrome.contextMenus.update('hello', {contexts: [msg]});
    });
    

关于javascript - 输入类型 "date"不可编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676487/

相关文章:

javascript - 在特定 View 的情况下隐藏部分按钮

google-chrome - html 文件上传控件不会在 Chrome 中上传文件

javascript - 后台脚本加载多次

javascript - 努力在 Chrome 扩展中获取 DOM 数据

javascript - 非常简单的 Chrome 扩展来显示警报

javascript - 在 ngAfterViewInit 中使用销毁 View 进行 changeDetection

javascript - 可以在 TS 中将 undefined 强制转换为 void 吗?

javascript - Jquery Modal 显示但阻止了该网站

c# - Selenium 的 Chrome 驱动程序卡在 bet365 网站上的灰色屏幕

css - 对具有 overflow hidden 和边界半径的父项的子项进行动画变换